如题,用 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
程序运行结束,最后结果
也可以用 qemu 直接运行 test
qemu-aarch64-static test
正文完