汇编语言(第四版)第五章 实验4 习题解答

实验4 [bx] 和 loop的使用

(1)编程,向内存 0:200~0:23F 依次传送数据 0~63 (3FH)

(2)编程,向内存 0:200~0:23F 依次传送数据 0~63 (3FH),程序中只能使用 9 条指令,9条指令中包括“mov ax,4c00h” 和 “int 21h”。

解答:

(1)向内存 0:200~0:23F 依次传送数据 0~63,因为0~63数据是连续的,我们可以想到应该使用循环 64 次将数据依次存入 0:200~0:23F。因为 0:200~0:23F 共 64 个内存单元,因此每个单元正好存储 1 个字节,故使用 dl 寄存器循环存储 0~63,CX 寄存器设置为64(40h)用于存储循环次数,DS寄存器用于存储数据段地址,BX寄存器用于存储数据段偏移量。DL寄存器用于存储每次要复制的数。

程序代码如下

code segment
    mov ax,0000h
    mov ds,ax

    mov bx,0200h
    mov dl,0
    mov cx,40h

S:
    mov ds:[bx],dl
    inc bx
    inc dl
    loop s

    mov ax,4c00h
    int 21h

code ends
end

注意,这里传送数据一律是按字节传送,不是按字传送!

实验结果:

(2)相对于第一题,我们可以发现,在程序执行过程中,BX寄存器的BL与DL是相等的,因此我们可以只使用BL寄存器的内容即可。

程序代码如下:

assume cs:code

code segment
    
    mov ax,0000h    ;1
    mov ds,ax       ;2

    mov bx,0200h    ;3
    mov cx,40h      ;4

s:
    mov ds:[bx],bl  ;5
    inc bx          ;6
    loop s          ;7

    mov ax,4c00h    ;8
    int 21h         ;9

code ends
end

实验结果:

(3)下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存 0:200 处,补全程序。上机调试,跟踪运行结果。

assume cs:code

code segment

        mov ax,     cs     

        mov ds,ax

        mov ax,0020h

        mov es,ax

        mov bx,0

        mov cx,     17h     

s:

        mov al,[bx]

        mov es:[bx],al

        inc bx

        mov ax,4c00h

        int 21h

code ends

end

提示:

(1)复制的是什么?从哪里到哪里?

(2)复制的是什么?有多少个字节?你如何知道要复制的字节的数量?

注意,一定要做完这个实验才能进行下面的课程。

解释:

第一空:

由 mov ds,ax  mov al,[bx] 和 mov es:[bx],al 可知,ds中存放的应该是代码段地址,故要填写的第一条指令为 mov ax,cs

第二空:

由 mov ax,0020h  和 mov es,ax 可知 ,es 中存放的是要复制的代码的目的位置的内存地址

由 mov al,[bx]  和 mov es:[bx],al 可知,代码复制过程是按字节复制的,每次循环赋值一个字节。所以,cx寄存器的数值等于要复制代码的字节数。

那么 mov cx,              填写的一定是一个立即数,而不是寄存器的名字,对于 mov 寄存器,立即数 型的指令占3个字节,mov 寄存器,寄存器 型的指令占2个字节。

因此这里假设 mov cx,               占3个字节,其余指令已经确定。现在使用一下debug

 可以得出mov ax,4c00h指令之前的指令一共占23个字节(17h),故填入的第二个指令为mov cx,17h

理解了之后,我们对(1)(2)也做出解答,

(1)复制的是代码段地址,从 CS:0~CS:16

(2)复制的是要复制的代码所占字节数量,共23个字节(17h),根据debug调试得出

  • 13
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值