如题,用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