我试图"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)
谢谢
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