0

私は次のように helloworld を書きます。

#include <stdio.h>
int main()
{
  uint64_t x = 0xffffffff0;
  printf("x=%llu\n", x);
  return 0;
}

私の意見では、printf は r0、r1、r2 をパラメーターとして使用し、r0 は文字列の addr、r1&r2 は x の値です (IHI0042E_aapcs.pdf によると):

C.3 If the argument requires double-word alignment (8-byte), the NCRN is rounded up to the next even 
register number. 

ただし、objdump を実行すると、asm が次のようになっていることがわかりました。

  8430:       4804            ldr     r0, [pc, #16]   ;
  8432:       f06f 020f       mvn.w   r2, #15
  8436:       b510            push    {r4, lr}
  8438:       230f            movs    r3, #15
  843a:       4478            add     r0, pc
  843c:       f7ff efda       blx     83f4 <printf@plt>

明らかに、r2 は x の下位 32 ビットとして 0xfffffff0 であり、r3 は x の上位 32 ビットです。r0 は文字列のアドレスです。では、r1 はどうでしょうか。パラメータはr0~r3? 私は混乱していました、助けてください、ありがとう!

4

0 に答える 0