我正在尝试" outb"到一个端口,但我不断得到:'out'
的操作数类型不匹配以下是代码:
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
,或者其中一个较小的亲戚。 (在这个意义上,它有点类似于mul
,idiv
和移位指令,因为一些操作数只能在一个特定的寄存器中。)
参考:http://x86.renejeschke.de/html/file_module_x86_id_222.html