(二十四)《汇编语言(王爽)》 | 检测点 14.1、14.2


1. 预备知识

  • CPU 通过端口地址定位端口,使用 in 和 out 命令读写端口,且只能使用 AX(16 位)或 AL(8 位)来存放从端口读入和发送到端口的数据。
  • CMOS RAM 芯片内部有两个端口:70h 为地址端口,存放要访问 CMOS 单元的地址;71h 为数据端口,存放从 CMOS 单元读取的数据。如读取 CMOS 的 2 号单元需要两个步骤:将 2 送入端口 70h,从 71h 读出 2 号单元的内容。
  • shl 和 shr 时逻辑左 / 右移指令,并将移出的位写入 CF 中,并使用 0 补充移入位。左移 n 位相当于乘以 2 的 n 次方,右移 n 位相当于除以 2 的 n 次方。

2. 检测点 14.1

(1)编程:读取 CMOS RAM 的 2 号单元的内容。

  • 根据预备知识的内容,首先基于 out 命令将 2 送入端口 70h,然后基于 in 命令从 71h 读取数据,全程使用 8 位寄存器 AL 完成。
assume cs:code
code segment
start:
	mov al,2h	
	out 70h,al	;将2送入端口70h
	in al,71h	;从71h独出2号单元的内容
	
	mov ax,4c00h
	int 21h
code ends
end start

由图可知,从 2 号单元读出的内容为 16H:

请添加图片描述

(2)编程:向 CMOS RAM 的 2 号单元写入 0。

  • 首先将2送入地址端口,然后将0送入数据端口。
assume cs:code
code segment
start:
	mov al,2h	
	out 70h,al	;将2送入端口70h
	mov al,0
	out 71h,al
	
	mov ax,4c00h
	int 21h
code ends
end start

3. 检测点 14.2

编程:用加法和移位指令计算 (ax)=(ax)*10。提示:(ax)*10=(ax)*2+(ax)*8。

  • 根据预备知识和提示,将乘以 10 分解为乘以 2 和乘以 8 的组合,这样可以使用左移运算完成。
assume cs:code
code segment
start:
	mov ax,5h	;(AX)=5
	mov bx,ax
	shl ax,1	;计算左移1位的结果
	mov cl,3
	shl bx,cl	;计算左移3位的结果
	add ax,bx	;(AX)=(AX)+(BX)
	
	mov ax,4c00h
	int 21h
code ends
end start

程序运行结果如下:

请添加图片描述

图中标出了两次左移运算的结果和最终的结果。


4. 总结

  • CMOS RAM 芯片内部有两个端口:70h 为地址端口,存放要访问 CMOS 单元的地址;71h 为数据端口,存放从 CMOS 单元读取的数据。
  • shl 和 shr 分别为逻辑左移和逻辑右移运算,左移 / 右移 n 位相当于乘以 / 除以 2 的 n 次方。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值