#include <stdio.h>
int main(){
char *my[2];my[0] = “/bin/sh”;my[1] = NULL;
execve (my[0], my, NULL );}
GDB输出:080481d0 <main>:
80481d0: 55 push %ebp
80481d1: 89 e5 mov %esp,%ebp
80481d3: 83 ec 08 sub $0x8,%esp
80481d6: 83 e4 f0 and $0xfffffff0,%esp
80481d9: b8 00 00 00 00 mov $0x0,%eax
80481de: 29 c4 sub %eax,%esp
......
80481fa: e8 f1 57 00 00 call 804d9f0 <__execve>
80481ff: 83 c4 10 add $0x10,%esp
8048202: c9 leave
8048203: c3 ret
0804d9f0 <__execve>:
804d9f0: 55 push %ebp
804d9f1: b8 00 00 00 00 mov $0x0,%eax
804d9f6: 89 e5 mov %esp,%ebp
804d9f8: 85 c0 test %eax,%eax
804d9fa: 57 push %edi
804d9fb: 53 push %ebx
804d9fc: 8b 7d 08 mov 0x8(%ebp),%edi
804d9ff: 74 05 je 804da06 <__execve+0x16>
804da01: e8 fa 25 fb f7 call 0 <_init-0x80480b4>
804da06: 8b 4d 0c mov 0xc(%ebp),%ecx
804da09: 8b 55 10 mov 0x10(%ebp),%edx
804da0c: 53 push %ebx
804da0d: 89 fb mov %edi,%ebx
804da0f: b8 0b 00 00 00 mov $0xb,%eax
804da14: cd 80 int $0x80
804da16: 5b pop %ebx
804da17: 3d 00 f0 ff ff cmp $0xfffff000,%eax
804da1c: 89 c3 mov %eax,%ebx
804da1e: 77 06 ja 804da26 <__execve+0x36>
804da20: 89 d8 mov %ebx,%eax
804da22: 5b pop %ebx
804da23: 5f pop %edi
804da24: c9 leave
804da25: c3 ret
804da26: f7 db neg %ebx
804da28: e8 cf ab ff ff call 80485fc <__errno_location>
...
请问 这几句代码 是做什么的
80481d6: 83 e4 f0 and $0xfffffff0,%esp
804da17: 3d 00 f0 ff ff cmp $0xfffff000,%eax
neg %ebx
4字节对齐?怎么不用nop之类的语句
我知道是比较,但它的作用是?
比如,开头那句sub exp..是分配栈空间
cmp $0xfffff000,%eax 将fffff000减去eax,但只改变标志位,而不影响两个数的大小,一般CMP指令后面会跟一个跳转指令,也可以说CMP指令是比较指令
neg %ebx 求EBX相反数的补码
nop指令的机器码是90,也就是空指令,不起作用的,sub $0x8,%esp这条指令是用于平衡堆栈的,如楼上所说,你可以当它是空气..有些汇编代码不用刻意去看懂,扫一眼知道是干什么用的就行了,有的就得仔细推敲它的含意和它起的作用
这一句是进行4字节对齐的,上一句sub esp... 是分配局部变量空间,其大小可能不是整4字节的,那样就会导致后面分配的变量以非4字节对齐的地址存放,导致性能降低,有这一句就好了。你可以当它是空气,不用管。
cmp $0xfffff000,%eax
这个是比较EAX的值是不是0xFFFFF000并置相应标志