通用寄存器的意外覆盖

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

我正在做一项家庭作业,我们必须写评论来描述一些汇编代码在做什么。我是汇编程序的新手,所以我无法真正确定以下代码是否有错误。

我正在使用i686架构(不完全确定这意味着TBH)

[此程序defineGrade.s正在被另一个程序cs3843p3Driver.o调用

############################## determineGrade #####################
# Purpose:
#   determineGrade determines the grade of a student based on a
#   1000 pt scale.
# Parameters:
#   i 8(%ebp)  int iG1       Grade 1
#   i 12(%ebp) int iG2       Grade 2
#   i 16(%ebp) int iG3       Grade 3
#   i 20(%ebp) int iG4       Grade 4
#   i 24(%ebp) int iG5       Grade 5
#   i 28(%ebp) int iG6       Grade 6
#   i 32(%ebp) int iG7       Grade 7
#   i 36(%ebp) int iG8       Grade 8
#   i 40(%ebp) int iG9       Grade 9
#   i 44(%ebp) int iG10      Grade 10
# Locals:
#   -4(%ebp)  int iqTot
#   -8(%ebp)  int iTot
# Notes:
#   Grade is determined by
#       ??
# Return Value:
#   total grade on a 1000 pt scale
# Register Usage
#   %eax - mostly working register until after .L7 then ??
  .file "determineGrade.s"
  .text
.globl determineGrade
  .type determineGrade, @function
determineGrade:
  pushl %ebp
  movl  %esp, %ebp
    pushl %ebx                # Save the caller's %ebx since we are using %ebx
  subl  $20, %esp
  movl  $0, -4(%ebp)          # Overrides the caller's %ebx?

似乎是将呼叫者的%ebx值存储在与iqTot相同的位置,该位置被定义为-4(%ebp)。呼叫者的%ebx值是否被意外覆盖?

assembly x86 att
1个回答
0
投票

我与教授仔细检查,是的,%ebx的存储值被iqTot覆盖。调用determineGrade的函数并不依赖%ebx正常工作,因此教授决定留下错误,以查看我们是否有人注意到。显然,我是唯一一个喊出来的学生,所以他给了我额外的荣誉。

它应该是:

  • [iqTot存储在-8(%ebp)
  • [iTot存储在-12(%ebp)
© www.soinside.com 2019 - 2024. All rights reserved.