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命令一步到位的调试很有好感。