【问题标题】:Why there is no parentheses wrapping around AL register?为什么 AL 寄存器周围没有括号?
【发布时间】:2019-09-28 14:40:32
【问题描述】:

根据我的理解,%eax表示eax包含的值,(%eax)表示转到eax保留的地址

seta20.1:
inb $0x64, %al        # Wait for not busy
testb $0x2, %al
jnz seta20.1
movb $0xd1,%al        # 0xd1 −> port 0x64
outb %al, $0x64

那么,为什么 %al 周围没有括号呢? 因为如果我想通过使用寄存器将 val 移动到地址,我应该这样做:

mov %ebx, (%eax)

对吗?

【问题讨论】:

  • 不清楚你指的是哪一行代码。但在这段代码中,al 没有被用作地址,因此没有括号。

标签: assembly x86 att


【解决方案1】:

inb 基本上是从 IO 空间加载到%al。所以类比是mov (%edx), %al

%al 是源 (out) 或目标 (in) 寄存器,而不是指针,所以%al 周围当然不会有括号。

如果要在任何地方使用括号,它将围绕 IO 空间地址,例如(%dx)。或0x64()

inb / outb 不使用普通寻址模式,它们使用立即数或%dx 作为 IO 空间地址。因此 AT&T 语法在 outb 目标或 inb 源中为它们使用立即或寄存器语法。 IO 空间是特殊的,不能像内存一样被寻址。


objdump -d 的 AT&T 反汇编奇怪地使用 (%dx) 作为非立即形式的端口号,但 GAS 在输入时接受 %dx(%dx) handy for inline asm

当然,两者都汇编成相同的机器码;使用 DX 的指令只有一种形式,字节操作数大小为:https://www.felixcloutier.com/x86/in

   0:   ec                      in     (%dx),%al

llvm-objdump -d 使用 inb %dx, %al

(%dx) 永远不是有效的memory addressing mode:它是一个 16 位寄存器,而不是 BX、BP、SI 或 DI。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-01
    • 2012-05-09
    • 2016-06-04
    • 2021-12-13
    • 2016-04-21
    • 2015-11-01
    • 2019-03-29
    • 2015-08-27
    相关资源
    最近更新 更多