做人呢,最紧要就系开心啦

ARM64基础1:用ARM汇编实现,查找给定数组的最大数

669次阅读
没有评论

如题,用 ARM 汇编实现功能,在给定数组中查找最大数

.section .data  // 定义数据段段
.align 3        // 以 2^3 对齐
my_data:        // 定义一个数据
    .quad  1
    .quad  2
    .quad  5
    .quad  8
    .quad  10
    .quad  12

my_data_count:  // 数组的个数
    .quad  6

.align  3
print_data:     // 定义一个字符串
    .string "big data: %d\n"

.section .text // 定义代码段
.globl main    // 定义入口函数 main
main:
    stp     x29, x30, [sp, -16]! //x29 是 FP 栈帧寄存器,x30 是连接寄存器,入栈

    ldr x0, =my_data // 读取 my_data 标签的地址
    ldr x1, my_data_count // 读取 my_data_count 标签内容(6)

    add x4, x0, #40  // 数组最后一个数地址,存入 x4

    mov x3, xzr      //x3 临时寄存器,初始值 0
1:
    ldr x2, [x0], #8 //x0 地址处的值(数组 my_data[0]),加载到 x2 寄存器,然后更新 x0=x0+8
    cmp x2, x3
    csel x3, x2, x3, hi //csel 条件选择,当条件满足(hi,x2>x3), 返回 x2, 存入 x3 中,否则返回 x3; x3 保存最大值

    cmp x0, x4  // 判断 x0 是否为 my_data 最后一个数
    b.ls 1b     // 有条件 (无符号小于或等于) 跳转 1b,

    ldr x0, =print_data // 加载 print_data 标签地址
    //adrp x0, print_data
    //add x0, x0, :lo12:print_data
    mov x1, x3    // 通过 x0,x1 传递参数给 printf 函数

    bl printf

    ldp  x29, x30, [sp], 16 // 从 start 函数栈恢复 x29,x30 寄存器
    ret     // 函数返回退出

交叉编译

aarch64-linux-gnu-gcc test.S -o test -g   --static

如果 qemu-linux 安装了 gcc,也可在 qemu-linux 中编译:

gcc test.S -o test -g   --static

可以在 qemu 中用 gdb 调试

gdb --tui ./test

main 函数设置断点:(gdb) b main
运行 test 程序:(gdb) r
单步运行:(gdb) s
查看寄存器值:(gdb) info reg x3
ARM64 基础 1:用 ARM 汇编实现,查找给定数组的最大数
程序运行结束,最后结果
ARM64 基础 1:用 ARM 汇编实现,查找给定数组的最大数
也可以用 qemu 直接运行 test

qemu-aarch64-static test

正文完
 
admin
版权声明:本站原创文章,由 admin 2021-11-02发表,共计1021字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)