汇编语言学习第十四章-端口

本博文系列参考自<<汇编语言>>第三版,作者:王爽

各种存储器都通过地址总线,数据总线以及控制总线与CPU相连。CPU对这些各种存储器组成的存储单元进行统一编址,统一寻址。除了各种存储器和CPU相连之外,还有以下几种芯片和CPU相连:

(1)各种接口卡(比如网卡,显卡)上的芯片,它们控制接口卡工作

(2)主板上的接口芯片,CPU通过它们对部分外设进行访问

(3)其他芯片,用来存储相关的系统信息,或进行相关的输入输出处理

在这些芯片中,都有一些可以用CPU读写的寄存器,虽然这些寄存器在物理上不同的芯片,但是有如下两个相同点:

(1)都和CPU的总线相连,当然这种连接是通过它们所在的芯片进行的

(2)CPU对它们进行读或写的时候通过控制线向它们的芯片发出端口读写命令

从CPU的角度,CPU对这些端口统一进行寻址,每个端口在地址空间都有独一无二的地址。

CPU可以直接从:内存地址空间,端口,CPU内部寄存器这三个地方直接读写数据。

14.1端口的读写

CPU和端口所在的芯片通过地址总线相连,所以端口地址和内存地址一样,通过地址总线来传送。在PC系统中,CPU最多可以定位64KB个不同的端口。则端口的地址范围为0~65535.

对端口的读写只能用in和out指令。

访问内存和访问端口的区别:

(1)访问内存:

mov ax,ds:[8]   ;假设执行前(ds)=8

执行步骤:

一.cpu通过地址线将地址信息8发出

二.cpu通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取数据

三.存储器将8号单元中的数据通过数据线送入CPU

(2)访问端口:

in al,60h  ;从60号端口读入一个字节

执行步骤:

一.CPU通过地址线将地址信息60h发出

二.CPU通过控制线发出端口命令,告诉芯片将要读取该端口的信息

三.端口所在芯片将60h端口的信息送到al中

14.2  CMOS RAM芯片

在PC中有一个CMOS RAM芯片,该芯片特征如下:

1.包含一个时钟和一个128个存储单元的RAM存储器

2.该芯片靠电池供电。所以关机后仍正常工作

3.128字节的ram,其中0~0dh用来保存时间信息,其余大部分用于保存系统配置,供系统启动时的BIOS读取,BIOS

也提供了相关程序,使我们在开机时候可以配置CMOS RAM中的信息

4.该芯片有两个端口70h和71h,用这两个端口实现对CMOS RAM的读写。

5.70h为地址端口,存放要读取的CMOS的地址单元。71h为数据端口,存放要写入或者写出的数据。

比如读CMOS的2号单元分为以下两步:

将2送入70h

从71h读出2号单元的内容

14.3  shl和shr指令

shl和shr为逻辑移位操作

shl为逻辑左移位操作,其功能为:

(1) 将一个寄存器或者内存单元的数据向左移动

(2) 将最后移出的一位写入CF中

(3) 最低位用0补充

比如:

mov al,01001000b
shl al,1

执行后(al)=10010000b,CF=0

如果移动位数大于1,必须将移动位数保存在cl中,比如:

mov al,01010001b
mov cl,3
shl al,cl

可以看出将X逻辑左移一位相当于X=X*2

shr为逻辑右移位操作,其功能为:

(1) 将一个寄存器或者内存单元的数据向右移动

(2) 将最后移出的一位写入CF中

(3) 最低位用0补充

比如:

mov al,10000001b
shr al,1

执行后(al)=01000000b,CF=1

同样的,如果移动位数大于1,必须将移动位数保存在cl中

可以看出将X逻辑左移一位相当于X=X/2

14.4  CMOS RAM中存储的时间信息

在CMOS中,存放着当前的时间:年,月,日,时,分,秒。这6个信息的长度都为1个字节,存放单元为:

秒:0   分:2    时:4     日:7     月:8    年:9

这些数据以BCD方式存放。

BCD编码方式如下:

比如数值26,用BCD码表示为:0010 0110

可见在CMOS中,一个字节表示两位BCD码,高四位BCD表示十位,低四位BCD表示个位

问题,在屏幕中间显示当前月份:

一 从CMOS RAM的8号地址单元中读出当前月份的BCD码

mov al,8
out 70h,al
in al.71h

二 将用BCD码表示的月份以十进制的形式显示到屏幕上

BCD码值=十进制码值 ,则BCD码值+30h=十进制数对应的ASCII码

从CMOS RAM的8号单元中读出一个字节,分为两个表示的BCD码值得数据。

mov ah,al
mov cl,4
shr al,cl
and al,00001111b

显示(ah)+30h和(al)+30h对应的ascii字符,完整程序如下:

assume cs:code
code segment
start: mov al,8
       out 70h,al
       in  al,71h

       mov ah,al
       mov cl,4
       shr ah,cl
       and al,00001111b

       add ah,30h
       add al,30h

       mov bx,0b800h
       mov es,bx
       mov byte ptr es:[160*12+40*2],ah
       mov byte ptr es:[160*12+40*2+2],al

       mov ax,4c00h
       int 21h

code ends
end start

时间: 2024-08-29 06:40:58

汇编语言学习第十四章-端口的相关文章

小甲鱼零基础汇编语言学习笔记第四章之第一个汇编程序

1.使用工具 代码编写:NotePad++,代码编译器:MASM 2.一个源程序从写出到执行的过程 第一步,使用文本编辑器,用汇编语言编写汇编源程序,这一步产生一个存储源程序的文本文件. 第二步,对源程序进行编译,连接.使用MASM.exe对源程序文件进行编译,产生目标文件,再使用LINK.exe对目标文件进行连接,生成可在操作系统中直接运行的可执行文件.可执行文件包括两个部分,程序(从源程序的汇编指令翻译过来的机器码)和数据(源程序中定义的数据):相关的描述信息 (程序有多大,要占多少内存空间

AI - 深度学习入门十四章- 摘要1

原文链接:https://yq.aliyun.com/topic/111 01 - 一入侯门"深"似海,深度学习深几许 什么是"学习"? "如果一个系统,能够通过执行某个过程,就此改进了它的性能,那么这个过程就是学习". 学习的核心目的,就是改善性能. 什么是机器学习? 定义1: 对于计算机系统而言,通过运用数据及某种特定的方法(比如统计的方法或推理的方法),来提升机器系统的性能,就是机器学习. 定义2: 对于某类任务(Task,简称T)和某项性

【WPF学习】第二十四章 基于范围的控件

原文:[WPF学习]第二十四章 基于范围的控件 WPF提供了三个使用范围概念的控件.这些控件使用在特定最小值和最大值之间的数值.这些控件--ScrollBar.ProgressBar以及Slider--都继承自RangeBase类(该类又继承自Control类).尽管它们使用相同的抽象概念(范围),但工作方式却又很大的区别. 下表显示了RangeBase类定义的属性: 表 RangeBase类的属性 通常不比直接使用ScrollBar控件.更高级的ScrollViewer控件(封装了两个Scro

【WPF学习】第十四章 事件路由

原文:[WPF学习]第十四章 事件路由 由上一章可知,WPF中的许多控件都是内容控件,而内容控件可包含任何类型以及大量的嵌套内容.例如,可构建包含图形的按钮,创建混合了文本和图片内容的标签,或者为了实现滚动或折叠的显示效果而在特定容器中放置内容.设置可以多次重复嵌套,直至达到你所希望的层次深度.如下所示: <Window x:Class="RouteEvent.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2

【WPF学习】第四十四章 图画

原文:[WPF学习]第四十四章 图画 通过上一章的学习,Geometry抽象类表示形状或路径.Drawing抽象类扮演了互补的角色,它表示2D图画(Drawing)--换句话说,它包含了显示矢量图像或位图需要的所有信息. 尽管有几类画图类,但只有GeometryDrawing类能使用已经学习过的几何图形.它增加了决定如何绘制图形的画笔和填充细节.可将GeometryDrawing对象视为矢量插图中的形状.例如,可将标准的窗口元文件格式(.wmf)转换成准备插入用户界面的GeometryDrawi

《Linux内核设计与实现》第八周学习总结——第四章 进程调度

<Linux内核设计与实现>第八周学习总结——第四章 进程调度 第4章 进程调度35 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间,进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有通过调度程序的合理调度,系统资源才能最大限度地发挥作用,多进程才会有并发行的效果. 调度程序没有太复杂的原理,最大限度地利用处理器时间的原则是只要有可以执行的进程,那么就总会有进程正在执行,但是只要系统中可运行的进程的数目比处理器的个数多,就注定某一给定时刻会有一些进程不

Python基础教程(第十四章 网络编程)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5538341.html______ Created on Marlowes 本章将会给读者展示一些例子,这些例子会使用多种Python的方法编写一个将网络(比如因特网)作为重要组成部分的程序.Python是一个很强大的网络编程工具,这么说有很多原因,首先,Python内有很多针对常见网络协议的库,在库顶部可以获得抽象层,这样就可以

MiS603开发板 第十四章 UDP协议网络传输

作者:MiS603开发团队 日期:20150911 公司:南京米联电子科技有限公司 论坛:www.osrc.cn 网址:www.milinker.com 网店:http://osrc.taobao.com EAT博客:http://blog.chinaaet.com/whilebreak 博客园:http://www.cnblogs.com/milinker/ MiS603开发板 第十四章 UDP协议网络传输 本实验将实现FPGA 芯片和PC 之间进行千兆以太网数据通信, 通信协议采用Ether

第十四章 软件、硬件发展史上的风风雨雨中的一声悲叹!

第十四章   软件.硬件发展史上的风风雨雨中的一声悲叹! 睡不着.感而写之. 忠言逆耳.良语苦口.高山流水.曲高和寡. 我的感觉,计算机已经发展到了一个死胡同.我们似乎只是在兜圈子,从最初的汇编写的UNIX操作系统,到如今的C语言写的WINDOWS.LINUX.我 们应该反思.到底技术上进步了很多?还是原地兜圈子?从汇编,到C语言.脚本语言,到C++.C#.JAVA,到VB等等所谓的高级语言:似乎取得很多进步了.我们面向对象编程啊,抽象了类.逐步贴近自然语言了.真的?我极端怀疑!人类的自然语言描