汇编语言(王爽第三版)检测点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是否产生溢出,导致测试数据不正常。

posted @ 2017-05-21 09:37  筑基2017  阅读(1749)  评论(0编辑  收藏  举报