assembly - 汇编中的异或语句

标签 assembly gdb x86-64

我试图理解这个程序的反汇编版本:

#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 汇编器中的单字节操作码,而不是 x86 汇编器中的单字节操作码。 mov al, 0 为 2 个字节。

关于assembly - 汇编中的异或语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11954331/

相关文章:

c - x86 程序集中出现奇怪的段错误

language-agnostic - 语言翻译器 : Anything to Assembly

c - 寻找GCD的汇编语言程序—— float 异常

python - 在 python gdb 脚本中索引 c++ vector

qt - GDB MI 接口(interface)解析器

exception - 操作系统开发 : How to avoid an infinite loop after an exception routine

linux - 可以连接到 gdbserver 的图形调试器

c - 为什么 GCC 在堆栈上分配的空间超出了必要的空间,超出了对齐所需的空间?

c - 如何将优化的 x86-64 asm 循环转换回 C for 循环?

assembly - Piledriver 架构中有哪些指令集不在 Bulldozer 中?