7c6f: ec in (%dx),%al
這里我的懷疑是由于 ()
我撰寫代碼的許多地方都將其用作內部的值(%dx)并將其用作記憶體位置和位于所需值的值。
但在這里它應該做的只是in %dx,%al; 和 %dx 持有埠號 就像in 0x000,al
uj5u.com熱心網友回復:
in %dx, %al匯編成相同0xEC位元組的機器碼,objdump -d反匯編in (%dx),%al成你發現的那樣。
llvm-objdump -d確實使用了您期望的語法:inb %dx, %al;inb $128, %al
AT&T 語法在/中使用(%dx)IO 埠號 具有誤導性,因為它不是正常的尋址模式;DX是唯一的選擇。大概AT&T 語法的設計者想要表示您正在讀取或寫入 I/O 地址空間的事實。但是他們做得不好,因為這與他們使用直接埠號不一致(與使用與絕對記憶體地址相同的語法的埠號相反)。GAS 和 LLVM 甚至不接受,所以不,不是“就像”。inoutin $0x80, %al0x80in 0x80, %alin 0x000,al
in/指令訪問 IO 空間,而out不是記憶體地址空間。
IO 空間中的“地址”稱為埠號。
IO 空間在現代 PCI-express 中仍然是一個東西,但大多數現代設備在設備記憶體區域中只有 MMIO 暫存器,而不是 IO 埠,因為 IO 埠訪問速度較慢。
objdump -drwC -Mintel反匯編為英特爾在其手動條目中使用的唯一語法,該語法in具有 DX 中的埠和位元組運算元大小。注意沒有[dx]括號。
0: ec in al,dx
1: e4 80 in al,0x80
(%dx)不是有效的 16 位尋址模式之一,因此特定的尋址模式永遠不會對任何其他指令有效。但是是的,(%reg)例如(
