本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
学习教材:《汇编语言(第4版)》王爽著 此笔记是书中内容+自我总结,方便查阅和复习 请支持原著
CPU通过端口与芯片交换数据,对端口进行统一编址存入端口地址空间
CPU可以直接读取:内部寄存器、内存单元、端口
一、端口读写
端口读指令:in 端口写指令:out
格式:in al(ax),port、out port,al(ax)
当端口是8位时(0255):端口地址直接作为参数传入,且只能使用al传递数据
当端口时16位时(25665535):端口地址只能先存入dx,再作为参数传入,且只能用ax传递数据
二、CMOS RAM芯片
CMOS RAM芯片包含一个实时钟,靠电池供电,关机后时钟可工作、存储信息不丢失
芯片使用70h和71h端口读写,前者存芯片内部单元地址,后者存数据。因此:读写先传内部地址,再交换数据
其中:0~0dh单元用于存储保存时间信息,其他大部分存储电脑配置信息供启动时BIOS读取
CMOS RAM的时间信息
存储信息包含年月日和时分秒,长度都为一个字节,以8421BCD码形式存储
单元地址如下所示:
| 信息 | 单元地址 |
|---|---|
| 秒 | 0 |
| 分 | 2 |
| 时 | 4 |
| 日 | 7 |
| 月 | 8 |
| 年 | 9 |
检测点14.1
(1)编程读取CMOS RAM的2号单元
(代码片段)
mov al,2
out 70h,al
in al,71h
(2)编程向2号单元写入0
(代码片段)
mov al,2
out 70h,al
mov al,0
out 71h,al
三、移位指令——左移位和右移位
使用shl和shr实现数据的二进制格式左移和右移,其中:左移1位相当于乘以2,右移一位相当于除以2
当只移一位时:shl(shr) reg,1
当移动两位及其以上时:移动位数需要先存入cl,shl(shr) reg,cl
移位结束前,将最后一个移动的位数写入到CF,然后自动补0
检测点14.2
编程用加法和移位指令计算ax=ax*10。提示:ax*10=ax*2+ax*8 (代码片段)
mov bx,ax
mov cl,3
shl bx,cl ;左移三位相当于乘以2的三次方
shl ax,1 ;左移一位
add ax,bx
后记
- 端口范围不同时,指令格式不同
- 位移位不同时,指令格式不同