根据我的理解,%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)
右?
inb
基本上是从IO空间到%al
的负载。因此比喻为mov (%edx), %al
。
[%al
是源或目标寄存器,而不是指针,因此,%al
周围绝对不会有括号。
如果要在任何地方设置parens,它将位于IO空间地址附近,例如(%dx)
。或0x64()
。
但是inb
/ outb
不使用普通的寻址模式,它们使用IO空间地址的立即数或%dx
。因此,AT&T语法在outb目标或inb源中对其使用立即或注册语法。 IO空间是特殊的,不能以与内存相同的方式进行寻址。