汇编 64 位 - movl、movq。互换好吗?

Assembly 64bit - movl, movq. Interchanging is okay?

上下文:

学习 64 位 GAS 汇编 linux。 许多教程都是针对 32 位汇编的。

很难通过 x86_64 组装。

问题:

当我用gcc编译c程序时,我仍然看到一些%eaxmovl

我主要玩int32_t

但我认为 必须x86_64 上使用 64 位指令(如 raxrbx 等) .

不是很懂。他们不应该是 %raxmovq 吗? 在我的汇编程序中,我应该使用 movq,对吧?即使是 32 位整数? 我是一个迷路的初学者。

谢谢

您可以在 64 位模式下使用 32 位寄存器和指令,就像您也可以使用 16 位或 8 位一样。要记住的一件事是,32 位指令会自动将相应 64 位寄存器的前 32 位清零,而 16 位或 8 位指令则不会:

movabsq [=10=]xffffffffffffffff, %rax
movb [=10=], %al  # rax = 0xffffffffffffff00
movw [=10=], %ax  # rax = 0xffffffffffff0000
movl [=10=], %eax # rax = 0x0000000000000000

使用 32 位指令的一个原因是它们的机器代码更短。