2011-11-06 34 views
8

アセンブリr0の関数を呼び出すときにr3までの最初の引数が4番目のものであることがわかります。私はそれが4を越えるときスタックポインターが使用されていることを知っているが、私は詳細についてはあまり確かではない。 r0〜r3はまだ最初の4つを保持していますが、残りはスタック上にありますか?私はmach_msg(7つの引数を持つ関数)を呼び出すために何をしているのかを理解しようとしている次のアセンブリを見ています。このコードへのエントリで、R0とR1はものの定義が呼ばれ、使用されているここでは、2つの引数アームアセンブリ - 4つ以上の引数を持つ呼び出し関数

var_38   = -0x38 
var_34   = -0x34 
var_30   = -0x30 
var_2C   = -0x2C 
var_24   = -0x24 
var_20   = -0x20 
var_18   = -0x18 
var_14   = -0x14 
var_10   = -0x10 
var_C   = -0xC 
00001220 
00001220     PUSH   {R7,LR} 
00001222     MOV    R7, SP 
00001224     SUB    SP, SP, #0x30 
00001226     MOV    R2, (_NDR_record_ptr - 0x1232) ; _NDR_record_ptr 
0000122E     ADD    R2, PC ; _NDR_record_ptr 
000LDR    R2, [R2] ; _NDR_record 
000LDR    R3, [R2] 
000LDR    R2, [R2,#4] 
000STR    R2, [SP,#0x38+var_10] 
000MOVS   R2, #0x24 ; '$' 
0000123A     STR    R3, [SP,#0x38+var_14] 
0000123C     MOVS   R3, #0 
0000123E     STRB.W   R1, [SP,#0x38+var_C] 
00001242     MOVS   R1, #0x13 
00001244     STR    R1, [SP,#0x38+var_2C] 
00001246     MOVS   R1, #1 
00001248     STR    R0, [SP,#0x38+var_24] 
0000124A     MOV    R0, 0x1E84EA 
00001252     STR    R3, [SP,#0x38+var_20] 
00001254     STR    R3, [SP,#0x38+var_38] 
00001256     STR    R3, [SP,#0x38+var_34] 
00001258     STR    R0, [SP,#0x38+var_18] 
0000125A     STR    R3, [SP,#0x38+var_30] 
0000125C     ADD    R0, SP, #0x38+var_2C 
0000125E     BLX    _mach_msg 
00001262     ADD    SP, SP, #0x30 
00001264     POP    {R7,PC} 

が含まれています。私が理解から

typedef struct { 
    unsigned char  mig_vers; 
    unsigned char  if_vers; 
    unsigned char  reserved1; 
    unsigned char  mig_encoding; 
    unsigned char  int_rep; 
    unsigned char  char_rep; 
    unsigned char  float_rep; 
    unsigned char  reserved2; 
} NDR_record_t; 
extern NDR_record_t NDR_record; 
extern mach_msg_return_t mach_msg(
       mach_msg_header_t *msg, 
       mach_msg_option_t option, 
       mach_msg_size_t send_size, 
       mach_msg_size_t rcv_size, 
       mach_port_name_t rcv_name, 
       mach_msg_timeout_t timeout, 
       mach_port_name_t notify); 

、スタックポインタが逆転されています変数は48バイト。余分な3つの引数、またはそれらのすべてのための48バイトですか?

答えて

6

48バイトのうち、12は余分な3つのパラメータ用であり、その他はローカル変数用です。コードでは、関数がr0〜r3の4つのパラメータ、[SP、#0x38 + var_38]の4つのパラメータ([sp]だけで解決する場合)、[sp、#4 ]、最後は[sp、#8]にあります。

+0

を言っている場合残りの引数はスタックポインタの先頭から始まりますか? – user1000039

+0

そうです、それは '[sp]'の意味です。 –

0

私は、レジスタ(r0〜r3または4ワード)を通過できる数はレジスタを介して渡されることを覚えています。残りはスタックに通されます。

1
unsigned int fun 
(
    unsigned int a, 
    unsigned int b, 
    unsigned int c, 
    unsigned int d, 
    unsigned int e, 
    unsigned int f 
) 
{ 
    a+=1; 
    a|=b+2; 
    a&=c+4; 
    a^=d+5; 
    a-=e+6; 
    a|=~f; 
    return(a); 
} 


00000000 <fun>: 
    0: e2800001 add r0, r0, #1 
    4: e2811002 add r1, r1, #2 
    8: e181c000 orr ip, r1, r0 
    c: e2822004 add r2, r2, #4 
    10: e002100c and r1, r2, ip 
    14: e59d0000 ldr r0, [sp] 
    18: e2833005 add r3, r3, #5 
    1c: e023c001 eor ip, r3, r1 
    20: e59d1004 ldr r1, [sp, #4] 
    24: e060200c rsb r2, r0, ip 
    28: e2420006 sub r0, r2, #6 
    2c: e1e03001 mvn r3, r1 
    30: e1800003 orr r0, r0, r3 
    34: e12fff1e bx lr 

最初の4つであるR0 = A、R1 = R2 = C、R 3 B - D、順番に、そのSP + 0 eおよびSP + 4であるので、次に、残りは逆の順序で押されfです。

これを行うなど、あなたが4つのint型または2つのintと長い長い、または2つの長いlong型でR0-R3を使用することができますので、2つのレジスタかかりますその後、64ビット整数、