私は 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 を渡します。これは、それらを呼び出す関数が数値を 2 乗しているため、同じである必要がありますが、次の行では:
mrmovl 12(%ebp),%edx #edx = x
最初に入力した 4 の代わりに 2 が渡され、16 ではなく 13 の値が返されます。
Y86 についての私の限られた理解から、「mrmovl 8(%ebp),%ebx」は Y に等しく設定した 2 番目のパラメーターを返す必要があり、「mrmovl 12(%ebp),%edx」は X に等しい最初のパラメーターを返す必要があります。どちらも 4 として渡されます。