汇编函数完成对参数的处理

在C代码里面,函数的变量除了常规变量,也有指针类型变量。这里,我介绍一下汇编里面对参数是指针类型和整型的处理

直接上代码,代码里有详细的注释:

汇编函数代码:


.data
    format: .asciz "%llx %llx %llx\n"
    format_int: .asciz "%d %d\n"

.text

.global print_int
print_int:
    sub sp, sp, 64 // sp = sp - 16 , 申请16 bytes的栈空间
    stp x29, x30, [sp, 0] // 将 FP(x29), LR(x30) 保存在栈底
    //add x29, sp, 0 // 新的栈底
    mov x29, sp

    mov x2, x1
    mov x1, x0

    ldr x0, =format_int
    bl printf
    
    mov w0, 0 // 返回值
    ldp x29, x30, [sp, 0] // 将旧的栈底和返回代码恢复
    add sp, sp, 64 // 将栈顶恢复
    ret


.global print_arry
print_arry:
    sub sp, sp, 64 // sp = sp - 16 , 申请16 bytes的栈空间
    stp x29, x30, [sp, 0] // 将 FP(x29), LR(x30) 保存在栈底
    //add x29, sp, 0 // 新的栈底
    mov x29, sp

    str x0, [sp, 16]        //x0保存的是传进来的参数指针,将该指针保存到 sp+16偏移处
    ldr x10, [sp, 16]       //将sp+16偏移处的值加载到x10寄存器里面
    ldr x10, [x10]          //将x10寄存器里面的值对应内存的值加载到x10寄存器里面    加载完毕后,x10就是指针指向的第一个元素
    str x10, [sp, 24]

    ldr x10, [sp, 16]
    ldr x10, [x10, 8]
    str x10, [sp, 32]

    ldr x10, [sp, 16]
    ldr x10, [x10, 16]
    str x10, [sp, 40]

    ldr x0, =format
    ldr x1, [sp, 24]
    ldr x2, [sp, 32]
    ldr x3, [sp, 40]
    bl printf

    mov w0, 0 // 返回值
    ldp x29, x30, [sp, 0] // 将旧的栈底和返回代码恢复
    add sp, sp, 64 // 将栈顶恢复
    ret

c代码:

#include <stdio.h>

extern int print_arry(unsigned long int *arry);
extern int print_int(int num1, int num2);


int main(int argc, char *argv[])
{
    unsigned long int arry[5] = {0x1111111111111111,0x2222222222222222,0x3333333333333333,0x4444444444444444,0x5555555555555555};
    printf("this is main.\n");
    print_arry(arry);
    print_int(111, 222);
    return 0;
}

编译脚本:

#!/bin/sh

ARM_GCC_PATH=/home/CN/qidong.liu/qualcom/820a/apq8096au-lv-4-0_hlos_dev/apps_proc/poky/build/tmp-glibc/sysroots/x86_64-linux/usr/bin/aarch64-agl-linux
ARM_SYSROOT=/home/CN/qidong.liu/qualcom/820a/apq8096au-lv-4-0_hlos_dev/apps_proc/poky/build/tmp-glibc/sysroots/8x96autodvrs

export PATH=$PATH:$ARM_GCC_PATH

aarch64-agl-linux-gcc func.S hello.c -o hello --sysroot=$ARM_SYSROOT

程序执行结果:

root@8x96autodvrs:/data# ./hello
this is main.
1111111111111111 2222222222222222 3333333333333333
111 222
root@8x96autodvrs:/data#

说明:在汇编函数里面,我们只打印了该函数参数对应指针前3个元素

先保存一下,本文还未完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

monkey_llll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值