实验报告:实验四

1.综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个字单元重复填充字数据 0403H。

代码如下:

 

 1 assume cs:code
 2 code segment
 3    mov ax,0b800h
 4    mov ds,ax
 5    mov bx,07b8h
 6    mov cx,10h
 7 
 8 s: mov [bx],0403h
 9    add bx,2
10    loop s
11   
12    mov ax,4c00h
13    int 21h
14 code ends
15 end

 

需注意的是如果地址以字母开头的话需要在前面加0。

并且是重复填充字数据,所以每次bx值需要+2.

然后汇编→连接→运行→调试。如下图

结果如下图

然后将源代码程序中字数据 0403H→修改为 0441H,结果如下图。(16个A)

2. 综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据0~63(3FH)。

代码如下:

 

 1 assume cs:code
 2 code segment
 3     mov ax,20h
 4     mov ds,ax
 5     mov bx,0
 6     mov cx,40h
 7     mov al,0
 8 
 9 s:  mov [bx],al
10     inc al
11     inc bx
12     loop s
13   
14     mov ax,4c00h
15     int 21h
16 code ends
17 end

 

然后汇编→连接→运行→调试。如下图

分部调试

查看结果对应地址确实改为了0-63。

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

最终代码如下:

 1 assume cs:code
 2 code segment
 3    mov ax,cs
 4    mov ds,ax
 5    mov ax,0020h
 6    mov es,ax
 7    mov bx,0
 8    mov cx,17h
 9 s: mov al,[bx]
10    mov es:[bx],al
11    inc bx
12    loop s
13    mov ax,4c00h
14    int 21h
15 code ends
16 end

其中,想要复制程序代码,即从cs:ip开始(ip默认为bx=0),即把cs赋值给ax。

循环次数cx一开始并不确定,但是可以在运行的程序反汇编中看出所需复制的代码的长度。则随意给cx赋值,查看反汇编代码长度

如下图

可以看出程序从0000-0016为所需复制的代码,长度为23个字节。

即赋值cs=17h。

然后重新编译连接运行调试,结果如下图:

然后用g命令直接调试,再用d命令查看指定地址中的内存数据是否为反汇编中的代码对应的数据:

结果相符。

总结和感想:

1.熟悉了汇编中loop语句的循环使用。

2.对段前缀【bx】的语法和用法有所理解,同时对g命令一步到位的调试很有好感。

posted @ 2018-11-17 14:05  小老弟123  阅读(112)  评论(0编辑  收藏  举报