参照实验参考数给出的代码实现arm64汇编语言实现找出最大数。将最大数设置在中间,为我的学号1320。
.section .data .align 3 my_data: .quad 1 .quad 2 .quad 5 .quad 1320 .quad 10 .quad 12 my_data_count: .quad 6 .align 3 print_data: .string "big data: %d\n" .section .text .globl main main: stp x29, x30, [sp, -16]! ldr x0, =my_data ldr x1, my_data_count add x4, x0, #40 mov x3, xzr 1: ldr x2, [x0], #8 cmp x2, x3 csel x3, x2, x3, hi cmp x0, x4 b.ls 1b ldr x0, =print_data mov x1, x3 bl printf ldp x29, x30, [sp], 16 ret
然后使用gcc test.S -o test -g --static
进行编译
运行结果为找出了最大的数:1320。
汇编程序是和机器语言最近的一种程序设计语言。对应不同的架构,汇编语言也不一样。这个汇编代码为arm64的,和以前学习的MIPS又不一样,更加复杂,功能还要多一些。
截图如下:
使用gdb --tui ./test
来进行调试。
上图为使用b main
在main函数设置断点
上图为使用run
开始运行。
上图为使用s
单步执行。
上图为使用info reg
查看某寄存器值
编辑两个代码文件:
第一个是arm汇编代码文件compare.S:
.section .text .globl compare_data compare_data: cmp x0, x1 csel x0, x0, x1, hi ret
第二个是包含主函数的C代码文件:main.c:
#include <stdio.h> extern int compare_data(int a, int b); int main() { int val; val = compare_data(1320,1234); printf("bigger data is:%d\n",val); }
然后使用gcc compare.S main.c -o compare
就可以编译。
运行结果:
由此可见,C和汇编是相通的,只要在两个文件中都把函数做好命名和定义,在编译的时候直接进行编译就可以了。
此实验和3-3很相似,这个就是反过来,比较函数用C写的,主函数用汇编写。
compare.c:
int compare_data(int a, int b) { return (a >= b) ? a : b; }
main.S
[lzh@openEuler 3-4]$ cat main.S .section .data .align 3 print_data: .string "bigger data is:%d\n" .section .text .globl main main: stp x29, x30, [sp, -16]! mov x0, #6 mov x1, #5 bl compare_data mov x1, x0 ldr x0, =print_data mov x1, x0 ldr x0, =print_data bl printf ldp x29, x30, [sp], 16 ret
运行结果:
内联汇编编译:在C代码中嵌入汇编代码。
代码:
#include <stdio.h> static int compare_data(int a, int b) { int val; asm volatile( "cmp %1, %2\n" "csel %0, %1, %2, hi\n" : "+r" (val) : "r" (a), "r"(b) : "memory"); return val; } int main() { int val; val = compare_data(5,6); printf("big data: %d\n", val); val = compare_data(1234,1320); printf("big data: %d\n", val); }
运行结果: