上文介绍了 BX 和 loop 的使用和大致作用。2021-7-27~29 汇编语言 【BX】 和 loop 【N-1】
现在我们从内存的角度看待这些指令(涉及到寄存器的指令,大多数都可以从内存角度考量)
考虑一个问题:计算ffff:0006单元中的数乘以3,结果存储在dx中。
1、运算后的结果是否会超出dx所能存储的范围?
ffff:0006单元中的数是一个字节型的数据,范围在0〜255之间,则用它和3相乘结果 不会大于65535,可以在dx中存放下。
2、用循环累加来实现乘法,用哪个寄存器进行累加?
将ffff:0006单元中的数赋值给ax,用dx进行累加。先设(dx)=0,然后做3次 (dx)=(dx)+(ax)。
3、ffff:6单元是一个字节单元,ax是一个16位寄存器,数据的长度不一样,如何 赋值?
注意,我们说的是“赋值”,就是说,让ax中的数据的值(数据的大小)和ffff:0006 单元中的数据的值(数据的大小)相等。8位数据01H和16位数据0001H的数据长度不一样,但它们的值是相等的。
那么我们如何赋值?设ffff:0006单元中的数据是XXH,若要ax中的值和ffff:0006单 元中的相等,ax中的数据应为00XXH。所以,若实现ffff:0006单元向ax赋值,应该令 (ah)=0, (al)=(ffff6H)。
因此,我们这样写程序
assume cs:gpnb
gpnb segment
mov ax,0ffffH //注意,在汇编语言程序里,数据不能以字母开头,要在前加 0
mov ds,ax
mov bx,6
mov al,[bx]
mov ah,0
mov bx,0
mov cx,3
s: add dx,ax
loop s
mov ax 4c00h
int 21h
gpnb ends
end
有时,Debug 和 masm 对汇编指令有不同处理。例如:
mov ax,[0]
我们的理解为:将 ds:0 处的数据送入 ax;
但是,在汇编源程序中,指令:mov ax,[0]被当做“ mov ax,0 ”处理。