【发布时间】:2020-12-14 21:34:31
【问题描述】:
我正在尝试在汇编中编写一个函数,该函数查找由 10 个 int 元素组成的数组的总和。每次我运行我的程序时,它都会显示 4195600 和 4195700 之间的随机数。这是我的功能:
.section .data
iarr:
.int 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
func:
jmp ifAnw
doAnw:
addl (%rdi, %rcx, 4), %eax
inc %rcx
ifAnw:
cmpq $10, %rcx
jne doAnw
ret
.globl main
main:
movq $0, %rcx
leaq iarr, %rdi
call func
其余的都是教授给我们的,所以我的错误应该发生在这两者之间。谁能帮我告诉我我做错了什么?
【问题讨论】:
-
您更改了编辑以修复格式,并使您的代码更不可读。
-
不要尝试将
esp用作通用寄存器。这不会崩溃的唯一原因是因为rcx已经从10开始,所以你甚至不会循环一次。此外,您可能希望将eax归零。 -
我的错,我在发布之前实际上正在尝试一些东西。我也试过放 0 但还是一样。
-
提示:在你
add进入它之前,EAX 的初始值是多少?此外,要求呼叫者为您将 RCX 归零是没有意义的。要求调用者在 RCX 中输入一个长度 会 有意义,并且该函数会将其倒数。但是将10硬编码到函数中并要求调用者为您将 RCX 归零只是将部分工作留给每个调用者。 (如果循环条件ifAnw是调用目标,您可以证明它是合理的,但由于您在函数开始时无论如何都使用jmp,因此您应该在进入循环之前初始化您需要初始化的寄存器。 )