汇编语言(王爽第三版)检测点14
检测点14.1
(1)编程,读取CMOS RAM的2号单元内容。
assume cs:code
code segment
start: mov al,2 ; (al)=2 2号单元
out 70h,al ;将al送入端口70h,选中2号单元
in al,71h ;从端口71h处读出2号单元内容,送入al
mov ax,4c00h
int 21h
code ends
end start
(2)编程,向CMOS RAM的2号单元写入0。
assume cs:code
code segment
start: mov al, 2 ;(al)=2 2号单元
out 70h, al ;将al送入端口70h,选中2号单元
mov al, 0 ;(al)=0 写入端口的内容
out 71h, al ;将(al)=0写入到71h端口的2号单元内。
mov ax,4c00h
int 21h
code ends
end start
总结:使用debug测试时。我们发现in和out指令都不支持单步中断。
检测点14.2
编程,用加法和移位指令计算(ax)=(ax)*10
提示:(ax)*10=(ax)*2+(ax)*8
程序分析:
按照提示:(ax)*2左移1位;(ax)*8左移3位,(ax)*8==(ax)*2^3将2者相加就ok了。中间必须使用个寄存器,例如bx吧。
assume cs:code
code segment
start: mov bx, ax ;bx用于计算2的3次方
shl ax, 1 ;(ax)左移1位,等价于(ax)*2
mov cl, 3 ;移动3位,因为shl和shr只认cl
shl bx, cl ;(bx)左移3位,等价于(ax)*2^3=(ax)*8
add ax, bx ;(ax)=(ax)*2+(ax)*8=(ax)*10
mov 4c00H
int 21H
code ends
end start
总结:
逻辑移位是针对于二进制数据的位数移动,对应于十进制就是模数是2数据,一切都是围绕着模数是2或2的指数来计算的。它不特指针对于其他数据,例如3、7、9等。
此程序中ax并没有赋值。调试中可以将值赋值给ax,例如加入mov ax, 数值。
在测试中要考虑(ax)*10是否产生溢出,导致测试数据不正常。