2011-11-06 138 views
8

我知道在程序集r0中調用函數時,包含第一個參數,直到r3是第四個參數。我知道,當它超出四個時,使用堆棧指針,但我不太確定具體情況。 r0-r3是否仍然保持前四個,其餘的都在棧上?我正在看下面的程序集,試圖瞭解它是如何調用mach_msg(一個帶有7個參數的函數)。進入此代碼,R0和R1包含兩個參數Arm Assembly - 具有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個字節用於變量。那48個字節是多餘的3個參數還是全部?

回答

6

在48個字節中,12個用於額外的3個參數,其他用於局部變量。你可以在代碼中看到這個,在函數中傳遞r0到r3中的四個參數,[SP,#0x38 + var_38]中的另一個參數(如果你的算法解析爲[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 

前四個是R 0 = A,R 1 = B,R 2 = C,3 - d中,爲了,然後其餘的都以相反的順序推動,使得SP + 0是e和SP + 4是f。

如果你有說64位整數,然後,將採取兩個寄存器,這樣你就可以使用了R0-R3有四個整數或兩個整數和一個很長很長,或兩個長多頭等