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
这是我的代码:
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