zoukankan      html  css  js  c++  java
  • 树莓派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
    "
    
    .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单步调试汇编程序

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

    上图为使用b main在main函数设置断点

    上图为使用run开始运行。

    上图为使用s单步执行。

    上图为使用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
    ",val);
    }
    

    然后使用gcc compare.S main.c -o compare就可以编译。
    运行结果:

    由此可见,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
    "
    
    .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代码中嵌入汇编代码。
    代码:

    #include <stdio.h>
    
    static int compare_data(int a, int b)
    {
            int val;
    
            asm volatile(
                            "cmp %1, %2
    "
                            "csel %0, %1, %2, hi
    "
                            : "+r" (val)
                            : "r" (a), "r"(b)
                            : "memory");
    
            return val;
    }
    
    int main()
    {
            int val;
    
            val = compare_data(5,6);
            printf("big data: %d
    ", val);
    
            val = compare_data(1234,1320);
            printf("big data: %d
    ", val);
    }
    

    运行结果:

  • 相关阅读:
    idea不显示gradle的视图解决办法
    curl: (51) Unable to communicate securely with peer: requested domain name does not match the server's certificate.报错
    记录使用yum安装nginx之后的目录问题
    已安装nginx动态添加模块
    nginx的http_sub_module模块使用之替换字符串
    利用referer属性,记录百度搜索跳转参数
    Springboot中Aspect实现切面(以记录日志为例)
    vue_axios请求封装、异常拦截统一处理
    使用jetty工具包处理url参数成map
    利用Java自带的MD5加密
  • 原文地址:https://www.cnblogs.com/Ressurection-20191320/p/15487243.html
Copyright © 2011-2022 走看看