为什么 AL 寄存器周围没有括号?

Why there is no parentheses wrapping around AL register?

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

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

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

mov %ebx, (%eax)

对吗?

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

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

如果任何地方都有括号,它将围绕 IO space 地址,例如(%dx)。或者 0x64().

但是inb / outb 不使用正常的寻址模式,它们使用立即数或%dx 作为IO-space 地址。因此 AT&T 语法在 outb 目标或 inb 源中为它们使用立即或注册语法。 IOspace比较特殊,不能像内存一样寻址。


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

并且 assemble 当然是同一个机器码;只有一种使用 DX 的指令形式,字节操作数大小:https://www.felixcloutier.com/x86/in.

   0:   ec                      in     (%dx),%al

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

(%dx) 永远不是有效的 :它是除 BX、BP、SI 或 DI 之外的 16 位寄存器。