查看: 51|回复: 0

[教程] asm基础——汇编指令之in/out指令

[复制链接]

4

主题

0

回帖

0

积分

热心网友

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2009-2-12
发表于 2020-1-20 09:13:02 | 显示全部楼层 |阅读模式

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寄存器中,不能是其他寄存器。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持琼殿技术社区。

您可能感兴趣的文章:
  • 汇编中的数组分配和指针的实现代码
  • 汇编语言 寄存器内存访问原理解析
  • 汇编语言入门教程(这一篇足矣)
  • 王爽 汇编语言学习笔记(详细)
  • 汇编语言软件延时1s的实现方法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部