Je sais que lors de l'appel d'une fonction dans l'assemblage, r0 contient le premier argument jusqu'à r3 étant le quatrième. Je sais que quand il dépasse quatre, le pointeur de la pile est utilisé mais je ne suis pas trop sûr des détails. Est-ce que r0-r3 détient encore les quatre premiers et le reste va sur la pile? Je regarde le morceau d'assemblage suivant essayant de comprendre ce qu'il fait pour appeler mach_msg (une fonction avec sept arguments). À l'entrée de ce code, r0 et r1 contiennent les deux argumentsArm Assembly - Fonction d'appel avec plus de 4 arguments
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}
Voici les définitions pour les choses sont appelées et utilisées:
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);
D'après ce que je comprends, le pointeur de la pile est inversée 48 octets pour les variables. Est-ce 48 octets pour les 3 arguments supplémentaires ou pour chacun d'eux?
donc faire les arguments restants commencent à partir du début du pointeur de pile? – user1000039
À droite, c'est ce que '[sp]' veut dire. –