程序中的LOOP指令

时间:2016-12-02 18:01:12

标签: assembly x86

我无法理解为什么如果我使用循环指令,程序运行良好。 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

1 个答案:

答案 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