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

时间:2019-09-28 14:40:32

标签: assembly x86 att

根据我的理解,%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)

对吗?

1 个答案:

答案 0 :(得分:1)

inb基本上是从IO空间到%al的负载。因此比喻为mov (%edx), %al

%al是源寄存器或目标寄存器,而不是指针,因此,%al周围绝对没有括号。

如果任何地方都有parens,它将在IO空间地址附近,例如(%dx)。或0x64()

但是inb / outb不使用普通的寻址模式,它们使用立即数或%dx作为IO空间地址。因此,AT&T语法在outb目标或inb源中对其使用立即或注册语法。 IO空间是特殊的,不能以与内存相同的方式寻址。