(1)&(2)
内存0:200-0:23F也可以表示为0020:0-0020:3F,一共64个字节,所以cx=64,循环64次。在写到mov [bx],bl时,刚开始写的是mov [bx],bx,所以为了更好地理解两者的区别,用两种指令都进行了实验并用Debug跟踪,如下
运用mov [bx],bl 指令
assume cs:codesg
codesg segment
mov ax,0020H
mov ds,ax
mov bx,0
mov cx,64
s: mov [bx],bl
inc bx
loop s
mov ax,4c00H
int 21
codesg ends
end
对源文件进行编译和连接
用U指令查看汇编指令,R指令查看寄存器的内容
用g指令直接跳到循环部分执行,d指令查看内存单元中的内容变化,再跳过循环部分后查看内存单元内容的变化,发现达到了实验目的。
运用mov [bx],bx
汇编指令如下,保存为当前路径.asm为拓展名的文件
assume cs:codesg
codesg segment
mov ax,0020H
mov ds,ax
mov bx,0
mov cx,64
s: mov [bx],bx
inc bx
loop s
mov ax,4c00H
int 21
codesg ends
end
进行编译连接后使用U命令查看汇编指令,使用g命令跳到循环处开始执行,但在进行两次循环后都没有发现与mov [bx],bl指令有什么区别
考虑到有可能是内存单元的初始值均为0的缘故,修改0020:3-0020:5的值为FF,再继续执行,发现在执行循环修改0020:3的内存单元内容时,0020:4中的内容也被修改。
但当完成全部指令的执行,也能达到实验目的
总结:在使用mov [bx],bx时,由于物理地址为ds:[bx]的内存单元是一个字节的内存单元,而bx为16位的寄存器,所以在使用bx对ds:[bx]赋值时会同时赋值给ds:[bx]与ds:[bx+1]的两个内存单元,但由于循环的不断进行,被修改的ds:[bx+1]的值在下一次循环时会被覆盖,从而不会影响最后的实验结果。
(3)
如题意,我们需要把“mov ax,4c00H”之前的指令复制到内存0:200处,由于已经给出了段地址0020H的赋值,所以空(1)应该填.exe文件被载入内存后程序指令的起始处地址,即CS;CX的值为循环次数,需要根据指令所占内存决定,于是,先假设CX为2。经过编译连接,使用Debug进行跟踪,U指令查看指令的机器码个内存单元,可以看出,在“mov ax,4c00H”之前的指令共占23个字节,于是CX=23。
将程序补全后重新编译连接,使用Debug跟踪,达到实验目的
思考:
(1)复制的是“mov ax,4c00H”之前的指令所在内存单元的内容,从“mov ax,cs”到“loop s”.
(2)17个字节,得知字节数量的方法如上