Arrays 程序集x86,循环并替换数组中的值

Arrays 程序集x86,循环并替换数组中的值,arrays,loops,assembly,x86,Arrays,Loops,Assembly,X86,嘿,我需要做一个程序,在数组(1,2,3,4,5,6,7,8,9,10)中循环,并将元素“I”与元素“I+5”交换。当“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

嘿,我需要做一个程序,在数组(1,2,3,4,5,6,7,8,9,10)中循环,并将元素“I”与元素“I+5”交换。当“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寄存器

您的任务描述不一致;你说数组的结尾应该是6,7,8,9,10,1,2,3,4,5,这要求交换索引在5以下(元素0到4)的所有元素,而不是在4以下

LOOP
命令(这不是一个好主意,但与此无关)使用ECX作为隐式计数器。如果ECX不为零,则递减并跳到标签,如果为零,则不为零。因此,您的循环次数正好是数组的
长度
次;那是错误的,你想循环一半

另外,
XCHG
命令错误。exchange的目标不在arrayB,而是在当前索引+5处。你想办法解决这个问题


此外,一旦您将ax与索引+5'元素交换,您仍然需要将索引+5'元素的检索值写回索引的第位置。

您正在使用
edi
指向数组的元素,并将它们存储在
ax
中,一种解决方案是使用
esi
指向元素+5并将其存储在
bx
中,然后将
bx
移动到
edi
中,并将
ax
移动到
esi
中(顺便说一句,循环应重复半个数组长度的次数):


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

XCHG带内存也非常慢:隐式
lock
前缀。如果你要指出这一点,你也应该指出这一点。我设法让它数到6,7,8,9,10,但我认为它仍然关闭了。你知道如何调试吗?通过程序单步执行,观察每一步上的寄存器值?如果没有,请立即找出答案。您的问题有了新答案,请查看!嘿,谢谢,但是当我使用代码时,它会说“1>Array.asm(1):错误A2044:文件中的无效字符”不知道为什么现在这样做了,它们不见了,但它仍在抱怨?是的,除了代码,所有东西都不见了,它仍在抱怨?编辑:好的,现在我删除了所有内容,它只是一个白色屏幕,它仍然有问题说有一个无效字符等待,但它仍然只打印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              ;◄■■ 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