0

我是 Y86 的新手,正在尝试编写递归乘法函数,但不断传递错误的参数。

调用乘法函数的代码:

  square:
  irmovl $4, %ebx
  pushl  %ebx           # push argument
  rrmovl %ebx, %edx   #set it equal to the number being squared 
  pushl  %edx

  call rmult

  popl %edx  
  popl %ebx
  ret

和实际的乘法代码:

rmult:
pushl %ebp
rrmovl %esp,%ebp
mrmovl 8(%ebp),%ebx         #ebx = y
irmovl $0,%eax      
rrmovl %ebx,%edi    
subl %ebx,%eax      
je rec_multend

rrmovl %ebx,%esi
irmovl $1,%eax      
subl %eax,%esi      

pushl %ebx      
pushl %esi      
call rmult 
mrmovl 12(%ebp),%edx    #edx = x
popl %esi
popl %ebx


addl %edx,%edi 
rec_multend:
 popl %ebp
 ret

我为 x 和 y 都传入了 4,因为调用它们的函数是一个数字的平方,所以它们应该是相同的,但是在一行:

mrmovl 12(%ebp),%edx    #edx = x

它传入 2 而不是我最初放入的 4,最终返回值 13 而不是 16。

根据我对 Y86 的有限理解,“mrmovl 8(%ebp),%ebx”应该返回我设置为等于 Y 的第二个参数,“mrmovl 12(%ebp),%edx”应该返回等于 X 的第一个参数,两者都作为 4 传入。

4

0 回答 0