【问题标题】:XOR statement in assembly [duplicate]汇编中的 XOR 语句[重复]
【发布时间】:2012-08-10 20:44:56
【问题描述】:

我正在尝试理解这个程序的反汇编版本:

#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 行有什么作用?

【问题讨论】:

标签: assembly gdb x86-64


【解决方案1】:

xor al,al 是一种快速清零寄存器的方法。它是 x86 汇编器中的单字节操作码,v.s. mov al, 0 2 个字节。

【讨论】:

  • 所以 AL 是累加器寄存器的低位,但为什么会被清零?
  • 不知道。可能是int = 0。尽管 i 实际上并没有在这个简单程序的其他任何地方使用,但它应该已经被优化掉了。
  • 它表示 printf 应该期望的值的数量。见Why is EAX zeroed before a call to printf
  • 感谢 Bo Persson,这解释了很多...现在我只需要了解向量寄存器
  • 我发现更令人惊讶的是al,而不是eax,被设置为零。在任何一种情况下都是两个字节,30 C031 C0,而xor al, al 对我来说似乎既慢(依赖)又有点危险(如果 printf 不仅仅查看低字节怎么办?)。
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
相关资源
最近更新 更多