先解决一个常量问题。比较如下汇编指令:
mov al,[0] 含义:(al)=0,将常量0送入al中(与mov al,0)含义相同
mov al,ds:[0] 含义:(al)=((ds)*16+0) 将内存单元中的数据送入al中
mov al,[bx] 含义:(al)=((ds)*16+(bx)) 将内存单元中的数据送入al中
mov al,ds:[bx] 含义:同上
loop和[bx]的联合应用
考虑这样一个问题,计算ffff:0-ffff:b单元的数据的和,结果存储在dx中。
首先分析,运算结果是否会超出dx所能存储的范围?ffff:0-ffff:b中的数据是字节型数据,范围在0-255之间,12个这样的数据相加结果不会大于65535,可以在dx中存下。
能否将数据直接累加到dx中?不能,8位数据不能直接累加到16位寄存器dx中。
能否将数据累加到dl中,并设置(dh)=0,从而实现累加的目标?不能,低位相加有进位,这样会丢失进位。
综合上述问题,目前的解决方法是将8位数据赋值到一个16位寄存器ax中,再将ax中的数据加到dx上,从而使两个运算对象的类型匹配并且结果不会超界。
通过loop指令优化后的完整代码:
assume cs:code
code segment
mov ax,0ffffh
mov ds,ax
mov bx,0
mov dx,0
mov cx,12
s: mov al,[bx]
mov ah,0
add dx,ax
inc bx //实现(bx)=(bx)+1
loop s
mov ax,4c00h
int 21h
code ends
end
段前缀:如指令 mov ax,ds:[bx] mov ax,cs;[bx] mov ax,ss:[0] 中的ds,cs,ss用于显示地指明内存单元地段地址在汇编语言中叫做段前缀。