1

アセンブリにこのコードがあります。

    .data
tabela:     .word   4, 2, 10, 1, 6
print:      .asciiz "The value is: %d\n"
    .text
    .globl  programa
programa:

    ########################
    Do some stuff here.
    Value on $10 is -99
    ########################


la      $4,print
move    $5,$10
lw      $25,%call16(printf)($28)
jalr    $25

このコードは以下を出力します:

The value is: -99

という事は承知しています:

la $4,print関数呼び出し ($a0) の最初のパラメーターに出力する文字列のアドレスを読み込みます

move $5,$10レジスター 10 の値 (この場合は -99) を移動して、関数呼び出しの 2 番目のパラメーターを登録します。

そして、ここに私の疑問があります。レジスタ 25 に何かをロードします。

とは%call16(printf)($28)? 文字列と数字を出力するのですが、理由がわかりません...

4

1 に答える 1

3

%call16R_MIPS_CALL16 型の明示的な再配置を挿入するようにアセンブラに指示します。これは、指定された関数 (この場合は ) の GOT エントリに対する 16 ビット幅の再配置printfです。再配置は基本的に「オフセット0xの値を...シンボルprintfが格納されているメモリ位置に置き換える」と言います。jalrに格納されているアドレスにジャンプし$25ます。

PS。場合によっては (VxWorks など)、ELF バイナリが PIC を使用せず、R_MIPS_CALL16 再配置が.got.pltセクション内のエントリを指すことがありますが、アセンブラの使用はまったく変わりません。

于 2012-04-16T15:01:42.490 に答える