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

665次阅读
没有评论

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

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