This question already has answers here:
Why is %eax zeroed before a call to printf?
(3 个回答)
5年前关闭。
我试图了解这个程序的反汇编版本:
gdb 反汇编:
如果我正确理解前 3 行,则基指针将作为返回地址推送到堆栈。然后将基指针设置为当前堆栈指针。堆栈的大小设置为 16 字节 (x10)。 int i 的大小为 12 字节 (0xc) 并设置为 0。我不确定 (xor al, al) 是做什么的。我是否正确解释了这一点? xor al, al 线有什么作用?
(3 个回答)
5年前关闭。
我试图了解这个程序的反汇编版本:
#include <stdio.h>
int main(){
int i=0;
printf("HELLO VIK");
return 0;
}
gdb 反汇编:
(gdb) disass main
Dump of assembler code for function main:
0x0000000100000ef0 <main+0>: push rbp
0x0000000100000ef1 <main+1>: mov rbp,rsp
0x0000000100000ef4 <main+4>: sub rsp,0x10
0x0000000100000ef8 <main+8>: mov DWORD PTR [rbp-0xc],0x0
0x0000000100000eff <main+15>: xor al,al
0x0000000100000f01 <main+17>: lea rcx,[rip+0x50] # 0x100000f58
0x0000000100000f08 <main+24>: mov rdi,rcx
0x0000000100000f0b <main+27>: call 0x100000f2c <dyld_stub_printf>
0x0000000100000f10 <main+32>: mov DWORD PTR [rbp-0x8],0x0
0x0000000100000f17 <main+39>: mov eax,DWORD PTR [rbp-0x8]
0x0000000100000f1a <main+42>: mov DWORD PTR [rbp-0x4],eax
0x0000000100000f1d <main+45>: mov eax,DWORD PTR [rbp-0x4]
0x0000000100000f20 <main+48>: add rsp,0x10
0x0000000100000f24 <main+52>: pop rbp
0x0000000100000f25 <main+53>: ret
如果我正确理解前 3 行,则基指针将作为返回地址推送到堆栈。然后将基指针设置为当前堆栈指针。堆栈的大小设置为 16 字节 (x10)。 int i 的大小为 12 字节 (0xc) 并设置为 0。我不确定 (xor al, al) 是做什么的。我是否正确解释了这一点? xor al, al 线有什么作用?
最佳答案
xor al,al
是一种将寄存器清零的快速方法。它是 x86 汇编器中的一字节操作码,v.s. mov al, 0
为 2 字节。
关于assembly - 汇编中的异或语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11954331/