上下文:
在64位linux上学习GAS汇编。许多教程都是针对32位部件的。
难以通过x86_64部件进行衬套敲击。
问题:
当我用gcc编译c程序时,我仍然会看到一些%eax
和movl
。
我主要玩int32_t
。
但我认为一个必须使用x86_64
上的64位指令(如rax
、rbx
等)。
我不太明白。它们不应该是%rax
和movq
吗?在我的汇编程序中,我应该使用movq
,对吧?即使是32位整数?我是个迷路的初学者。
感谢
您可以在64位模式中使用32位寄存器和指令,就像您也可以使用16位或8位一样。需要记住的一点是,32位指令将自动将相应64位寄存器的前32位清零,而16或8位指令则不会:
movabsq $0xffffffffffffffff, %rax
movb $0, %al # rax = 0xffffffffffffff00
movw $0, %ax # rax = 0xffffffffffff0000
movl $0, %eax # rax = 0x0000000000000000
使用32位指令的一个原因是它们是较短的机器代码。