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 を渡します。これは、それらを呼び出す関数が数値を 2 乗しているため、同じである必要がありますが、次の行では:

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

最初に入力した 4 の代わりに 2 が渡され、16 ではなく 13 の値が返されます。

Y86 についての私の限られた理解から、「mrmovl 8(%ebp),%ebx」は Y に等しく設定した 2 番目のパラメーターを返す必要があり、「mrmovl 12(%ebp),%edx」は X に等しい最初のパラメーターを返す必要があります。どちらも 4 として渡されます。

4

0 に答える 0