3.2 实验 3-2:汇编语言练习——查找最大数
1.实验目的
通过本实验了解和熟悉 ARM64 汇编语言。
2.实验要求
使用 ARM64 汇编语言来实现如下功能:在给定的一组数中查找最大数。程序可使GCC(Aarch64 版本)工具来编译,并且可在树莓派 Linux 系统或者 QEMU + ARM64 实验平台上运行。

.section .data
.align 3
my_data:.quad 1.quad 2.quad 5.quad 8.quad 10.quad 12my_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_dataldr x1, my_data_countadd x4, x0, #40mov x3, xzr
1:ldr x2, [x0], #8cmp x2, x3csel x3, x2, x3, hicmp x0, x4b.ls 1bldr x0, =print_datamov x1, x3bl printfldp x29, x30, [sp], 16ret

运行结果:

调试信息:

在main函数里设置一个断点,并输入“r”命令运行test程序,然后就可以单步调试test程序了。输入“s”进行单步调试:

可以使用“info reg”命令来查看寄存器的值。例如查看x0寄存器的值。

3.3 实验 3-3:汇编语言练习——通过 C 语言调用汇编函数
1.实验目的
通过本实验了解和熟悉 C 语言中如何调用汇编函数。
2. 实验要求
使用汇编语言实现一个汇编函数,用于比较两个数的大小并返回最大值,然后用C 语言代码调用这个汇编函数。程序可使用 GCC(Aarch64 版本)工具来编译,并且可在树莓派 Linux 系统或者 QEMU + ARM64 实验平台上运行。

//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);
}

运行结果:

3.4 实验 3-4:汇编语言练习——通过汇编语言调用 C 函数
1.实验目的
通过本实验了解和熟悉汇编语言中如何调用 C 函数。
2.实验要求
使用 C 语言实现一个函数,用于比较两个数的大小并返回最大值,然后用汇编代码调用这个 C 函数。程序可使用 GCC(Aarch64 版本)来编译,并且可在树莓派 Linux系统或者 QEMU + ARM64 实验平台上运行。

//compare.c 文件如下。
int compare_data(int a, int b)
{
return (a >= b) ? a : b;
}
//main.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

运行结果:

3.5 实验 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);
}

运行结果:

OpenEuler树莓派基础实验 20212802范辰宇相关推荐

  1. OpenEuler安装 20212802范辰宇

    树莓派openEuler安装 安装准备 获取安装源 在安装开始前,您需要获取 openEuler 发布的树莓派镜像及其校验文件. 登录 openEuler社区网站下载链接. 单击卡片 openEule ...

  2. 树莓派4bpython串口通信解读数据_树莓派基础实验36:通用串口通信实验

    一.介绍 对于树莓派 3B+来说,他的UART功能有三种: 1.内部蓝牙使用: 2.控制终端使用: 3.与其他设备进行串口通信. 在树莓派基础实验35:USB TO TTL模块实验中学习了通过串口对树 ...

  3. 树莓派基础实验20:火焰报警传感器实验

    一.介绍    火焰传感器模块通过捕获来自火焰的红外波长来执行检测.它可以用来探测火焰是否存在,在这个实验中,我们使用火焰传感器来检测火焰并发出报警信号. 二.组件 ★Raspberry Pi主板*1 ...

  4. 树莓派基础实验18:声音传感器实验

    一.介绍    声音传感器是一种接受声波并将其转换为电信号的组件,它像麦克风一样检测周围环境中的声音强度. 二.组件 ★Raspberry Pi主板*1 ★树莓派电源*1 ★40P软排线*1 ★PCF ...

  5. 树莓派基础实验14:PS2操纵杆实验

    一.介绍    操纵杆是一种输入设备,由一根可在基座上旋转,并向其控制的设备报告其角度或方向的操纵杆组成.操纵杆通常用于控制视频游戏和机器人.这里使用操纵杆PS2. 二.组件 ★Raspberry P ...

  6. 树莓派基础实验39:解析无线电接收机PWM、SBUS信号

    一.介绍   虽然如今或者将来,5G网络的建设带来人工智能和工业自动化的全面升级,生产活动中劳动力的需求大大减少,大量的劳动力将向内容生产行业和服务行业转移.教育.医疗.娱乐.公共管理等诸多领域,乃至 ...

  7. 树莓派基础实验31:MPU6050陀螺仪加速度传感器实验

    一.介绍    MPU6050是世界上第一款也是唯一一款专为智能手机.平板电脑和可穿戴传感器的低功耗.低成本和高性能要求而设计的6轴运动跟踪设备.    它集成了3轴MEMS陀螺仪,3轴MEMS加速度 ...

  8. 树莓派基础实验16:霍尔传感器实验

    一.介绍    霍尔传感器是根据霍尔效应制作的一种磁场传感器.霍尔效应是磁电效应的一种,这一现象是霍尔(A.H.Hall,1855-1938)于1879年在研究金属的导电机构时发现的.后来发现半导体. ...

  9. 树莓派基础实验17:温度传感器实验

    一.介绍    温度传感器是检测温度并将其转换为输出信号的组件.根据材料和部件的特点,温度传感器可分为热电阻和热电偶两种,热敏电阻是前者的一种,他由半导体材料制成.大多数热敏电阻是负温度系数(NTC) ...

最新文章

  1. 访问学术网站的便捷方式
  2. $.messager.progress ajax,ajax异步上传文件返回undefined
  3. Brute Force STL --- UVA 146 ID Codes
  4. 数据埋点方案和规范确定
  5. maven国内镜像配置
  6. 10.4 route:显示或管理路由表
  7. 自行车房车,还是第一次看到,惊倒一片!
  8. 修改系统Documents and Settings目录的位置
  9. Python学习笔记:字典(dict)
  10. 干货:解码OneData,阿里的数仓之路。
  11. modbus_tk与Modubs Slave结合使用
  12. splay伸展树基础操作(bzoj 1861: [Zjoi2006]Book 书架)
  13. HTML DOM学习
  14. 亿图图示(edrawmax中文版) v10.1.7pjb
  15. 网页版excel服务器,用excel当数据库,做个简单的网页
  16. 萤火虫小程序_线上服务不断档 萤火虫水洞·地下大峡谷推出“云旅游”新体验...
  17. 如何使用word删除签名图片背景
  18. WPS---EXCEL(八)---互换两列数据
  19. 《Dreamweaver CS6 完全自学教程》笔记 第四章:创建站点
  20. [COGS 2264]魔法传输

热门文章

  1. think php 5(命令行)创建控制器、model
  2. (转)OpenGL与DirectX 比较
  3. Verilog 实现千兆网UDP协议 基于88E1111--数据发送
  4. 国产工业机器人目前发展到了什么水平?
  5. 战舰帝国服务器维护,【图片】9月17日更新公告亲爱的司令官:《战舰帝国》于9月17日维护,成功更新后可以获得200个钻石的更新补偿_战舰帝国吧_百度贴吧...
  6. 基于Go语言Gin+Xorm+Layui实现RBAC权限管理系统
  7. 灵雀云基于 OVN 的 Kubernetes 网络架构解析
  8. 风险度量、马科维茨模型的求解与衍生
  9. IBM主机系列课程之单元测试(基础篇)-李海湜-专题视频课程
  10. 解读爱奇艺Q2财报:会员数破亿,其他收入打开新增长空间?