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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 汇编语言入门教程(这一篇足矣)

    汇编语言是一种最低级.最古老.不具有移植性的编程语言,它能够直接访问计算机硬件,所以执行效率极高,占用资源极少,一般用于嵌入式设备.驱动程序.实时应用.核心算法等. 汇编语言的缺点是开发周期特别长,实现一个简单的功能都非常麻烦,已经很少用来编写应用程序了. 1 本讲座以汇编初学者或对汇编一点也不了解的读者为对象,汇编高手不属于该范围,但强烈建议高手指导并增补.修改本文. 2 任何读者可以跟此贴,提出疑问,或解答其中的问题,但对于所有跟贴,水贴.内容有错.毫不相干贴将直接删除,有意义的贴可能会合并

  • 汇编语言 寄存器内存访问原理解析

    这篇文章主要介绍了汇编语言 寄存器内存访问原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在内存中字的存储 这段话的主要意思是:一个字=2B=16bit,CPU中是用两个内存单元储存一个字(假如获取0地址存放的字型数据,就是获取它的高位字节0+1位和低位字节0位的数据,数据由高地址位向低地址位读) 问题: (1)0地址单元中存放的字节型数据是多少? # 20H (2)0地址字单元中存放的字型数据是多少? # 4e20H (3)2地址字单

  • 王爽 汇编语言学习笔记(详细)

    王爽汇编语言第三版是一款高清完整版的专业编程图书,该书结构设计合理,内容全面涵盖知识点丰富,适合自学者使用,有需要者快来 一.基础知识 1.指令 机器指令:CPU能直接识别并执行的二进制编码 汇编指令:汇编指令是机器指令的助记符,同机器指令一一对应. 指令:指令通常由操作码和地址码(操作数)两部分组成 指令集:每种CPU都有自己的汇编指令集. 汇编语言由3类指令组成. 汇编指令 伪指令:没有对应的机器码,由编译器执行,计算机并不执行 其他符号:如+.-.*./等,由编译器识别,没有对应的机器码.

  • 汇编语言软件延时1s的实现方法

    对于不同的计算机,因为其主频不同,延时1s的参数也不相同,计算延时的方法如下: 计算机主频:x (Hz) 一条LOOP语句执行始终周期数:y 所需要延时的时间:z (s) 需要执行的语句数:a z=y*(1/x)*a 计算得到所需的执行语句数编写程序. 例:(计算机主频为3GHz) delay proc near push bx push cx mov bx,400h for1:mov cx,0ffffh for2:loop for2 dec bx jnz for1 pop cx pop bx

  • 汇编中的数组分配和指针的实现代码

    数组简介 如果各位猿友是一路跟着LZ看到这里的,那么数组的定义就非常简单了,它就是一个相同数据类型的数据集合.数组存储在一系列逻辑上连续的内存块当中,之所以说是逻辑上连续,是因为整个内存或者说存储器本身就是逻辑上连续的一个大内存数组.如果我们用Java语言的类型来表示我们的存储器的话,可以看做是byte[] memory这样的类型. 数组的定义非常简单,它遵循以下这样简单的规则. T N[L]; 这当中T表示数据类型,N是变量名称,L是数组长度.这样的声明会做两件事,首先是在内存当中开辟一个长为

  • 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 下面是一个

  • Java基础之常用的命令行指令

    1.进入某盘,直接打出要进入的存储盘再冒号回车即可 例如:从C盘中的\Users\Administrator目录下进入d盘 打出"d:"再回车就欧克啦~ 2. "dir"显示某目录或某盘下的所有文件目录 例如:1.显示D盘下的文件目录 打出"dir"再回车 3. "md"新建文件夹 例如:1.在d盘下创建一个叫JavaEE的文件[也可在d盘的文件目录下建立文件夹] 格式是md javaEE再回车就可以啦.我们可以去我的电脑d盘

  • UEFI开发基础汇编代码的使用

    UEFI中使用汇编代码 EDK代码中包含一部分汇编代码,目前支持的有.S..asm和.nasm格式的汇编(第一个是AT&T汇编,后两个是Intel汇编,只是使用的汇编样式稍有不同,.nasm是开源和免费的,更加的通用),如果是在Windows下编译,一般使用的是NASM编译器,所以会使用.nasm格式的汇编文件,而编译工具也是免费的,可以在https://www.nasm.us/下载,并放到C:\Nasm目录,之后就可以在EDK代码中使用. 下面是一个示例,它是一个库模块: 首先创建inf文件:

  • 基于vue的下拉刷新指令和滚动刷新指令

    小编最近在实现移动端列表页面显示的时候一直在思考如何实现列表的自动更新数据,对于大多数Native App或者Web App,在列表的底部增加"加载更多"的按钮也是解决这样的问题一种交互的方式,当然,这样的交互其实还好,不过根据用户的操作习惯来看,似乎滚动刷新更多数据和下拉刷新当前数据的操作方式,更符合用户对列表分页数据的读取习惯,因此,在这里小编想简单的说说,这次在小编系统中所使用的下拉刷新和滚动刷新的实现方式! 其实,这种实现数据加载的原理很简单 在滚动刷新的时候,需要在列表滚动到

  • jsp的常用指令有哪些(编译指令/动作指令整理)

    Jsp包含三个编译指令和七个动作指令. 三个编译指令为:page.include.taglib. 七个动作指令为:jsp:forward.jsp:param.jsp:include.jsp:plugin.jsp:useBean.jsp:setProperty.jsp:getProperty. 一.编译指令 1. page指令 a. 通常位于jsp页面的顶端,同一个页面可以有多个page指令.语法格式如下: 复制代码 代码如下: 〈% @page [language="Java"] [e

  • 对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍

    在Vue中,自定义指令的生命周期,有5个事件钩子:1-bind 被绑定, 2-inserted 被插入, 3-update 开始更新, 4-componentUpdated 更新完成,5-unbind 解除绑定.我们可以设置指令在某一个事件发生时的具体行为. 例子如下: 页面一进后, 在控制台中设置一个新值:通过控制台设置的新name 再设置一个新值:通过控制台设置的新name 最后点击解绑,解除绑定(解除绑定之后,id="app"的Dom和vm的实例之间解除mvvm的绑定关系): 代

  • Vue 通过自定义指令回顾v-内置指令(小结)

    Vue.js 的各种指令(Directives)更加方便我们去数据驱动 DOM,例如 v-bind.v-on.v-model.v-if.v-for.v-once 等内置指令,这些指令的职责就是当表达式改变时将某些行为应用到 DOM 上,尽量不去操作增删改 DOM.通过了解如何去自定义指令,可以想象内置指令是如何完成的. 内置指令 指令名称 描述 使用 v-model 绑定数据 <\input v-model="message"> v-text 输出文本,不能解析标签 <

  • vue全局自定义指令和局部自定义指令的使用

    目录 局部自定义指令(只针对组件内的元素) 定义全局自定义指令 自定义指令的钩子函数 自定义指令钩子函数的参数 例子 除了默认设置的核心指令 (v-model 和 v-show),Vue 也允许注册自定义指令. 局部自定义指令(只针对组件内的元素) 父组件app.vue <template> <div id="app"> <test-api></test-api> </div> </template> <sc

  • vue自定义加载指令v-loading占位图指令v-showimg

    目录 了解自定义指令的钩子函数 注册成为全局指令 需求描述 列表组件 ListCom.vue 加载动画组件 LoadingCom.vue 钩子函数 loading.js 分析上面的代码 main.js 中 注册成为全局指令 页面中使用加载动画指令 v-loading 占用图指令 v-showimg 占位图组件 ShowImgCom.vue 指令的书写 showimg.js main.js注册 指令的使用v-showimg指令 了解自定义指令的钩子函数 bind(){}:每当指令绑定到元素上的时候

  • TypeScript基础入门教程之三重斜线指令详解

    前言 TypeScript是Javascript的超集,实现以面向对象编程的方式使用Javascript.当然最后代码还是编译为Javascript. 三斜杠指令是包含单个XML标记的单行注释. 注释的内容用作编译器指令. 三斜杠指令仅在其包含文件的顶部有效. 三重斜杠指令只能在单行或多行注释之前,包括其他三重斜杠指令. 如果在声明或声明之后遇到它们,则将它们视为常规单行注释,并且没有特殊含义. /// <reference path ="..."/> /// <re

随机推荐