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

Mak*_*nix 0 assembly

我试图"outb"到一个端口,但我一直得到:操作数类型不匹配'out'

这是代码:

outb  %al, %bl
Run Code Online (Sandbox Code Playgroud)

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

如果我硬编码端口号,那么代码可以工作.

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

以下代码似乎适用于C,但我不明白为什么以及如何:

asm volatile ( "outb %0, %w1" : : "a"(val), "Nd"(port) );
Run Code Online (Sandbox Code Playgroud)

谢谢

dus*_*uff 8

outb指令编码数量有限.只有六种编码是:

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

outb %dx, %al
outb %dx, %ax
outb %dx, %eax
Run Code Online (Sandbox Code Playgroud)

此指令不能使用其他寄存器.端口必须在%dx或指定为立即值,并且该值必须为in %eax或其较小的亲属之一.(在这个意义上,它是有点类似mul,idiv和移位指令,在一些操作数的只能在一个特定的寄存器.)

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

  • @Makketronix端口实际上是16位!例如,第一个串行端口使用端口0x3f8到0x3ff. (2认同)