我正在参加初学者汇编代码课程,但我不知道出了什么问题。我最后将 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
这就是你的数组在内存中的样子:
arr
|
v
1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, ?, ?, ?, ?
我将
(数组arr+1
中的第二个元素)移至 EDXarr
您的数组使用双字大小的元素。因此,第二个元素的地址是
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
)。mov ecx, (lengthof arr) / 2
。