アセンブリ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バイトですか?
を言っている場合残りの引数はスタックポインタの先頭から始まりますか? – user1000039
そうです、それは '[sp]'の意味です。 –