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?
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
Đúng vậy, đó là ý nghĩa của '[sp]'. –