【问题标题】:Assembly 64bit - movl, movq. Interchanging is okay?程序集 64 位 - movl、movq。互换好不好?
【发布时间】:2015-02-17 09:10:17
【问题描述】:

上下文:

在 64 位 Linux 上学习 GAS 组装。 许多教程都是针对 32 位汇编的。

很难通过 x86_64 汇编。

问题:

当我用 gcc 编译一个 c 程序时,我仍然看到一些 %eax 和 movl。

我主要玩int32_t。

但我认为一个必须在x86_64(如rax、rbx等)上使用64位指令。

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

谢谢

【问题讨论】:

    标签: assembly 64-bit x86-64 gnu-assembler instructions


    【解决方案1】:

    您可以在 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 位指令的一个原因是它们的机器代码更短。

    【讨论】:

    • 谢谢!因此,当 gcc 仅指向 32 位值时,使用 (%rbx) 时可能会出错,对吧?应该是 (%ebx)。是否应该理解 gcc 在这方面可以改进?
    • 那是另一回事,那就是指针间接。指针的大小与所指向的项目的大小无关。 movb (%rbx), %al 完全有效,意味着取消引用 rbx 中的 64 位指针,并从该地址获取一个字节到 al。除非您确定前 32 位为零,否则 64 位代码中的指针应为 64 位。
    • 啊,是的,我的错!这对我来说还不自然,但肯定会到来 :) 谢谢小丑
    猜你喜欢
    • 2013-11-04
    • 2011-02-12
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多