2011-11-06 26 views
8

Tôi biết rằng khi gọi một hàm trong assembly r0 chứa đối số đầu tiên lên đến r3 là số thứ tư. Tôi biết rằng khi nó vượt quá bốn con trỏ ngăn xếp được sử dụng nhưng tôi không quá chắc chắn về các chi tiết cụ thể. Có r0-r3 vẫn giữ bốn đầu tiên và phần còn lại đi trên ngăn xếp? Tôi đang tìm kiếm phần sau của hội đồng cố gắng để hiểu những gì nó đang làm để gọi mach_msg (một chức năng với bảy đối số). Trên nhập cảnh vào mã này, r0 và r1 chứa hai đốiLắp ráp cánh tay - Chức năng gọi với hơn 4 đối số

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} 

Dưới đây là các định nghĩa cho những thứ được gọi và sử dụng:

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); 

Từ những gì tôi hiểu, con trỏ ngăn xếp đã được đảo ngược 48 byte cho biến. Có phải là 48 byte cho thêm 3 đối số hoặc cho tất cả chúng không?

Trả lời

6

Trong số 48 byte, 12 cho 3 thông số bổ sung và các giá trị khác dành cho biến cục bộ. Bạn có thể thấy điều này trong mã nơi hàm truyền bốn tham số trong r0 đến r3, một hàm khác trong [SP, # 0x38 + var_38] (nếu bạn thực hiện phép toán chỉ [sp]), một hàm khác trong [sp, # 4 ] và cuối cùng trong [sp, # 8].

+0

Vì vậy, làm các đối số còn lại bắt đầu từ đầu con trỏ ngăn xếp? – user1000039

+0

Đúng vậy, đó là ý nghĩa của '[sp]'. –

0

tôi nhớ, nhiều nhất có thể được chuyển qua thanh ghi (r0-r3 hoặc 4 từ) được chuyển qua thanh ghi. và phần còn lại được chuyển qua ngăn xếp.

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 

Bốn đầu tiên là r0 = a, r1 = b, r2 = c, r3 - d, theo thứ tự, và sau đó là phần còn lại được đẩy theo thứ tự ngược để sp + 0 là e và sp + 4 là f.

Nếu bạn có nói một số nguyên 64 bit sau đó sẽ đưa hai thanh ghi, vì vậy bạn có thể sử dụng lên r0-r3 với bốn ints hoặc hai ints và lâu dài, hoặc hai chờ đợi lâu, vv

Các vấn đề liên quan