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

交叉编译

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

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

gcc test.S -o test

可以在qemu中用gdb调试

gdb --tui ./test

main函数设置断点:(gdb) b main

运行test程序:(gdb) r

单步运行:(gdb) s

查看寄存器值:(gdb) info reg x3

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


程序运行结束,最后结果

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


也可以用qemu直接运行test

qemu-aarch64-static test