一、实验目的
掌握汇编编程规范,熟悉编程环境。
二、实验内容
- 编程:向内存0:200-0:23F依次传送数据0-63(3FH)。
- 编程:编写code段代码,用push指令将a段中的word数据逆序存储到b段中。
三、实验步骤算法及关键代码
第一题
分析:0:200-0:23F,等价于0020:0000-0020:003F。需要循环把0-3fH(63)一个一个输入到其中。考虑到要输入的内容和输入的偏移地址内容相等,可以直接使用同一个寄存器;而bx可以用于寻址,所以选择bx来存储。
算法:先让ds中存储0020h,然后通过循环把bx从0-63的值输入到ds:[bx]中。
关键代码:
start: mov ax, 0020h
mov ds, ax
mov cx, 64
mov bx, 0
s: mov [bx], bx
inc bx
loop s
mov ax, 4c00h
int 21h
第二题
分析:push指令直接就相当于默认逆序存储(从高位到低位)。所以把a设为数据段,目标段b设为堆栈段就可以通过循环逆序存储数值。
算法:先将ds中的地址设为a,ss中的地址设为b。然后通过循环压栈就可以逆序存储。
关键代码:
start: mov ax, a
mov ds, ax
mov ax, b
mov ss, ax
mov sp,16
mov cx, 8
mov bx, 0
s: push [bx]
add bx, 2
loop s
mov ax, 4c00h
int 21h
四、实验小结(简单说明实验过程中出现的问题和解决方法)
第二题在第一次调试的时候出了问题,执行之后发现ss中没有存储数据。于是我又查看了ds:[0]中的数据,发现和我开始想的不一样:数据都是01 00 02 00 03 00…。我在写程序的时候由于粗心,以为要是想1, 2, 3,…这样存放数据,就都会是字符型的,在内存中是01, 02, 03…。于是又看了一下源程序,发现定义数据的时候是dw关键字,定义的是字型数据。于是把循环的inc改成了+2。
然后还是有问题,并没有解决。堆栈段还是0 0 0 0 0。重新认真读源程序,发现是由于没有设置sp。设置sp为16,解决了。