2015-09-07 73 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指定的端口的唯一三种编码是:_。我通过澄清当端口号在寄存器 –

相关问题