[英]Understanding input/output operands in GCC inline assembly syntax
由于写我的操作系统的一部分,我在执行中断处理和I / O功能, inb
和outb
。
我必须学习在GCC中编写内联汇编并在线阅读很多内容。 根据我的理解,我编写了自己的代码。 同时,我从/usr/include/sys/io.h
查找了Linux的函数实现。 这就是outb
:
static __inline void
outb (unsigned char __value, unsigned short int __port)
{
__asm__ __volatile__ ("outb %b0,%w1": :"a" (__value), "Nd" (__port));
}
这是我的问题:
无符号8位整数常量(用于输入和输出指令)。
但是这里__port
是unsigned short int
,我认为它是16位。 那么如何确定16位的哪一部分用于内联汇编?
这是我对其工作原理的理解 - __port
值将直接用于(因为“N”)作为常量来代替%w1。 __value
值被复制到eax
。 %bo由%al替换。 然后执行指令。 它是否正确 ?
如何决定将哪个“N”或“d”用于第二个操作数? 有一些偏好顺序吗?
如果我不使用“N”,会有什么不同? 不会简单地使用“d”更好,因为这是16位?
如果我省略了“N”,那么将__port
值复制到edx
然后将%w1替换为edx
是否正确?
我可能错了,但我的理解是"Nd"
意味着在编译器的偏好下使用N
或d
。 如果该值不知道是一个适合8位的常量,那么N
是不可满足的,因此编译器别无选择,只能使用d
。 但是当该值是编译时常量并且其值适合8位时,使用8位立即数比浪费寄存器更可取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.