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

如题,用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
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值