基于树莓派+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. C语言学习笔记---1.C语言概述

    1.典型C程序结构 2.C程序细节 2.1#include指令和头文件 #include这行代码是一条C预处理器指令(preprocessor directive).通常,C编译器在编译前会对源代码做 ...

  2. Lua io.lines()

    前言# 从文章的题目可以看出,今天的内容是和文件的行相关的,其实这个函可以看成是一个文件读取函数,只不过文件读取的形式固定了,就是只能一行一行的读,接下来我们就一起来看看这个函数究竟要怎么使用. 内容 ...

  3. 离散化模板题 I ——重复元素离散化后的数字相同

    离散化模板题 I --重复元素离散化后的数字相同 题目描述 现有数列A1, A2, ⋯, An,数列中可能有重复元素. 现在要求输出该数列的离散化数列,重复元素离散化后的数字相同.  输入 第一行,一 ...

  4. [原创]OpenEuler20.03安装配置PostgreSQL13.4详细图文版

    OpenEuler安装配置PostgreSQL 编写时间:2021年9月18日 作者:liupp 邮箱:liupp@88.com 序号 更新内容 更新日期 更新人 1 完成第一至三章内容编辑: 202 ...

  5. find_elements与find_element的区别

    find_element不能使用len,find_elements可以使用len获取元素数量,判断页面有无某个元素,这个方法可以用来断言. 如添加用户后,判断是否添加成功. 删除用户后,判断是否删除成 ...

  6. Css3 3D 旋转动画效果

    需求: 1.一个列表滑动效果为360 旋转 准备: 1.css 基础 2.Css 动画基础animation 3.transform-style概念 4 transform 概念 5 JavaScri ...

  7. 【C++ Primer Plus】编程练习答案——第12章

    1 // chapter12_1_cow.h 2 3 4 #ifndef LEARN_CPP_CHAPTER12_1_COW_H 5 #define LEARN_CPP_CHAPTER12_1_COW ...

  8. Bert文本分类实践(一):实现一个简单的分类模型

    写在前面 文本分类是nlp中一个非常重要的任务,也是非常适合入坑nlp的第一个完整项目.虽然文本分类看似简单,但里面的门道好多好多,作者水平有限,只能将平时用到的方法和trick在此做个记录和分享,希 ...

  9. 基于python深度学习的apk风险预测脚本

    基于python深度学习的apk风险预测脚本 为了有效判断安卓apk有无恶意操作,利用python脚本,通过解包apk文件,对其中xml文件进行特征提取,通过机器学习构建模型,预测位置的apk包是否有 ...

  10. Python实现九九乘法表