实验4:[bx]和loop的使用
实验任务一
综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个
字单元重复填充字数据 0403H
实现:
1.编写源码文件:test1.asm
注意点:在汇编程序中,数据不能以字母开头。b800前要加上0。
2.编译、链接
批处理文件:process.bat
1 masm %1.asm; 2 link %1.obj;
3.执行
4.将源代码程序中字数据 0403H→修改为 0441H,再次运行
实验任务二
综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据
0~63(3FH)
(1)必做:综合使用 loop, [bx], mov 实现
(2)选做*:利用栈的特性,综合使用 loop,push 实现(限定仅使用 8086 中已学过
指令实现)
(1)实现:
①编写源码:test2_.asm
②编译、链接、执行
③调试
可以看出,此方法是内存单元从0:200起依次被传送0~63的数据
(2)实现:
①编写源码:test2.asm
②编译、链接、执行
③调试
注意点:由于入栈操作是从高地址单元→低地址单元方向的,所以实际上是从内存单元0:23f处逆序传送0~63的数据的。另外,由于入栈操作是以字为单元操作的,而这里需要对字节操作,采取的方法是:把一个寄存器(如BX)的高低字节单独赋值后再压人栈中。
实验任务三
下面的程序的功能是将”mov ax,4c00h"之前的指令复制到内存0:200处,补全程序,上机调试,跟踪运行结果
assume cs:code
code segment
mov ax,_______
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,_______
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
实现:
由于题目要求把代码段内的指令当数据复制到目的地址,而cs段寄存器中存储的是指向程序代码段的段地址,因此第一空填CS;由于事先不知道整个程序占的字节数,可以先在第二个空预填一个合适的数(如10h),使之编译通过,然后调试查看CX的值,再减5(最后2条语句的字节数)即可得到程序从开始至“mov ax,4c00h”所占的字节数。
①源码(预填)
②编译、调试
CX=1C,故程序从开始至“mov ax,4c00h”所占的字节数为17h
③源码更新
④再次调试
可以看到,cs段的第一个字节成功的复制到了es:0;
同样地,第二个字节也被成功复制过去了。全部复制完成后,反汇编查看复制过去的内容,发现与源代码相同。