实验 4 [bx]和loop的使用

一、实验结论

1.实验内容1

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

(1)代码如下:

assume cs:code
code segment
     mov ax,0b800h
     mov ds,ax
     mov ax,0403h
     mov bx,07b8h
     mov cx,16
s:mov [bx],ax
  inc bx
  inc bx
  loop s
  mov ax,4c00h
  int 21h
 
code ends
end
(2)用masm进行运行,运行结果如下

(3)将源代码程序中字数据0403H→修改为0441H,再次运行

 

 

2.实验内容2

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

(1)

代码如下:综合使用loop, [bx], mov实现

assume cs:code

code segment
     mov ax,0020h
     mov ds,ax
     mov bx,0h
     mov cx,40h
     mov ax,0
s:
  mov [bx],ax
  add ax,1h
  inc bx
  loop s
  mov ax,4c00h
  int 21h
 
code ends
end

 利用masm集成操作软件进行编译

用debug查看储存单元,观察是否成功写入

运行时没有出现结果,用debug查看内存单元发现,正常写入内存数据,代码运行成功

(2)利用栈的特性,综合使用 loop,push 实现

代码如下:

assume cs:code
code segment
     mov ax,0020h
     mov ss,ax
     mov sp,40h
     mov bh,3fh
     mov bl,3eh
     mov cx,20h
s:push bx
  add bh,-2
  add bl,-2
    loop s
  mov ax,4c00H
  int 21H
code ends
end

改动过程中出现的问题:

①由于8086cpu的栈读入按字(两个字节输入)所以入栈操作需要进入一个字的数据,然后把其中的两个字节数据分别减少2

②小端法的输入,push bx时(bx=bh+bl),将bh放到栈最底部,bl在bh的内存单元上面(例如bh的地址为10002H,bl的地址为10001H)

所以要注意bh,bl的初始数值

③由于按字读入的原则,cx=40h/2=20h。

对比两种方法,循环语句显然更容易让人理解,而用栈语句进行操作,操作效率更高,能一次输入两个字节。

 3.实验内容3

源代码

assume cs:code

         code segment

         mov ax,cs  因为cs为储存指令的段地址

         mov ds,ax

         mov ax,0020H

         mov es,ax

         mov bx,0

         mov cx,0017H  此处为代码的长度,用debug观察寄存器内容获得(cx=001c,减去后面的5个不计入其中的字节)

         s:mov al,[bx]

           mov es:[bx],al

           inc bx

           loop s

           mov ax,4c00H

           int 21H

code ends

end

用debug进行调试

用u命令反汇编

可以看到,相应的代码内容已经复制到了0:200处,成功

 二、总结与体会:

①熟悉了loop和【bx】的应用,了解了循环语句的应用方法

②了解了栈入栈时的每个字节输入的先后顺序,对小端法的印象更深刻了

③熟悉了如何进行代码段的复制,cs和寄存器:【bx】的应用

 

posted @ 2018-11-17 00:28  折风  阅读(296)  评论(1编辑  收藏  举报