D 数组应包含位于 S 中偶数位置的元素,然后是位于奇数位置的元素。最后 D 数组应该看起来像 1,3,5,2,4,但下面的代码只让它变成 1,3,5,0,0。我验证了,指令
mov si, 1
执行一次,然后程序退出。
assume ds:data,cs:code
data segment
S db 1,2,3,4,5
len equ $-S
D db len dup(0)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, 0
mov di, 0
mov cx, len
repeat:
mov al, S[si]
mov D[di], al
inc di
add si, 2
cmp si, len
JGE instruction
dec cx
CMP cx, 0
JNE repeat
JE sf
instruction:
mov si, 1
sf:
mov ax, 4C00h
int 21h
code ends
end start
我再次查看了代码,发现有些部分可以更改或删除。
循环计数器位于
cx
。我不知道这是否是一个好的做法,但是
我只使用 si
来表示 repeat1
和 conditional jumps
。所以我删除了所有连接到 cx
的代码。
我将指令
JE sf
移到了cmp si, len
之后,因为在奇数的情况下,si (index of S)
始终是偶数。
程序将 1
、3
和 5
复制到 array D
,并且此条件跳转对于索引 si = 0, 2 and 4
不成立。
在第三次迭代中
array D
看起来像这样D = 1 3 5
、di = 3
和si = 6
。 jg instruction
被执行。
您的代码更改了 si
、si = 1
,因此您想做正确的事情,更改 index of S array
并复制其余数字。
我添加了 jmp repeat1
、si
和 di
是正确的,因此程序复制了数组 S 的其余部分。
迭代 4:
D[3] = S[1] = 2
di = 4
si = 3
迭代 5:
D[4] = S[3] = 4
di = 5
si = 5
这里
si = 5
所以程序复制了所有值并跳转到退出标签sf
。
assume ds:data,cs:code
data segment
S db 1,2,3,4,5
len equ $-S
D db len dup(0)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, 0
mov di, 0
; mov cx, len
repeat1:
mov al, S[si]
mov D[di], al
inc di
add si, 2
cmp si, len
JE sf
JG instruction
jmp repeat1
;dec cx
;CMP cx, 0
;JNE repeat1
instruction:
mov si, 1
; mov cx,2
jmp repeat1
sf:
mov ax, 4C00h
int 21h
code ends
end start