这篇文章主要介绍了asm基础——汇编指令之in/out指令,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
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寄存器中,不能是其他寄存器。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程学习网。
织梦狗教程
本文标题为:asm基础——汇编指令之in/out指令


基础教程推荐
猜你喜欢
- Ruby3多线程并行Ractor使用方法详解 2023-07-23
- R语言绘制折线图实例分析 2022-11-21
- Swift中重写和重载的使用与对比总结 2023-07-05
- ruby-on-rails-为使用Rails 4,nginx和乘客的用户设置自定义域 2023-09-21
- 浅析ELF转二进制允许把 Binary 文件加载到任意位置 2023-07-06
- R语言-修改(替换)因子变量的元素操作 2022-11-26
- ruby on rails validates 2023-09-22
- win10下使用virtualbox + vagrant配置ruby开发机环境 2023-07-23
- R语言 ggplot2改变柱状图的顺序操作 2022-11-17
- Swift初始化器与可选链的使用方法介绍 2023-07-08