我的汇编代码试图将偶数数组的每个元素与其旁边的元素交换,这有什么问题?

问题描述 投票:0回答:1

我正在参加初学者汇编代码课程,但我不知道出了什么问题。我最后将 arr+1 (数组 arr 中的第二个元素)移动到 edx 中,只是为了检查是否存在正确的值,不幸的是它不是。它在 edx 中显示 01000000,而不是应有的 00000001。然而,当我检查代码时,1和2然后3和4都被正确地移动到eax和ebx中。这意味着我的代码存在一些问题。通过在线查看其他解决方案,我知道还有其他方法可以解决此问题,这些方法已经发布在本网站上,但目前这是我在课堂上学习的内容,因此这种获取参考并将其移入的方法寄存器将是我真正了解正在发生的事情的最佳选择。

mov [esi], ebx mov [esi + 4], eax

这是全部代码

.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword

.data
arr dword 1, 2, 3, 4

.code
main proc

    mov esi, offset arr
    mov ecx, lengthof arr
L1:

    mov eax, [esi]

    mov ebx, [esi + 4]
    
    mov [esi], ebx

    mov [esi + 4], eax

    add esi, type arr
    Loop L1

    mov edx, arr + 1

    invoke ExitProcess,0
main endp
end main

arrays assembly swap
1个回答
0
投票

这就是你的数组在内存中的样子:

arr
|
v
1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, ?, ?, ?, ?

我将

arr+1
(数组
arr
中的第二个元素)移至 EDX

您的数组使用双字大小的元素。因此,第二个元素的地址是

arr + 4
(因为双字是 4 个字节)。

检查正确的值是否存在,不幸的是它不存在。 EDX 中显示的是 01000000,而不是应有的 00000001。

当我运行您当前的代码(也读取数组外部的内存)时,我根本没有得到这些结果!

arr
|
v
2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, ?, ?, ?, ?, 1, 0, 0, 0
   ^
   |
   arr+1

执行

mov edx, arr+1
既不会产生01000000h,也不会产生00000001h。它将产生03000000h。

另外,我可以通过

add esi, type arr
看到你在说什么,只需将其增加一即可。然而,当我尝试将其切换为
add esi, type arr * 2
时,出现了问题。我该如何解决这个问题?

该任务要求您交换数组元素对。每次交换,您都会“消耗” 2 元素,因此您需要以 8 个字节为单位遍历数组(您可以将其写为

(type arr) * 2
)。
你还需要考虑的是你可以交换元素多少次!您的特定数组有 4 个元素。因此,您最多只能进行 2 次成对交换。您可以要求写这篇文章
mov ecx, (lengthof arr) / 2

© www.soinside.com 2019 - 2024. All rights reserved.