实验 4 [bx]和loop的使用
一、实验结论
1.实验内容1
综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个 字单元重复填充字数据0403H。
(1)代码如下:
code segment
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
(3)将源代码程序中字数据0403H→修改为0441H,再次运行
2.实验内容2
综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据 0~63(3FH)
(1)
代码如下:综合使用loop, [bx], mov实现
assume cs:code
mov ds,ax
mov bx,0h
mov cx,40h
s:
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】的应用