我是 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 传入。