【问题标题】:Finding array sum in assembly x86_64在汇编 x86_64 中查找数组总和
【发布时间】: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,因此您应该在进入循环之前初始化您需要初始化的寄存器。 )

标签: assembly x86-64


【解决方案1】:

经过几次尝试,我意识到出了什么问题。基本上我需要做的是在func函数的开头添加movl $0, %eax

这是更新后的代码:

  func:

  movl $0, %eax

  jmp ifAnw

  doAnw:

  addl (%rdi, %rcx, 4), %eax

  inc %rcx

  ifAnw:

  cmpq $10, %rcx

  jne doAnw

  ret

【讨论】:

  • 就像我之前评论的那样,归零 RCX 应该在这个函数中,而不是在 main 中。您将 RCX 用作循环计数器纯粹是在此函数中;让调用者为您初始化它是没有意义的。你应该把归零指令放在它所属的地方,在 EAX 的旁边。
猜你喜欢
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多