2017-01-04 61 views
-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我試圖扭轉這種陣列但保留每3TH元素上的立場。意思我想得到這樣的輸出,但是當我檢查變量時,在數組中我有5,4,2,1,B8。我注意到,當程序第一次碰到pop [si]整個數組的變化,探索變量顯示我的5, NULL, 3, 4, 5, 6應該不是5,2,3,4,5,6?我正在使用emu8086。問題可能聽起來很愚蠢,因爲我是新裝配。謝謝。

回答

0

有三個錯誤:

  • 您是pop荷蘭國際集團的兩個字節爲[si],但你只需要一個字節。解決方案是將pop兩個字節放入一個寄存器,並將一個字節移入[si]
  • 在標籤n6下,您得到了loop n5,但是當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

相關問題