2016-12-02 3 views
-1

Ich kann nicht verstehen, warum, wenn ich Schleife Anweisung das Programm nicht gut funktioniert. CX ist 3 und normalerweise sollte es dreimal in "repete" gehen, aber es funktioniert nur beim ersten Mal und als das Programm beendet ist.LOOP Anweisung in einem Programm

;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

Ich lief den Code und es 3-mal wiederholt. Welchen Compiler benutzen Sie? Wie sehen Sie den CX-Wert? –

+0

dosbbox könntest du mir einen anderen empfehlen? Mit CPU beobachte ich den CX-Wert – Mary

+0

Ich kann dir dieses hier empfehlen = https://sourceforge.net/projects/guitasm8086/, aber du solltest herausfinden, was mit deinem aktuellen Compiler nicht stimmt (bist du sicher, dass dies der Code ist, den du gerade ausführst ?). –

Antwort

1
  • Ein guter Grund, warum dieses Programm zu Funktionsstörungen, warum es scheinen könnte könnte, dass es nicht 3 mal nicht laufen ist, wenn die Richtung Flag DF gesetzt wurde. Die movsw hängt von der DF = 0 ab.
    Entweder:

    • schreiben cld und halten dazu führte mit movsw
    • schreiben mov word ptr [di], bx anstelle des Trios movswsub di,2sub si,2
      Die Tatsache, dass der Code bereits eine ungenutzte mov bx, word ptr [si] Anweisung hatte.
  • DI steht für eine Adresse. In Ihrem Programm sollten Sie es als unsigniert behandeln.
    Auch l*4-1 ist nicht besser als .

    add  di, 4 
    cmp  di, l*4 
    jb  do