鸿蒙内核源码分析(汇编传参篇) | 如何传递复杂的参数

文章详细介绍了在汇编编程中,如何处理复杂参数(如结构体)的传递过程,包括栈空间的分配、寄存器与栈内存的交互,以及在C语言与汇编之间的转换。着重展示了结构体在main函数和framePoint函数栈帧中的存储和调用细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

汇编如何传复杂的参数?

汇编基础篇 中很详细的介绍了一段具有代表性很经典的汇编代码,有循环,有判断,有运算,有多级函数调用。但有一个问题没有涉及,就是很复杂的参数如何处理?

在实际开发过程中函数参数往往是很复杂的参数,(比如结构体)汇编怎么传递呢?

先看一段C语言及汇编代码,传递一个稍微复杂的参数来说明汇编传参的过程

#include <stdio.h>
#include <math.h>
struct reg{//参数远超寄存器数量
    int Rn[100]; 
    int pc;
};

int framePoint(reg cpu)
{
    return cpu.Rn[0] * cpu.pc;
}

int main()
{
    reg cpu;
    cpu.Rn[0] = 1;
    cpu.pc = 2;
    return framePoint(cpu);
}


//编译器: armv7-a gcc (9.2.1)
framePoint(reg):
        sub     sp, sp, #16     @申请栈空间
        str     fp, [sp, #-4]!  @保护main函数栈帧,等同于push {fp}
        add     fp, sp, #0      @fp变成framePoint栈帧,同时也指向了栈顶
        add     ip, fp, #4      @定位到入栈口,让4个参数依次入栈 
        stm     ip, {r0, r1, r2, r3}@r0-r3入栈保存
        ldr     r3, [fp, #4]    @取值cpu.pc = 2    
        ldr     r2, [fp, #404]  @取值cpu.Rn[0] = 1
        mul     r3, r2, r3      @cpu.Rn[0] * cpu.pc
        mov     r0, r3          @返回值由r0保存
        add     sp, fp, #0      @重置sp,和add     fp, sp, #0配套出现
        ldr     fp, [sp], #4    @恢复main函数栈帧
        add     sp, sp, #16     @归还栈空间,sp回落到main函数栈顶位置
        bx      lr              @跳回main函数
main:
        push    {fp, lr}        @入栈保存调用函数现场                     
        add     fp, sp, #4      @fp指向sp+4,即main栈帧的底部
        sub     sp, sp, #800    @分配800个线性地址,即main栈帧的顶部
        mov     r3, #1          @r3 = 1
        str     r3, [fp, #-408] @将1放置 fp-408处,即:cpu.Rn[0]处
        mov     r3, #2          @r3 = 2
        str     r3, [fp, #-8]   @将2放置 fp-8处,即:cpu.pc
        mov     r0, sp          @r0 = sp
        sub     r3, fp, #392    @r3 = fp - 392
        mov     r2, #388        @只拷贝388,剩下4个由寄存器传参
        mov     r1, r3        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值