x86中的io端口访问
汇编是直接面向硬件的,它可以访问系统的mem空间,也可以直接访问系统的io空间。
汇编中使用in/out来访问系统的io空间。
in
从端口输入
|
of |
df |
if |
sf |
zf |
af |
pf |
cf |
说明:从端口输入一个字节或字到al或ax中(ia-32处理器上可以输入一个双字到eax)。源操作数是端口地址,可以是8位的常量或者dx中的一个16位地址。
指令格式:
in accum, imm (应该不需要是8位,可以是16位,比如3f8h) in accum, dx
下面是一个例子,对in做了一层包装:
uint8
ioread8 (
in uintn port
)
{
uint8 data;
__asm {
mov dx, word ptr [port]
in al, dx
mov data, al
}
return data;
}
out
输出到端口。
|
of |
df |
if |
sf |
zf |
af |
pf |
cf |
说明:将累加器中的一个字节或字输出到端口(ia-32处理器上可以向端口输出一个双字)。端口地址如果在范围0-ffh之间,可以是一个常量,也可以在dx中存放0-ffffh之间的端口地址。
指令格式:
out imm8, accum(应该不需要是8位,可以是16位,比如3f8h) out dx, accum
下面是一个例子,对out做了一层包装:
uint8
iowrite8 (
in uintn port,
in uint8 value
)
{
__asm {
mov al, byte ptr [value]
mov dx, word ptr [port]
out dx, al
}
return value;
}
注意,io地址要么是立即数,要么放在dx寄存器中;而数据也都放在al/ax/eax寄存器中,不能是其他寄存器。
以上就是本文的全部内容,希望对大家的学习有所帮助,
王权利