x86实模式:将数据从一个数组移动到另一个数组

时间:2017-01-04 15:53:21

标签: arrays assembly x86 real-mode

这是我的代码:

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, 6它不应该是5,2,3,4,5,6吗?我使用的是emu8086。问题可能听起来很愚蠢,因为我是装配新手。感谢。

1 个答案:

答案 0 :(得分:0)

有三个错误:

  • pop将两个字节[si],但您只需要一个字节。解决方案是将pop两个字节放入寄存器并将一个字节移入[si]
  • 在标签n6下,您获得loop n5,但当cx变为零时,loop不会跳转,而n7块会在执行时执行它不应该。
  • 你忘了增加" 3"标签n7下的计数器。

以下是修正:

     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