为什么 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 位寄存器。
根据我的理解,%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)
永远不是有效的