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

发布时间:2022-07-01 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了树莓派汇编语言程序设计入门实验脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

实验3-2 查找最大数

编写汇编代码

参考指导书,编写实现查找最大数功能的汇编代码,将我学号后四位1218作为最大数

.section .data
.align 3
my_data:
	.quad 1
	.quad 2
	.quad 5
	.quad 1218
	.quad 10
	.quad 12

my_data_count:
	.quad 6

.align 3 
PRint_data:
	.string "Big data: %dn"

.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

编译运行

汇编代码 上学期我们在计算机组成原理课上曾学习过MIPS架构,再结合这学期在ARM架构的树莓派上实践,总结MIPS和ARM有如下区别:

  • MIPS指令很简单,格式很规整,就可以做很快(频率很高)。这符合RISC的初衷,但是功耗可能会比较大些(和频率有关),然后编译生成的代码很长(你不得不用一点的Cache )。

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

  • ARM指令很复杂,而且路实现起来会比精简的指令相对复杂,当面积和功耗优先级高时,最高运行频率可能不会太高。

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

下面使用gcc maxnum.s -o maxnum -g --static进行编译,运行结果如下

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

成功找出最大数

使用GDB单步调试汇编程序

发现OPEnEuler操作系统并没有安装gdb,于是sudo yum install gdb

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

使用gdb --tui ./maxnum来进行调试。

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

使用b main在主函数设置断点

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

使用run

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

使用ns单步执行

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

使用info reg xn查看寄存器的值

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

实验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(1218,1111);

        printf("bigger data is:%dn",val);
}

使用gcc compare.s main.c -o compare编译

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

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

和实验3-3类似,相当于反过来,比较函数用C写的,主函数用汇编写 compare.c:

int compare_data(int a, int b)
{
        return (a >= b) ? a : b;
}

main.s

.section .data
.align 3

print_data:
        .string "bigger data is:%dn"

.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

运行结果如下

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

实验3-5 gcc内联汇编

内联汇编编译即在C代码中嵌入汇编代码 测试代码test.c如下:

#include <stdio.h>

static int compare_data(int a, int b)
{
        int val;

        asm volatile(
                        "cmp %1, %2n"
                        "csel %0, %1, %2, hin"
                        : "+r" (val)
                        : "r" (a), "r"(b)
                        : "memory");

        return val;
}

int main()
{
        int val;

        val = compare_data(5,6);
        printf("big data: %dn", val);

        val = compare_data(1111,1218);
        printf("big data: %dn", val);
}

运行结果

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

脚本宝典总结

以上是脚本宝典为你收集整理的树莓派汇编语言程序设计入门实验全部内容,希望文章能够帮你解决树莓派汇编语言程序设计入门实验所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。