《汇编语言》实验四

(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个字节,得知字节数量的方法如上

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值