汇编学习杂记(14~17章)

接口芯片和端口 在PC系统的接口卡和主板上,装有各种接口芯片.接口芯片内部有若干寄存器,CPU将这些寄存器当做端口来访问

CPU只能通过端口来对外设进行读写和控制,而外设也是通过端口来和CPU保持联系.

在PC系统中,CPU最多可以定位64K个不同的端口,范围为0 ~ 65535

端口读写指令 只能用 ax 或 al 来存放从端口中读入或发送到端口的数据
访问8位端口(0 ~ 255)时用al,访问16位端口(256 ~ 65535)时用ax
in 读取  in al,00h   in ax,FFFFh   in al,dx
out 写入 out FFh,al  out FFFFh,ax  out dx,al

CMOS RAM 芯片
包含一个实时时钟和一个有128个存储单元的RAM存储器,靠电池供电.
时钟占用 0 ~ 0dh 单元,其余大部分保存系统配置信息,启动时供BIOS读取.
有两个端口 70h 地址端口,存放要访问的单元地址; 71h 数据端口,存放从选定单元中读取的数据,或要写入的数据
例: mov al,2
    out 70h,al  ;将2送入端口70h,表示让71h存放好2号单元的内容
    in  al,71h  ;读出2号单元的内容
    out 71h,al  ;向2号单元写入2

CMOS RAM中的时间信息
存放单元(每个信息长度为1字节): 秒:0  分:2  时:4  日:7  月:8  年:9

存放方式:BCD码  十进制码:  0    1    2    3    4    5    6    7    8    9
             对应的BCD码:0000 0001 0010 0011 0100 0101 0110 0111 1000 1001
比如:数值26,表示为0010 0110 (高4位表示十位,低4位表示个位)
内存单元位数是从右到左的(76543210)

shl 逻辑左移指令 (如果位移数大于1,必须存放在cl中,如 shl al,cl)
1.将一个寄存器或内存单元中的数据向左移位
2.将最后移出的一位写入CF中
3.最低位用 0 补充

X逻辑左移一位,相当于执行 X = X*2
如:  00000001 = 1
     00000010 = 2
     00000100 = 4
左移1位相当于乘以[2^1]2,左移2位相当于乘以[2^2]4,左移3位相当于乘以[2^3]8,以此类推

X逻辑右移一位,相当于执行 X = X/2

shr 逻辑右移指令 和shl移动相反,操作步骤一样 (如果位移数大于1,必须存放在cl中)
1.将一个寄存器或内存单元中的数据向右移位
2.将最后移出的一位写入CF中
3.最高位用 0 补充

拆分8位数据中的两个BCD码
mov ah,al          ;假设al中为读出的8位BCD码
mov cl,4
shr ah,cl          ;ah右移4位,便移除了个位的BCD码
and al,00001111b   ;al保留下来的便是个位BCD码

I/O (Input/Output,输入/输出)

外中断信息
外设的输入到达,相关芯片将向CPU发出相应的中断信息,CPU执行完当前指令后,引发中断过程.

外中断源
1.可屏蔽中断 是CPU可以不响应的外中断,是否响应该终端,取决于标志寄存器IF位的设置.
2.不可屏蔽中断 是CPU必须响应的外中断,中断类型码固定为 2 ,所以不需要取中断类型码,过程如下:
(1)标志寄存器入栈,IF=0,TF=0
(2)CS和IP入栈
(3)(IP)=(2*4),(CS)=(2*4+2)

几乎所有由外设引发的外中断,都是可屏蔽中断.

第9位IF 中断标志,如果IF=1,则CPU在执行完当前指令后响应可屏蔽中断,如果IF=0,则不响应.

sti 用于设置IF=1
cli 用于设置IF=0

键盘输入过程
1.键盘输入
键盘上每个键相当于一个开关,键盘中有一个芯片对每个键的开关状态进行扫描,按下键位芯片就产生一个扫描码,然后送入主板上的相关接口芯片的寄存器,该寄存器的端口地址为60H
松开键位时,也产生一个扫描码,同样也被送入60H端口中

扫描码长度为一个字节  断码 = 通码 + 80H
按下一个键时产生的扫描码 称为 通码 (第7位为0)
松开一个键时产生的扫描码 称为 断码 (第7位为1)

2.引发9号中断
键盘的输入到达60H端口时,相关芯片会发出中断类型码为9的可屏蔽中断信息.CPU检测到后,判断IF标志位,决定是否引发中断过程

3.执行 int 9 中断例程 (BIOS提供了该例程)
(1)读出60H端口中的扫描码

(2)如果是字符键的扫描码,将该扫描码和它所对应的字符码(即ASCII码)送入内存中的BIOS键盘缓冲区;
如果是控制键(如Ctrl)和切换键(如CapsLock)的扫描码,则将其转变为状态字节(用二进制位记录控制键和切换键状态的字节)写入内存中存储状态字节的单元

(3)对键盘系统进行相关的控制,比如向相关芯片发出应答信息(芯片接收到应答后,就认定60H端口的数据已经送出,续而读取下一个键盘输入)

BIOS键盘缓冲区 系统启动后BIOS用于存放int 9中断例程所接收的键盘输入的内存区,可存储15个键盘输入.
int 9中断例程除了接收扫描码,还要产生与扫描码对应的字符,所以一个键盘输入占位2个内存单元,高位字节存放扫描码,低位字节存放字符码(ASCII).如: 1e61h 缓冲区中a的扫描码,存储状态为61 1e

0040:17 单元存储键盘状态字节.记录信息如下:(二进制)
0位: 右shift状态,置1表示按下右shift键
1位: 左shift状态,置1表示按下左shift键
2位: Ctrl状态,置1表示按下Ctrl键
3位: Alt状态,置1表示按下Alt键
4位: ScrollLock状态,置1表示Scroll指示灯亮
5位: NumLock状态,置1表示小键盘输入的是数字
6位: CapsLock状态,置1表示输入大写字母
7位: Insert状态,置1表示处于删除状态

模拟int指令的调用功能,调用的入口地址在ds:0 ds:2中
pushf                  ;标志寄存器入栈
pushf
pop ax
and ah,11111100b
push ax
popf                   ;IF=0 TF=0
call dword ptr ds:[0]  ;CS IP入栈:(IP)=((ds)*16+0),(CS)=((ds)*16+2)

xchg 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)

not 指令 不影响标志寄存器的相关标志位

数据标号(描述了单元长度的标号)
可以使用在其他段中(带有":"的地址标号,只能在当前带代码段中使用)

不但表示内存单元的地址,还表示了内存单元的长度,
即此标号处以后的单元是字节单元,还是字单元,或者是双字单元

注:想在代码段中直接用数据标号,则需用伪指令assume将标号所在的段和一个段寄存器联系起来
ASSUME CS:code DS:data等等,
假如数据标号在data段中,程序中则要给DS赋值段地址(mov ax,data  mov ds,ax)

定义标号:  标号 数据类型 数据内容 ( a db 1,2,3)
标号后面没有":",它同时描述内存地址和单元长度.
标号a,描述了地址(标号所在段的段地址:标号处的偏移地址),和从这个地址开始,以后的内存单元都是字节单元.
用 mov a,ax 将出现错误,操作数类型不匹配
c dd 0 双字单元 操作数类型为word(16位)

例:     d dw 0
指令:   mov ax,b   ;相当于 mov ax,标号所在段的段地址:[标号处的偏移地址]
指令:   mov b,2    ;相当于 mov word ptr 标号所在段的段地址:[标号处的偏移地址],2
指令:   inc b      ;相当于 add word ptr 标号所在段的段地址:[标号处的偏移地址],1
        a db 1,2,3
指令:   mov al,a[si]      ;相当于 mov al,标号所在段的段地址:标号处的偏移地址[si]
指令:   mov al,a[3]       ;相当于 mov al,标号所在段的段地址:标号处的偏移地址[3]
指令:   mov al,a[bx+si+3] ;相当于 mov al,标号所在段的段地址:标号处的偏移地址[bx+si+3]

数据标号0 dw 数据标号1,数据标号2  ;数据标号0处存储着 1 和 2 的偏移地址
相当于 数据标号0 dw offset 数据标号1,offset 数据标号2

数据标号0 dd 数据标号1,数据标号2  ;数据标号0处存储着 1 和 2 的偏移地址和段地址
相当于 数据标号0 dw offset 数据标号1,seg 数据标号1,offset 数据标号2,seg 数据标号2

seg 操作符,取得某一标号的段地址

直接定址表 一种编程技巧,利用表在两个数据集合之间建立一种映射关系,使可以用查表的方法根据给出的数据得到其在另一集合中的对应数据

int 16h 0号子程序
(1)检测键盘缓冲区中是否有数据;
(2)没有则继续做第一步;
(3)读取缓冲区第一个字单元中的键盘输入;
(4)将读取的扫描码送入ah, ASCII码送入al;
(5)将已读取的键盘输入从缓冲区中删除.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值