内嵌汇编
以后我们要和一些端口打交道,端口0xCF8是PCI的地址寄存器IO地址,端口0xCFC是PCI的数据寄存器IO地址,还有网卡端口。
要执行写入端口和从端口读出操作,在汇编中是这样实现的:
mov al,0x02
in 0xcf8,al
Linux下c语言内嵌汇编格式:
__asm__("<asm routine>" : output : input : modify);
output要用“=”开头
__asm__ 表示后面的代码为内嵌汇编,
寄存器前缀为%
寄存器缩写约定
a %eax/%ax/%al
d %edx/%dx/%dl
C语言是这样子:
unsignedchar readb(unsignedshort p ) //读字节8位
{
unsignedchar result ;
__asm__("in %%dx , %%al":"=a"( result ):"d"( p ));
return result ;
}
"result"前面的限制字符串是"=a",其中"="表示"result"是输出操作数,"a" 表示需要将"result"与ax(al)寄存器相关联,指令执行完后需要将寄存器中的值存入变量"result","d"( p )表示dx=p