汇编64位 - movl,movq.交换还好吗?

Lar*_*rry 1 64-bit assembly x86-64 gnu-assembler instructions

语境:

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

很难通过x86_64程序集进行丛林攻击.

题:

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

我主要玩int32_t.

但我认为必须使用64位指令x86_64(如rax,rbx等等).

我不太了解.他们不应该%raxmovq?在我的装配程序中,我应该使用movq,对吧?即使是32位整数?我是一个迷失的初学者.

谢谢

Jes*_*ter 11

您可以在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
Run Code Online (Sandbox Code Playgroud)

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

  • 那是另一回事,这是一个指针间接。指针的大小与指向的项目的大小无关。`movb (%rbx), %al` 是完全有效的,意味着取消引用 `rbx` 中的 64 位指针,并从该地址获取一个字节到 `al` 中。64 位代码中的指针应该是 64 位,除非您确定前 32 位为零。 (3认同)