汇编语⾔(第四版)第五章实验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调试得出

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。