Arm Assembly - 调用具有4个以上参数的函数

use*_*039 8 assembly stack arm disassembly

我知道在程序集中调用函数时,r0包含第一个参数,直到r3为第四个参数.我知道当它超过四时,使用了堆栈指针,但我对具体细节不太确定.r0-r3是否仍然保持前四个,其余的是堆栈?我正在看下面的程序集试图理解它正在做什么来调用mach_msg(一个带有七个参数的函数).在输入此代码时,r0和r1包含两个参数

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
00001230                 LDR             R2, [R2] ; _NDR_record
00001232                 LDR             R3, [R2]
00001234                 LDR             R2, [R2,#4]
00001236                 STR             R2, [SP,#0x38+var_10]
00001238                 MOVS            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}
Run Code Online (Sandbox Code Playgroud)

以下是调用和使用的东西的定义:

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);
Run Code Online (Sandbox Code Playgroud)

根据我的理解,堆栈指针正在被反转48个字节的变量.额外的3个参数或所有这些参数是48个字节吗?

Ray*_*hen 6

在48个字节中,12个用于额外的3个参数,其他用于局部变量.您可以在代码中看到这个函数,其中函数在r0到r3中传递四个参数,另一个在[SP,#0x38 + var_38]中(如果您将数学解析为[sp]),另一个在[sp,#4]中],[sp,#8]中的最后一个.