实验 4 [bx]和 loop 的使用
Posted mr-gao1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验 4 [bx]和 loop 的使用相关的知识,希望对你有一定的参考价值。
一、实验目的
1. 理解和掌握寄存器间接寻址方式[bx]
2. 通过汇编指令 loop 的使用理解编程语言中循环的本质
3. 熟练掌握使用 debug 按需调试完整汇编源程序的方法
二、实验准备
1. 学习/复习第 5 章使用[bx]和 loop 实现循环的编程应用示例(教材 5.5 节,5.8 节)
2. 复习第 3 章「栈」的知识
3. 结合第 4 章课件,复习完整汇编源程序编写→汇编→连接→运行→调试的方法
三、实验内容
1. 综合使用 loop,[bx],编写完整汇编程序,实现向内存 b800:07b8 开始的连续 16 个
字单元重复填充字数据 0403H。
必做:综合使用 loop, [bx], mov 实现
实现代码如下:
assume cs:code code segment mov ax,0b800h mov ds,ax mov cx,16 mov bx,07b8H mov ax,0403h s: mov [bx],al inc bx mov [bx],ah inc bx loop s
mov ax,4c00h int 21h code ends end
首先当然是设置bx和ds的值,将b800通过ax传给ds(由于b800是以字母开头的,所以应当在前面加上一个0),bx的值设为07b8h.
最后将ax的值设为0403h,用于累加
这里要加16次,显然要使用loop循环,设置cx的值等于16以控制循环次数,用inc bx每次bx地址加1
一个字单元是16位的,采用小端法读字
实验结果如下:
这里仍然使用了上一个实验中所使用的process.bat简化步骤,可以看出输出结果是一串红心
2. 综合使用 loop,[bx],编写完整汇编源程序,实现向内存 0:200~0:23F 依次传送数据
0~63(3FH)。
代码如下:
assume cs:code code segment mov ax,20h mov ds,ax mov bx,0 mov cx,64 s:mov [bx],bx inc bx loop s mov ax,4c00h int 21h code ends end
首先逻辑地址0:200可以写成20:0,这样改写是为了便于后面bx递增,通过ax将20h传入到ds中。
bx初值赋为0,一共需要执行64次,将cx的值赋为64以控制循环次数
刚好这里需要传送的数据0~63(3FH)与[bx]是一致的,数据0-63是64个连续的数字,0-3fH也是连续的64个编号。
我们可以使用一个bx变量就把偏移地址和数字的递增都搞定。
所以循环段内容就写成了如上的样子
实验结果如下:
似乎没有什么变化和输出,仿照前面实验的经验,我们将屏幕清空后再次执行
依然没有发现有任何的输出结果,当然这个程序是执行了的,猜测可能改程序没有输出,只是在内部内存中发生了一些变化。
3. 教材实验 4(3)(P121)
分析过程:
cs段寄存器中存储的是指向程序代码段的段地址。此实验是将程序的代码(按字节)复制,故将cs寄存器中的指向代码的段地址赋值给ax,再通过ax寄存器赋值给ds段寄存器。
所以显然第一个空应当填写CS
对于第二个空,我们需要填写CX的值,即需要知道循环的次数,这是重点,此试验是将"mov ax,4c00h"之前的指令复制到内存0:200处
所以没有执行前我们不知道次数,索性先随便输入一个CX值,反汇编看出"mov ax,4c00h"之前的机器码长度
这里我们随机输了个10,代码如下
assume cs:code code segment mov ax,cs mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,10 s:mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00H int 21H code ends end
Debug后查看和反汇编的内容如上
CX的值为1C,即整个代码长度
我们发现mov ax,4cooh/int 21h它们共占用了5个字节。所以在本实验中我们需要复制的代码字节数是001CH-0005H=0017H==23个字节,故cx计数寄存器赋值为23或17H。
故正确的代码如下
assume cs:code code segment mov ax,cs mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,17h s:mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00H int 21H code ends end
成功编译连接后,我们进入Debug,对0020:0(即0:200)处,长度为17h的内存进行反汇编,查看其中的内容
经查看发现确实是mov ax,4c00h"之前的指令复制到内存0:200处,实验成功!!!
五、总结与体会
(1)不仅可以向内存中写入数据,还可以复制代码
(2)在必须执行过一次才能知道结果的情况下,我们可以先假设再得出准确的数值
(3)loop的作用很大,极大的减少不必要的重复操作
以上是关于实验 4 [bx]和 loop 的使用的主要内容,如果未能解决你的问题,请参考以下文章