Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays x86实模式:将数据从一个阵列移动到另一个阵列_Arrays_Assembly_X86_Real Mode - Fatal编程技术网

Arrays x86实模式:将数据从一个阵列移动到另一个阵列

Arrays x86实模式:将数据从一个阵列移动到另一个阵列,arrays,assembly,x86,real-mode,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 ri

这是我的密码:

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
的数组,我试图反转这个数组,但将每个第三个元素保留在它的位置上。这意味着我想得到如下输出
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。这个问题听起来可能很傻,因为我是新来的装配工。谢谢。

有三个错误:

  • 您正在将两个字节放入
    [si]
    中,但只需要一个字节。解决方案是
    将两个字节放入寄存器,将一个字节放入
    [si]
  • 在标签
    n6
    下,您得到了
    循环n5
    ,但当
    cx
    变为零时,
    循环不会跳转,而块
    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