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