2015-09-07 78 views
0

我想「OUTB」的端口,但我不斷收到:數類型不匹配的'出」Outputing到通用端口使用OUTB在AT&T彙編語法:讓操作mistatch

下面是代碼:

outb %al, %bl 

如果我用任何8位寄存器(%ah,%bh,%bl,...)代替%bl,我仍然會得到相同的錯誤。

如果我硬編碼的端口號碼,那麼代碼工作。

如何寫通用方法(在彙編中)寫入到作爲參數傳遞的端口?

下面的代碼似乎在C工作,但我真的不明白爲什麼和如何:

asm volatile ("outb %0, %w1" : : "a"(val), "Nd"(port)); 

謝謝

+0

實際上,我們更喜歡像「謝謝你「不會出現在帖子的任何位置,因爲他們不會添加任何有用的信息。 –

回答

8

outb具有指令編碼的數量有限。在只有六個編碼是:

outb imm8, %al 
outb imm8, %ax 
outb imm8, %eax 

outb %dx, %al 
outb %dx, %ax 
outb %dx, %eax 

沒有其它寄存器可以用於此指令。該端口必須在%dx或指定爲立即值,並且該值必須位於%eax或其中一個較小的親屬中。 (在這個意義上,它是有點類似mulidiv和移位指令,在一些操作數的只能在一個特定的寄存器。)

參考:http://x86.renejeschke.de/html/file_module_x86_id_222.html

+0

只是爲了澄清,雖然'輸出到寄存器尋址的端口的唯一三種編碼',如果你想硬編碼你的端口號(當他使用「Nd」時OP做的),那麼還有3種替代方案(仍然使用eax的變體)。 –

+0

@DavidWohlferd正確。這個問題明確地認識到,一個固定的端口是不同的,但。 (「如果我硬編碼的端口號,然後代碼工作。」) – duskwuff

+0

@duskwuff我認爲問題是,任何人來讀這個答案會看到這個粗體**沒有其他有效的組合。如果端口號符合_imm8_(端口常數<256),還有其他組合。我知道你的意思,因爲你確實說過_輸出到由REGISTER指定的端口的唯一三種編碼是:_。我通過澄清當端口號在寄存器 –

相關問題