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
- 您忘记增加标签
下的“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