嘿我需要制作一个循环数组的程序(1,2,3,4,5,6,7,8,9,10)并用元素'i + 5'交换元素'i'当'i'小于4时当程序结束时,新数组具有以下值6,7,8,9,10,1,2,3,4,5
现在我循环遍历数组
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
WriteDec PROTO
Crlf PROTO
DumpRegs PROTO
.data
arrayB WORD 1,2,3,4,5,6,7,8,9,10
.code
main proc
mov eax,0
mov edi,OFFSET arrayB ; address of arrayB
mov ecx,LENGTHOF arrayB ; loop counter
mov ax,0 ; zero the accumulator
L1:
mov ax,[edi] ; mov current edi value from array into ax
xchg arrayB, ax ;change the current ax register with the value in arrayB
add edi,TYPE arrayB ; point to next integer
loop L1
call DumpRegs
call WriteDec
call crlf
invoke ExitProcess,0
main endp
end main
但实际上我遇到了麻烦a)告诉循环时间是否低于4,以及b)正确替换值。任何帮助将不胜感激
编辑:我知道我可以使用“cmp”来比较ecx寄存器
答案 0 :(得分:2)
您的任务描述不一致;你说数组最后应该是6,7,8,9,10,1,2,3,4,5,并且要求交换索引低于5的所有元素(元素0到4),而不是4
LOOP
命令(这不是一个好主意,但除此之外)使用ECX作为隐式计数器。如果ECX非零,它会递减并跳转到标签,如果它为零,则不会。所以你要完全循环LENGTHOF arrayB
次;那是错的,你想要循环一半。
此外,XCHG
命令错误。交换的目的地不在arrayB,它在当前索引+5。你弄清楚如何解决这个问题。
此外,一旦你用索引+ 5'元素交换ax,你仍然需要将索引+ 5'元素的检索值写回到索引位置。
答案 1 :(得分:1)
您正在使用edi
指向数组的元素并将其存储在ax
中,一种解决方案是使用esi
指向元素+ 5并存储它在bx
中,然后将bx
移至edi
并将ax
移至esi
(顺便说一下,循环应重复半个数组的长度):
.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
WriteDec PROTO
Crlf PROTO
DumpRegs PROTO
.data
arrayB WORD 1,2,3,4,5,6,7,8,9,10
.code
main proc
;mov eax,0 ;◄■■ UNNECESSARY.
mov edi,OFFSET arrayB ; address of arrayB
mov ecx,5 ;◄■■ 10 ÷ 2 ("when ‘i' is under 4").
;mov ax,0 ;◄■■ UNNECESSARY.
L1:
mov ax,[edi] ; mov current edi value from array into ax
mov esi,edi
add esi,TYPE arrayB * 5 ;◄■■ ELEMENT "I+5".
mov bx,[esi] ;◄■■ BX = "I+5".
mov [edi],bx ;◄■■ EXCHANGE ONE REGISTER.
mov [esi],ax ;◄■■ EXCHANGE THE OTHER REGISTER.
add edi,TYPE arrayB ; point to next integer
loop L1
;----------------------------------------------
mov edi, OFFSET arrayB
mov ecx, LENGTHOF arrayB
DISPLAY_ARRAY:
xor eax, eax
mov ax, [edi]
call WriteDec
add edi,TYPE arrayB ; point to next integer
loop DISPLAY_ARRAY
;----------------------------------------------
call DumpRegs
call WriteDec
call crlf
invoke ExitProcess,0
main endp
end main
编辑了添加循环以显示数组元素的答案。