基于树莓派+openeuler平台

实验 3-2:汇编语言练习——查找最大数

1.实验目的

通过本实验了解和熟悉 ARM64 汇编语言。

2.实验要求

使用 ARM64 汇编语言来实现如下功能:在给定的一组数中查找最大数。程序可使用GCC(Aarch64 版本)工具来编译,并且可在树莓派 Linux 系统或者 QEMU + ARM64 实验平台上运行。

实验代码:

.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 //函数返回退出

使用指令 gcc 3-2.s -o 3-2 -g 进入gdb调试

main函数设置断点:(gdb) b main

运行test程序:(gdb) r

单步运行:(gdb) s

查看寄存器值:(gdb) info reg x3

查看运行结果:

实验 3-3:汇编语言练习——通过 C 语言调用汇编函数

1.实验目的

通过本实验了解和熟悉 C 语言中如何调用汇编函数。

2. 实验要求

使用汇编语言实现一个汇编函数,用于比较两个数的大小并返回最大值,然后用C 语言代码调用这个汇编函数。程序可使用 GCC(Aarch64 版本)工具来编译,并且可在树莓派 Linux 系统或者 QEMU + ARM64 实验平台上运行。

3、代码

//compare.s:

.section .text
.globl compare_data
compare_data:
cmp x0, x1
csel x0, x0, x1, hi # 条件选择指令
ret

//main.c

#include <stdio.h>

extern int compare_data(int a, int b);

int main()
{
int val; val = compare_data(5, 6); printf("big data: %d\n", val);
}

编译指令gcc -o main main.c compare.S --static -g # -g 包含调试信息

运行结果如图:

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

1.实验目的

通过本实验了解和熟悉汇编语言中如何调用 C 函数。

2.实验要求

使用 C 语言实现一个函数,用于比较两个数的大小并返回最大值,然后用汇编代码调用这个 C 函数。程序可使用 GCC(Aarch64 版本)来编译,并且可在树莓派 Linux系统或者 QEMU + ARM64 实验平台上运行。

代码:

3-4compare.c

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

3-4main.s

.section .data
.align 3 print_data:
.string "big data: %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
bl printf ldp x29, x30, [sp], 16
ret

编译指令gcc -o 3-4main 3-4compare.c 3-4main.s --static -g

运行结果:

实验 3-5:汇编语言练习——GCC 内联汇编

1.实验目的

通过本实验了解和熟悉 GCC 内联汇编的使用。

2.实验要求

使用 GCC 内联汇编实现一个函数,用于比较两个数的大小并返回最大值,然后用 C 语言代码调用这个函数。程序可使用 GCC(Aarch64 版本)工具来编译,并且可在树莓派 Linux 系统或者 QEMU + ARM64 实验平台上运行。

代码:

#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(6, 4);
printf("big data: %d\n", val); }

编译指令gcc -o 3-5main 3-5main.c -g

运行结果:

实验 3-6:在树莓派上编写一个裸机程序

环境准备

在不同的平台上进行工程构建的时候,首先需要准备下面的环境:

1.arm交叉编译工具链

2.可用执行makefile的工具

交叉编译工具链arm-none-eabi-gcc-5.4.1可以在官网上进行下载,也可以到网盘中下载:

链接:https://pan.baidu.com/s/1ad3d-pl4YbpgYrxKg6mX9g

提取码:f3cm

树莓派一个

2.树莓派4B的硬件配置

树莓派4b的性能非常强,运行Android和win10也毫无压力。

1.5GHz 4核心64位 ARM Cortex-A72 CPU (~3×倍性能)

1GB/2GB/4GB LPDDR4 SDRAM 内存

全吞吐量千兆以太网

双频 802.11ac 无线网络

蓝牙 5.0

两个 USB 3.0 和两个 USB 2.0 接口

双显示器支持,分辨率高达 4K

VideoCore VI 显卡,支持 OpenGL ES 3.x

HEVC 视频 4Kp60 硬解码

源代码下载

源代码工程已经在GitHub存在了,相关源码可以在如下地址中找到:

https://github.com/bigmagic123/raspi4-bare-metal.git

在arm/1.compilation_environment中可以看到相关的文件列表。

该代码的功能是启动跳转到c代码去执行,然后串口输出hello world程序。

树莓派硬件链接

树莓派4需要准备一张空的SD卡、一个串口线输出信息、一条TYPEC线供电。

首先需要将工程目录的sd_boot下面的文件放到空的SD卡目录中。然后将编译好的kernel7.img放到SD卡中即可。

接着连接串口,给开发板上电,可以在putty等软件看见串口输出信息。

由于目前没有空闲的sd卡,所以最后一步操作将日后完成。

奔跑吧linux-第三章实验的更多相关文章

  1. linux第三章学习笔记

    第三章 进程管理 进程是Unix操作系统抽象概念中最基本的一种. 进程管理是所有操作系统的心脏所在. 一.进程 1. 进程是处于执行期的程序.除了可执行程序代码,还包括打开的文件.挂起的信号.内核内部 ...

  2. 2013337朱荟潼 Linux第三章读书笔记——进程管理

    第三章 进程管理 总结 fork创造的子进程复制了父进程资源,包括内存及进程描述符的内容,资源的复制而不是指针的复制. vfork的行为更像一个线程(指没有自已独立的内存空间),更明显的是vfork的 ...

  3. 20135320赵瀚青LINUX第三章读书笔记

    第三章 进程管理 3.1 进程 进程的定义: 是处于执行期的程序以及它所包含的资源的总称. 线程的定义: 是在进程中活动的对象. 每个线程都拥有一个独立的程序计数器.进程栈和一组进程寄存器. 内核调度 ...

  4. Linux第三次实验报告

    北京电子科技学院(BESTI) 实     验    报     告 课程:信息安全系统设计基础             班级:201352 姓名:池彬宁 贺邦 学号:20135212 2013520 ...

  5. Linux第三章-Linux搭建Java环境

    本文安装系统是基于 CentOS 7 版本及以上 一.安装JDK 1.先去 Oracle官网 下载Linux1.8的版本以 .tar.gz 为后缀的文件,我这里用的是 jdk-8u181-linux- ...

  6. 《Linux内核设计与实现》读书笔记 第三章 进程管理

    第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...

  7. 《Linux内核设计与实现》课本第三章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第三章自学笔记 进程管理 By20135203齐岳 进程 进程:处于执行期的程序.包括代码段和打开的文件.挂起的信号.内核内部数据.处理器状态一个或多个具有 ...

  8. 《linux内核设计与实现》读书笔记第三章

    第3章 进程管理 3.1 进程 1.进程 进程就是处于执行期的程序. 进程包括: 可执行程序代码 打开的文件 挂起的信号 内核内部数据 处理器状态 一个或多个具有内存映射的内存地址空间 一个或多个执行 ...

  9. 《Linux命令行与shell脚本编程大全》 第三章 学习笔记

    第三章:基本的bash shell命令 bash程序使用命令行参数来修改所启动shell的类型 参数 描述 -c string 从string中读取命令并处理他们 -r 启动限制性shell,限制用户 ...

随机推荐

  1. Java学习笔记--常用容器

    容器 1. 出现原因 解决程序运行时需要创建新对象,在程序运行前不知道运行的所需的对象数量甚至是类型的问题. Java中提供了一套集合类来解决这些问题包括:List.Set.Queue.Map 2. ...

  2. golang指针接收者和值接收者方法调用笔记

    初学go时很多同学会把 值接收者 和 指针接收者 的方法相互调用搞混淆,好多同学都只记得指针类型可以调用值接收者方法和指针接收者方法,而值类型只能调用值接收者方法,其实不然,在某些情况下,值类型也是可 ...

  3. json包中的Marshal&Unmarshal 文档译本

    Marshal func Marshal(v interface{})([]byte, error) Marshal returns the JSON encoding of v. Marshal返回 ...

  4. scrum项目冲刺_day08总结

    摘要:今日完成任务. 1.短信服务正在进行 2.注册登录功能基本实现,但缺少短信验证 3.导航在进行 4.搜索功能基本完成 总任务: 一.appUI页面(已完成) 二.首页功能: 1.图像识别功能(已 ...

  5. HTML音乐悬浮播放器

    话不多说先上代码 <link rel="stylesheet" href="http://47.102.203.92/css/APlayer.min.css&quo ...

  6. java中链表和数组的区别?

    综述:数组是线性结构,可以直接索引,即要去第i个元素,a[i]即可.链表也是线性结构,要取第i个元素,只需用指针往后遍历i次就可.貌似链表比数组还要麻烦些,而且效率低些. 想到这些相同处中的一些细微的 ...

  7. PHP获取目录中的全部内容RecursiveDirectoryIterator

    这次我们来介绍一个SPL库中的目录迭代器,它的作用其实非常简单,从名字就可以看出来,就是获取指定目录下的所有内容.之前我们要遍历目录获取目录及目录下的所有文件一般是需要进行递归遍历的,自己写这个代码说 ...

  8. EcShop调用显示指定分类下的子分类方法

    ECSHOP首页默认的只有全部分类,还有循环大类以及下面小类的代码,貌似没有可以调用显示指定大类下的子分类代码.于是就有这个文章的产生了,下面由夏日博客来总结下网站建设过程中ECSHOP此类问题的网络 ...

  9. disruptor笔记之三:环形队列的基础操作(不用Disruptor类)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  10. css布局宽度自适应

    随着各种终端的不断涌现,网页中的元素适应不同的分辨率变得特别重要,根据经验,涉及到宽度自适应的一共有四种情况: 左端固定,右边自适应:右端固定,左边自适应:两端固定,中间自适应:中间固定,两端自适应. ...