树莓派ARM64汇编语言程序设计入门

实验3-2 查找最大数

编写汇编代码并编译运行

参照实验参考数给出的代码实现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又不一样,更加复杂,功能还要多一些。
截图如下:
树莓派ARM64汇编语言程序设计入门

使用gdb单步调试汇编程序

使用gdb --tui ./test来进行调试。
树莓派ARM64汇编语言程序设计入门
上图为使用b main在main函数设置断点
树莓派ARM64汇编语言程序设计入门
上图为使用run开始运行。
树莓派ARM64汇编语言程序设计入门
上图为使用s单步执行。
树莓派ARM64汇编语言程序设计入门
上图为使用info reg查看某寄存器值

实验3-3 通过C语言调用汇编函数

编辑两个代码文件:
第一个是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就可以编译。
运行结果:
树莓派ARM64汇编语言程序设计入门
由此可见,C和汇编是相通的,只要在两个文件中都把函数做好命名和定义,在编译的时候直接进行编译就可以了。

实验3-4 通过汇编语言调用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

运行结果:
树莓派ARM64汇编语言程序设计入门

实验3-5 gcc内联汇编

内联汇编编译:在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);
}

运行结果:
树莓派ARM64汇编语言程序设计入门

上一篇:【Python】解决pip install pycups -U失败的问题


下一篇:ARM架构软件安装--node