我无法理解为什么如果我使用循环指令,程序运行良好。 CX是3,通常它应该进入"重复" 3次,但它只是第一次工作,而不是程序完成。
;2. Se da un sir de dublucuvinte. Sa se ordoneze descrescator sirul cuvintelor inferioare ale acestor dublucuvinte. Cuvintele superioare raman neschimbate.
;Ex: dandu-se: sir DD 12345678h 1256ABCDh, 12AB4344h
;rezultatul va fi 1234ABCDh, 12565678h, 12AB4344h.
assume cs: code, ds:data
data segment
sir dd 12340004h, 12560007h, 12AB0005h,12340009h
l equ ($-sir)/4
data ends
code segment
start:
mov ax,data
mov ds,ax
mov es,ax
mov si,offset sir
mov cx,l-1
repeta:
mov di,si
add di,4
do:
mov ax,word ptr [di]
mov bx, word ptr [si]
cmp word ptr [si],ax
ja final
movsw
sub di,2
sub si,2
mov word ptr [si],ax
final:
add di,4
cmp di,l*4-1
jl do
add si,4
loop repeta
;dec cx
;cmp cx,0
;jne repeta
mov ax,4c00h
int 21h
code ends
end start
答案 0 :(得分:1)
如果设置了方向标志DF,这个程序可能出现故障以及为什么它似乎它不会迭代3次的一个很好的理由是。 movsw
取决于DF = 0
之一:
cld
并继续使用movsw
mov word ptr [di], bx
代替三重奏movsw
sub di,2
sub si,2
mov bx, word ptr [si]
指令的事实导致了这一点。 DI
代表一个地址。在您的程序中,您应该将其视为未签名
l*4-1
也不比l*4
好。
add di, 4
cmp di, l*4
jb do