Assembly 普通寄存器的意外覆盖

Assembly 普通寄存器的意外覆盖,assembly,x86,att,Assembly,X86,Att,我正在做一个家庭作业,我们必须写评论来描述一些汇编代码正在做什么。我是汇编新手,所以我真的不知道下面的代码是否有错误 我使用的是i686架构(不完全确定这意味着什么TBH) 另一个程序cs3843p3Driver.o正在调用此程序DetermingGrade.s ############################## determineGrade ##################### # Purpose: # determineGrade determines the grade

我正在做一个家庭作业,我们必须写评论来描述一些汇编代码正在做什么。我是汇编新手,所以我真的不知道下面的代码是否有错误

我使用的是i686架构(不完全确定这意味着什么TBH)

另一个程序cs3843p3Driver.o正在调用此程序DetermingGrade.s

############################## 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
相同的位置,iqTot定义为
-4(%ebp)
。调用方的
%ebx
值被意外覆盖了吗?

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

它应该是:

  • iqTot
    存储在
    -8(%ebp)
  • iTot
    存储在
    -12(%ebp)

是的,看起来有问题。i686意味着386(32位代码),ISA扩展高达并包括奔腾Pro:例如
cmov
fcomi
可能他们想在预订本地人时推动sub。哈哈,我喜欢这是故意的。是的,呼叫者实际上并不依赖于保留寄存器是相当常见的;它可以走任何一条路。通常,
main
的调用者是宽容的,因为它没有太多的状态,
main
本身取决于编译器优化。历史上,32位PIC代码总是使用EBX作为指向GET的指针,因此踩在EBX上几乎总是使调用程序在PIE可执行文件中崩溃。但GCC现在可以将EIP插入任何寄存器,可能不会选择EBX。(尽管如此,32位的
-fPIE
/
-fPIC
由于没有RIP相对寻址,因此效率非常低。)