loop 和[bx]的联合应用
问题: 计算ffff:0~ffff:b单元中的数据和,结果存储在dx中。
分析上述问题,
- 运算结构是否会超出dx存储范围。不会,因为ffff:0~ffff:b内存单元中每一位都是字节型数据,累加12个不会超出ds的最大存储范围(65535)。
- 因为ffff:0~ffff:b数据是8位的,不能直接加到16位寄存器dx中。
- 如果直接将ffff:0~ffff:b中的数据累加到dl中,而设置$(dh)=0$,12个8位数据全部累加到8位数据的dl中,很可能会造成进位丢失。
总结问题:
- (dx)=(dx)+内存中的8位数据 —> 会不匹配
- (dl)=(dl)+内存中的8位数据 —> 会发生越界问题
解决办法:
用一个16位寄存器作为中介,把内存单元中的每一位都复制到16位寄存ax中。
数学表达:
$$\begin{array}{c}\\ {\mathrm{sum}=\sum_{\mathrm{X}=0}^{0bH}\left(\mathrm{ffffh}^{*} 10 \mathrm{h}+\mathrm{X}\right)}\end{array}$$
代码如下:
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
loop s
mov ax, 4c00h
int 21h
code ends
end
5.6 段前缀
- mov ax, ds:[bx]
- mov ax, cs:[bx]
- mov ax, ss:[bx]
- mov ax, es:[bx]
- mov ax, ss:[0]
- mov ax, cs:[0]
这些出现在访问内存单元的指令中,用于指明内存单元的段地址的”ds:”…被称为段前缀。