汇编x86,循环并替换数组中的值

时间:2016-11-02 22:48:30

标签: arrays loops assembly x86

嘿我需要制作一个循环数组的程序(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寄存器

2 个答案:

答案 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

编辑了添加循环以显示数组元素的答案。