2017-01-04 15 views
-1
に1つの配列からデータを移動

ここでは私のコードです:x86の実モード:別

data segment 
gio db 1,2,3,4,5,6 
ricxvi db 1 
jami db 0 
x db ? 
ends 

stack segment 
    db 128 dup(0) 
ends 

code segment 
start: 
MOV AX,DATA 
MOV DS,AX 


    mov cx, 6 
    lea si, gio 
    mov ah, 0 


    n1: 
    mov al, [si] 
    cmp ricxvi, 3 
    je n2 
    jmp n3 

    n2: 
    add jami, al 
    mov ricxvi, 1 
    jmp n4 

    n3: 
    add ricxvi, 1 
    push ax 

    n4: 
    add si, 1 
    add di, 1 
    loop n1 




    mov ricxvi, 1 
    mov ax, 0 
    mov cx, 6 
    lea si, gio  


    n5: 
    cmp ricxvi, 3 
    je n6 
    jmp n7 


    n6: 
    mov ricxvi, 1 
    add si, 1 
    loop n5 

    n7: 
    pop [si] 
    add si, 1 
    loop n5 




mov ax, 4c00h 
int 21h 

ends 

end start 

私はgioという名前の配列を持っていると私は、この配列を逆にするが、その位置上のすべての第3回の要素を残すようにしようとしています。意味私はこのような出力を得たい5,4,3,2,1,6しかし、私は変数を調べると、配列で私は5,4,2,1,B8があります。私はプログラムが最初にpop [si]アレイ全体の変更をヒットすると、変数を調べると、その5, NULL, 3, 4, 5, 65,2,3,4,5,6ではないはずですか?私はemu8086を使用しています。質問は私が組立で新しくなったのでばかげているかもしれません。ありがとう。

答えて

0

は、3個のエラーがあります。

  • あなたですpop[si]に2つのバイトをINGのがありますが、1バイトのみを必要としています。解決策は、popの2バイトをレジスタに入れ、1バイトを[si]に移動することです。ラベルの下
  • あなたはloop n5を得たn6が、cxがゼロになったときにloopはジャンプしないとブロックn7をするとき、それはいけない、実行されます。
  • ラベル "n7"の下に "3"カウンターを増やすのを忘れました。ここで

修正は以下のとおりです。

 n6: 
    mov ricxvi, 1 
    add si, 1 
    loop n5 
    jmp finale   ;◄■■ SKIP NEXT BLOCK WHEN CX=0. 

    n7: 
    add ricxvi, 1  ;◄■■ INCREASE THE "3" COUNTER. 
    pop ax    ;◄■■ POP TWO BYTES. 
    mov [si], al  ;◄■■ USE ONE BYTE ONLY. 
    add si, 1 
    loop n5 

finale:     ;◄■■ END LABEL. 

mov ax, 4c00h 
int 21h 
+1

はどうもありがとうございました:) – Rasty

関連する問題