实验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;

同样地,第二个字节也被成功复制过去了。全部复制完成后,反汇编查看复制过去的内容,发现与源代码相同。

 

posted @ 2018-11-16 21:09  Kevin234  阅读(520)  评论(4编辑  收藏  举报