HP-UXで逆アセンブルされたPhrackの記事を読んでいたところです。HP-UXとSPARCで可能な2つのクラスの関数があることを読みました。リーフおよび非リーフ関数。以下は私がここから取った分解のセクションです。
(gdb) disass leaf
Dump of assembler code for function foo:
0x3280 <leaf>: copy r3,r1
0x3284 <leaf+4>: copy sp,r3
0x3288 <leaf+8>: stw,ma r1,40(sr0,sp)
0x328c <leaf+12>: stw r26,-24(sr0,r3)
0x3290 <leaf+16>: stw r0,8(sr0,r3)
0x3294 <leaf+20>: ldi 1,r19
0x3298 <leaf+24>: stw r19,8(sr0,r3)
0x329c <leaf+28>: ldo 40(r3),sp
0x32a0 <leaf+32>: ldw,mb -40(sr0,sp),r3
0x32a4 <leaf+36>: bv,n r0(rp)
End of assembler dump.
(gdb)
通常、関数が呼び出されると、関数の実行が終了すると、プログラムが制御をどこに戻すかをプログラムが認識できるように、リターンアドレスがスタックにプッシュされます。これらの葉の機能の場合、それはどのように機能しますか?
私はHP-UX/SPARCマシンにアクセスできないので、これを自分で試す方法はありません(同じ理由で、この場合のアセンブリもよくわかりません)。
この場合、制御が呼び出し先関数にどのように戻るかを誰かが説明できますか?