作为编写操作系统的一部分,我正在实现中断处理和I/O函数
我不得不学习在GCC中编写内联汇编,并在线上阅读了很多相关资料。根据我的理解,我编写了自己的代码。同时,我查阅了Linux在
这是我的问题:
GCC手册说“N”是
无符号8位整数常量(用于in和out指令)。
但是这里的__port是unsigned short int,我认为应该是16位。那么如何决定使用16位中的哪一部分作为内联汇编代码的参数?
以下是我的工作原理:__port的值将直接用作%w1的常量(因为有“N”)。 __value的值复制到eax中。%bo被替换为%al。然后执行指令。这样正确吗?
如何决定使用第二个操作数的“N”或“d”? 是否有某种偏好顺序?
如果我不使用“N”,会有什么区别?不仅仅使用“d”是否更好,因为它是16位?
如果我省略了“N”,那么__port的值是否正确复制到edx中,然后将%w1替换为edx?
inb
和outb
。我不得不学习在GCC中编写内联汇编,并在线上阅读了很多相关资料。根据我的理解,我编写了自己的代码。同时,我查阅了Linux在
/usr/include/sys/io.h
中对这些函数的实现。下面是outb
的代码:static __inline void
outb (unsigned char __value, unsigned short int __port)
{
__asm__ __volatile__ ("outb %b0,%w1": :"a" (__value), "Nd" (__port));
}
这是我的问题:
GCC手册说“N”是
无符号8位整数常量(用于in和out指令)。
但是这里的__port是unsigned short int,我认为应该是16位。那么如何决定使用16位中的哪一部分作为内联汇编代码的参数?
以下是我的工作原理:__port的值将直接用作%w1的常量(因为有“N”)。 __value的值复制到eax中。%bo被替换为%al。然后执行指令。这样正确吗?
如何决定使用第二个操作数的“N”或“d”? 是否有某种偏好顺序?
如果我不使用“N”,会有什么区别?不仅仅使用“d”是否更好,因为它是16位?
如果我省略了“N”,那么__port的值是否正确复制到edx中,然后将%w1替换为edx?