【问题标题】:Assembly x86, looping and replace values in an array汇编 x86,循环和替换数组中的值
【发布时间】:2016-11-02 22:48:30
【问题描述】:

嘿,我需要编写一个循环遍历数组 (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 寄存器

【问题讨论】:

  • 你的问题有新答案了,看看吧!

标签: arrays loops assembly x86


【解决方案1】:

你的任务描述不一致;你说数组最后应该是 6,7,8,9,10,1,2,3,4,5,这要求交换索引低于 5(元素 0 到 4)的所有元素,而不是低于 4 .

LOOP 命令(这不是一个好主意,但这不是重点)使用 ECX 作为隐式计数器。如果 ECX 不为零,它会递减并跳转到标签,如果它为零,则不会。所以你正在循环LENGTHOF arrayB 次;错了,你想循环一半。

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

另外,一旦将 ax 与 index+5'th 元素交换,你仍然需要将 index+5'th 元素的检索值写回 index'th 位置。

【讨论】:

  • 带内存的 XCHG 也非常慢:隐式 lock 前缀。如果你要指出 LOOP is slow,你也应该明确指出。
  • 嗯,我设法让它数了 6,7,8,9,10,但我认为它仍然关闭
  • 你知道怎么调试吗?单步执行程序,观察每一步的寄存器值?如果没有,请立即找出方法。
【解决方案2】:

您正在使用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

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

【讨论】:

  • 嘿,谢谢,但是当我使用代码时,它说“1>Array.asm(1): error A2044: invalid character in file”不知道为什么现在这样做
  • 我做了,他们走了,但它还在抱怨?
  • 是的,除了代码,一切都消失了,它还在抱怨吗?编辑:好的,现在我删除了所有内容,它只是一个白屏,并且仍然有问题说存在无效字符
  • 等等,但它仍然只打印 1,2,3,4,5?哦,等等,我看到你编辑了上面的代码。
  • 大声笑,我认为我做不到主要是因为我没有名声,很惊讶它的工作原理。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-23
  • 2013-07-25
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
相关资源
最近更新 更多