在AT& T汇编语法中使用outb输出到通用端口:获取操作数err​​oratch

时间:2015-09-07 02:18:04

标签: assembly

我正在尝试" outb"到一个端口,但我不断得到:'out'

的操作数类型不匹配

以下是代码:

outb  %al, %bl

如果我用任何8位寄存器(%ah,%bh,%bl,...)替换%bl,我仍会得到同样的错误。

如果我硬编码端口号,则代码可以正常工作。

如何编写通用方式(在汇编中)来写入作为参数传递的端口?

以下代码似乎在C中有效,但我真的不明白为什么以及如何:

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

谢谢

1 个答案:

答案 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