支持硬件输入输出的IN指令和OUT指令及测试输入和输出程序

简介: 支持硬件输入输出的IN指令和OUT指令及测试输入和输出程序

一、支持硬件输入输出的IN指令和OUT指令


       Windows控制硬件借助的是输入输出的指令。其中具有代表性的两个输入输出指令就是IN和OUT指令。这些指令也是汇编语言的助记符


可以通过IN和OUT指令来实现对数据的读入和输出,如下图所示


IN指令和OUT指令:



  也就是说,IN指令通过指定的端口号输入数据,OUT指令则是把CPU寄存器中存储的数据输出到指定端口号的端口。


       那么这个 端口号 和 端口是什么呢?你感觉它像不像港口一样?通过标注哪个港口然后进行货物的运送和运出?


下面我们来看一下官方是如何定义端口号和端口的


       还记得计算机组成原理中计算机的五大组成部分吗,再来回顾一下:运算器、控制器、存储器、输入设备和输出设备。我们今天不谈前三个,就说说后面两个输入设备和输出设备,这两个与我们本节主题息息相关


       那么问题来了,IO设备如何实现输入和输出的呢?计算机主机中,附带了用来连接显示器以及键盘等外围设备的 连接器。而连接器的内部,都连接有用来交换计算机主机同外围设备之间电流特性的IC.如果IC你不明白是什么的话,这些IC统称为 I0 控制器


       IO是Input/Output的缩写。显示器、键盘等外围设备都有各自专用的1/O控制器。I/0 控制器中有用于临时保存输入输出数据的内存。这个内存就是 端口(port).端口你就可以把它理解为我们上述说的港口。I0控制器内部的内存,也被称为 寄存器,不要慌,这个寄存器和内存中的寄存器不一样。CPU内存的寄存器是用于进行数据运算处理的,而IO中的寄存器是用于临时存储数据的


       在I/O设备内部的IC中,有多个端口。由于计算机中连接着很多外围设备,因此也就有很多1/O控制器。当然也会有多个端口,一个I/0控制器可以控制多个设备,不仅仅只能控制一个。各端口之间通过端口号 进行区分


       端口号也被称为 I/0地址。IN指令和OUT 指令在端口号指定的端口和CPU之间进行数据的输入和输出。这跟通过内存的地址来对内存进行读写是一样的道理。


以端口为桥梁实现CPU和外围设备的数据传递:



二、测试输入和输出程序


       首先让我们利用IN指令和OUT指令,来进行一个直接控制硬件的实验。假如试验的目的是让一个计算机内置的喇叭(蜂鸣器)发出声音。蜂鸣器封装在计算机内部,但它也是外围设备的一种


       用汇编语言比较繁琐,这次我们用C语言来实现。在大部分C语言的处理(编译器的种类)中,只要使用_asm{ 和 }括起来,就可以在其中记述助记符。也就是说,采用这种方式就能够使用C语言和汇编语言混合的源代码


       在AT兼容机中,蜂鸣器的默认端口号是61H,末尾的H表示的是十六进制数的意思。用IN指令通过该端口号输入数据,并将数据的低2位设定为ON,然后再通过该端口号用OUT指令输出数据,这时蜂鸣器就会发出声音。同样的方法,将数据的低2位设定为OFF并输出后,蜂鸣器就停止工作


       位设定为ON指的是将该位设定为1,位设定为OFF 指的是将该位设定为0.把位设定为ON,只需要把想要设定为ON的位设定为1,其他位设定为0后进行OR运算即可。由于这里需要把低2位置为1,因此就是和03H进行OR运算。03H用8为二进制来表示的话是00000011.由于即便高6位存在着具体意义。和0进行OR运算后也不会发生变化,因而就和03H进行OR运算。把位设定为OFF,只需要把想要置OFF的位设定为0,其他位设定为1后进行AND运算即可。由于这里需要把低2位设定为0


       因此就要和FCH进行AND运算。在源代码中,FCH是用OFCH来记述的。在前面加0是汇编语言的规定,表示的是以A-F这些字符开头的十六进制数是数值的意思。OFCH用8位二进制数来表示的话是11111100.由于即便高6位存在着具体意义,和1进行AND运算后也不会产生变化,因而就是同OFCH进行OR运算


void main(){
    //计数器
    int i;
    //蜂鸣器发生
    _asm{
        IN  EAX, 61H
        OR  EAX, 03H
        OUT 61H, EAX
    }
    // 等待一段时间
    for(i = 0; i < 1000000; i++);
    //蜂鸣器停止发生
    _asm{
        IN  EAX, 61H
        OR  EAX, 03H
        OUT 61H, EAX
    }
}


我们对上面的代码进行说明,main是C语言程序起始位置的函数。在该函数中,有两个用_asm {}围起来的部分,它们中间有一个使用for 循环的空循环


       首先是蜂鸣器发声的部分,通过IN EAX,61H(助记符不区分大小写)指令,把端口61H的数据存储到CPU的EAX寄存器中。接下来,通过OREAX,03H指令,把EAX寄存器的低2位设定成ON.最后,通过OUT 61H,EAX指令,把EAX寄存器的内容输出到61端口。使蜂鸣器开始发音。虽然EAX寄存器的长度是32位,不过由于蜂鸣器端口是8位,所以只需对下8位进行OR运算和AND运算就可以正常工作了


       其次是一个重复100次的空循环,主要是为了在蜂鸣器开始发音和停止发音之间稍微加上一些时间间隔。因为现在计算机器的运行速度非常快,哪怕是100万次循环,也几乎是瞬时间完成的


       然后是用来控制器蜂鸣器停止发声的部分。首先,通过IN EAX,61H指令,把端口61H的数据存储到CPU的EAX寄存器中。接下来,通过AND EAX,OFCH指令,把EAX寄存器的低2位设定为OFF.最后,通过OUT 61H,EAX指令,把寄存器的EAX内容输出到61号端口,使蜂鸣器停止发音。


目录
相关文章
|
4天前
|
数据采集 算法 测试技术
【硬件测试】基于FPGA的16psk调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的16PSK调制解调系统的硬件测试版本。系统在原有仿真基础上增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同信噪比下的性能测试。16PSK通过改变载波相位传输4比特信息,广泛应用于高速数据传输。硬件测试操作详见配套视频。开发板使用及移植方法也一并提供。
20 6
|
10天前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的8PSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现8PSK调制解调系统,包含高斯信道、误码率统计、ILA数据采集和VIO在线SNR设置模块。通过硬件测试和Matlab仿真,展示了不同SNR下的星座图。8PSK调制通过改变载波相位传递信息,具有高频谱效率和抗干扰能力。开发板使用及程序移植方法详见配套视频和文档。
24 7
|
17天前
|
数据采集 算法 测试技术
【硬件测试】基于FPGA的QPSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的QPSK调制解调系统的硬件实现与仿真效果。系统包含测试平台(testbench)、高斯信道模块、误码率统计模块,支持不同SNR设置,并增加了ILA在线数据采集和VIO在线SNR设置功能。通过硬件测试验证了系统在不同信噪比下的性能,提供了详细的模块原理及Verilog代码示例。开发板使用说明和移植方法也一并给出,确保用户能顺利在不同平台上复现该系统。
57 15
|
25天前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的2FSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的2FSK调制解调系统,包含高斯信道、误码率统计模块及testbench。系统增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同SNR下的硬件测试,并提供操作视频指导。理论部分涵盖频移键控(FSK)原理,包括相位连续与不连续FSK信号的特点及功率谱密度特性。Verilog代码实现了FSK调制解调的核心功能,支持在不同开发板上移植。硬件测试结果展示了不同SNR下的性能表现。
64 6
|
1月前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
111 13
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
76 1
|
8月前
|
API Go
LabVIEW如何减少下一代测试系统中的硬件过时6
LabVIEW如何减少下一代测试系统中的硬件过时6
50 1
|
8月前
|
XML 编解码 API
LabVIEW如何减少下一代测试系统中的硬件过时5
LabVIEW如何减少下一代测试系统中的硬件过时5
45 1
|
3月前
|
安全 Linux 网络安全
Kali渗透测试:远程控制程序基础
Kali渗透测试:远程控制程序基础
56 0
Kali渗透测试:远程控制程序基础
|
3月前
|
安全 Java Linux
Kali渗透测试:通过Web应用程序实现远程控制
Kali渗透测试:通过Web应用程序实现远程控制
60 0