汇编 64 位 - movl、movq。互换好吗?
Assembly 64bit - movl, movq. Interchanging is okay?
上下文:
学习 64 位 GAS 汇编 linux。
许多教程都是针对 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 [=10=]xffffffffffffffff, %rax
movb [=10=], %al # rax = 0xffffffffffffff00
movw [=10=], %ax # rax = 0xffffffffffff0000
movl [=10=], %eax # rax = 0x0000000000000000
使用 32 位指令的一个原因是它们的机器代码更短。
上下文:
学习 64 位 GAS 汇编 linux。 许多教程都是针对 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 [=10=]xffffffffffffffff, %rax
movb [=10=], %al # rax = 0xffffffffffffff00
movw [=10=], %ax # rax = 0xffffffffffff0000
movl [=10=], %eax # rax = 0x0000000000000000
使用 32 位指令的一个原因是它们的机器代码更短。