字符串的传送,为什么要这样啊
将以ADR1为偏移地址的原数据区的内容按字节方式移送到以ADR2为偏移地址的目标区域中,字节数为N且数据均为无符号数
mov si,adr1
mov di,adr2
mov cx,n
cmp di,si ;为什么还要比较?直接传送不可以吗?
jb don1
std
add si,cx ;为什么还要加上CX呢?
dec si
add di,cx
dec di
jmp don2
don1:cld
don2:rep movsb
hlt
请高手指教以上的两个疑点,谢谢!
问题点数:20、回复次数:3Top
1 楼mydo(侯佩|hopy|ks)回复于 2005-06-08 12:48:51 得分 10
std 标志位置1 ,以便在用 movsb 指令时作 si=si-1 ,di=di-1 操作,
后面的
add si,cx
dec si
add di,cx
dec di
将 si,di 定位于串的尾部以便向反方向移动指针。Top
2 楼zara(Kyrie eleison)回复于 2005-06-08 14:05:30 得分 10
>> cmp di,si ;为什么还要比较?直接传送不可以吗?
这个比较, 是为了防止当目标区域在源区域之后时, 两个区域如果有重叠的话, 直接传送, 就会导致源区域的末端数据会被以目的区域开始的地方而被源数据的开始部分给覆盖掉. 比如, 源区域为 0-1f, 目标区域为 18-27, 传送的长度为 10h 字节, 如果是 cld 情况下的传送的话, 源区域开始的 0-7 一开始就会被传送到目标区域开始的 18-1f, 而 18-1f 也同样是源区域的末端部分, 这样, 源区域的最后的 8 字节就被自己开始的 8 字节给破坏了. 而由尾端反向至开始部分进行传送的话, 源区域被覆盖的数据在被覆盖时, 已经被传送了, 因为在末端嘛, 是首先被传送的. 另外, 如果, 目标区域在源区域之前的话, 即使两者有重叠, 也是目的区域的末端覆盖了源前面的前端, 而当这个覆盖发生时, 源数据前端的数据已经被传送过了, 即使破坏了, 也无所谓了, 至少, 它保证了目标区域数据的正确.Top
3 楼gyhou()回复于 2005-06-10 10:21:35 得分 0
谢谢你们!Top




