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

x86 real mode: move data from one array to another

这是我的代码:

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。问题听起来可能很愚蠢,因为我是装配新手。谢谢。

存在三个错误:

  • 您正在 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