树莓派ARM汇编语言编程十讲(第1讲)
内容简介
树莓派单板机(Raspberry Pi Single Computer)是一种极了不起的产品,用户可以以非常低的成本获得一个Linux环境并带GPIO硬件扩展的迷你计算机系统。新一代树莓派4B还提供了良好的工业物联网和AIoT支持。树莓派单板机拥有完整的生态链,软硬件资源丰富,是嵌入式系统开发和智能硬件产品创新的很好选择。
作为嵌入式系统与智能硬件开发基础中的基础,汇编语言是许多从事信息科学和工程领域的技术人员应该掌握的一项基本技能。目前,市场上针对树莓派单板机系统介绍C、Scratch、Python等编程语言与实践方面的资源很多,但鲜有系统针对树莓派单板机ARM汇编语言编程方面的介绍。这里以袁志勇主编的《嵌入式系统原理与应用技术》(北京航空航天大学出版社2019年1月第3版)一书中ARM汇编语言编程知识为基础,采用树莓派单板机及Linux操作系统验证平台,较系统地介绍树莓派ARM汇编语言编程技术与示例。由于准备仓促,不妥之处,还请各位不吝赐教。
第1讲:树莓派ARM汇编语言实验平台及基本的ARM汇编程序示例
一、树莓派ARM汇编语言实验平台简介
树莓派ARM汇编语言实验平台可以有以下两种方案。
方案一是采用自带Raspbian Linux系统的树莓派单板机+USB键盘/无线键盘+HDMI接口显示器。目前市场上,主流的树莓派单板机有Raspberry Pi 3B/3B+/4B等。采用此方案,树莓派就是一台与PC机类似的迷你型Linux电脑。
方案二是可以采用PC+自带Raspbian Linux系统的树莓派单板机+WiFi无线网络环境。此时树莓派单板机不需要连接键盘及显示器。我们可以利用SSH (Secure SHell)、VCN (Virtual Network Connection)、RDP(Remote Desktop Protocol)等远程控制软件通过WiFi无线网络远程控制树莓派。
下面介绍方案二中采用Window 7/Windows10附件中的RDP远程控制树莓派的实验平台搭建方法。
1.树莓派安装RDP软件
在树莓派Linux终端安装XRDP软件,具体命令如下:
~$ sudo apt-get update
~$ sudo apt-get install xrdp
一旦软件安装完毕,树莓派就会自动启动xrdp服务。就是说,每当树莓派重启时,该服务就会自动启动。
2.PC机RDP客户端及远程连接树莓派
Windows 7及以后版本已包含用于连接树莓派的RDP客户端,它位于启动菜单的All Programs/Accessories/Remote Desktop Connection (即Windows附件中的远程桌面连接)菜单中。
启动RDP远程桌面链接客户端时,它会询问要连接到哪台计算机,此时输入所使用的树莓派的IP地址。之后,它会要求你提供平常登录树莓派所用的用户名及密码(见图1)。除非修改过所用的树莓派用户名及密码,否则默认的用户名是pi,密码是raspberry。
图1 利用Windows远程桌面连接登录树莓派
二、基于树莓派的基本ARM汇编程序示例
1.GNU ARM汇编格式及ARM汇编工具链介绍
树莓派Linux环境下,GNU ARM汇编格式如下:
{label:} instruction {@comment}
{label:} directive {@comment}
{label:} pseudo-instruction {@comment}
其中,label指标号,instruction是指令,directive是伪操作,pseudo-instruction意思是伪指令,comment指注释。
GNU (Gnu’s Not Unix的缩写)是一个类UNIX的操作系统,由GNU计划推动,目标在于建立一个完全相容于UNIX的自由软件环境。在树莓派Linux终端进行ARM汇编语言编程,常用的GNU ARM工具链有:(1) GNU nano、vi等编辑器,它们用于对扩展名为.s的ARM汇编源程序进行编辑。(2) GNU as汇编器,它用于对汇编源程序进行汇编并生成扩展名为.o的目标代码。(3) GNU ld链接器,它用于对目标代码进行链接并生成可执行的应用程序。若需要对ARM汇编程序进行调试的话,还有可选的GNU DBG调试工具。
2.基于树莓派的基本ARM汇编程序示例
下面以两个数相加并在树莓派Linux终端显示求和结果的基本ARM汇编程序为例,说明ARM汇编程序的编辑、汇编、链接、运行及结果显示的过程。
(1)编辑ARM汇编源程序
这里使用GNU nano编辑器编辑名为add_exp.s的ARM汇编源程序。
首先在Linux终端启动GNU nano编辑器编辑名为add_exp.s的源文件(见图2)。
图2 启动nano编辑器编辑ARM汇编源程序文件
在nano编辑器窗口录入ARM汇编源程序,程序清单见图3所示。
图3 nano编辑源程序
在图3所示的ARM汇编源程序中,.global _start伪操作用于声明全局标号_start;mov R7,#1指令的作用是将终止程序命令码1送到R7寄存器中;svc 0指令的作用是执行Linux服务调用命令终止程序,返回到Linux终端命令提示符。这里的ARM汇编程序的功能是将R0寄存器的内容与R1寄存器的内容相加,相加结果存放R0寄存器中,最终R0寄存器中的结果是16。录入完源程序后,按[Ctrl]+[O]组合键存盘,按[Ctrl]+[X]组合键退出编辑并返回Linux终端命令提示符。
(2)汇编源程序
采用GNU as汇编器对扩展名为.s的ARM汇编源程序进行汇编并生成扩展名为.o的目标代码,具体命令如下:
~$ as -o add_exp.o add_exp.s
(3)链接目标代码
采用GNU ld链接器对所生成扩展名为.o的ARM目标代码进行链接并生成可执行的ARM应用程序,具体命令如下:
~$ ld -o add_exp add_exp.o
(4)执行程序与结果显示
在Linux终端,“./”表示当前目录。执行当前目录程序文件名为add_exp的ARM应用程序命令为:
~$ ./add_exp
用nano编辑器编辑ARM汇编源程序文件、as汇编器汇编ARM汇编源程序、ld链接器链接目标文件以及执行当前目录的ARM应用程序等命令序列见图4所示。
图4 基于树莓派的基本ARM汇编语言编程命令序列
为了显示程序运行的结果,一种方法是使用echo命令。在树莓派单板机Linux终端执行完ARM汇编程序并退出后,可采用echo $?命令显示最后一次更新R0寄存器的低八位十进制数值。故,执行echo $?命令后,直接在图4中显示出R0寄存器中的最终结果16。
现将源程序中的mov R0,#8语句改为mov R0,#0xFF;mov R1,#8语句改为mov R1,#2。修改后的ARM源程序及命令序列见图5所示。从图5可以看出,程序运行后时,R0寄存器的实际结果应为0x101,但由于echo $?命令不能完整显示此结果,只能显示R0寄存器的低8位,故显示结果为1。
图5 修改的ARM源程序及命令序列
这里的树莓派基本ARM汇编程序示例,在Raspberry Pi 3B的Linux终端上运行通过。
End of This Lecture.
(作者Email联系: yuanzywhu@163.com)
发布时间:2020年3月13日
树莓派ARM汇编语言编程十讲(第2讲)链接
树莓派ARM汇编语言编程十讲(第3讲)链接
树莓派ARM汇编语言编程十讲(第4讲)链接
树莓派ARM汇编语言编程十讲(第5讲)链接
树莓派ARM汇编语言编程十讲(第6讲)链接
树莓派ARM汇编语言编程十讲(第7讲)链接
树莓派ARM汇编语言编程十讲(第1讲)相关推荐
- ARM汇编语言编程入门实践
文章目录 一.keil的安装 二.安装stm32 pack 三.keil 的简单设置 四.基于STM32汇编程序的编写 4.1 新建工程 4.2 新建test.s文件 4.3 编译程序 4.4 分析H ...
- 利用keil完成ARM汇编语言编程入门实践
文章目录 一.安装keil软件 1.下载安装包 2.安装keil 3.安装stm32 pack 二.简单的stm汇编语言的编程 1.新建工程项目 2.新建main.c文件 3.编译 4.stm32仿真 ...
- 【嵌入式系统开发05】ARM汇编语言编程入门实践
本文目的是主要介绍如何搭建并配置Keil嵌入式开发环境,完成一个基于STM32汇编程序的编写.记录build生成的 hex文件各段的大小,了解Hex文件格式及其前8个字节内容含义,学习在没有硬件条件下 ...
- 搭建Keil编程环境,ARM汇编语言编程入门实践
多看多学 一.安装及配置环境 01 型号分类及缩写 02 资料共享 03 安装器件支持包 04 Keil简单设置 二.简单程序编译 01 新建工程 02 配置环境 03 添加源文件 04 设置仿真器模 ...
- ARM 汇编语言编程学习笔记(1)
0.1.Thumb指令集 Thumb指令集是ARM指令集的子集,其性能更低,但是代码密度更高,功耗更低. Thumb指令集分为Thumb-1指令集和Thumb-2指令集,其中Thumb-1指令集是16 ...
- ARM汇编语言编程-Keil环境搭建及STM32程序的编写
目录 一.keil环境搭建 1.keil安装 2.注册LIC 3.支持包安装 二.STM32程序 1.新建工程 2.配置环境 三.总结 一.keil环境搭建 推荐百度网盘下载mdk531 mdk31安 ...
- C++面向对象高级编程十九讲
文章目录 0 背景 1 内容 0 背景 因为本人的C++基础不是很扎实,很多面向对象的基本语法掌握的不是很熟练,导致写程序出错时,经常会犯错,于是就去网上找到了侯捷老师的C++课进行观摩学习. 本文是 ...
- ARM 汇编语言入门
[翻译]二进制漏洞利用(二)ARM32位汇编下的TCP Bind shell:https://bbs.pediy.com/thread-253511.htm ARM汇编语言入门 From:ARM汇编语 ...
- 编程十年的十种武学境界
首先非常感谢大家这么多阅读量,评论和推荐.针对大家评论中的问题,在这里做一下统一回复.首先对于要我介绍程序媛的女朋友问题.我周围有一些没结婚的程序媛.她们对男孩子的物质要求都不高.但是女孩子生性浪漫, ...
最新文章
- 机器人编程语言python-机器人行业,10大流行编程语言对比
- 基于nginx和ffmpeg前端flv.js简单的直播环境搭建(rtmp+http-flv+hls)
- Python Django 一对多之插入多条数据示例
- TFRecords文件的存储与读取
- python 驱动级鼠标_罗技各系鼠标测评(2020年12月更新)
- 用Android Stuidio开发Flutter
- mac地址随机变化的解决方法(安卓手机通用)不用ROOT
- 理解嵌入式开发中的一些硬件相关的概念
- 用Photoshop制作简单贺卡
- QuantLib 开源金融计量学工具箱下载
- 【转载】机器指令计算机
- 对数用计算机,如何使用计算器计算对数
- FLV在线flash播放器JW PLAYER
- android espresso web,Espresso Web
- PhotoSweeper X for Mac(重复照片快速清理软件)
- 使用VirtualBox创建虚拟机
- 奇思妙想,动手 DIY 你的浏览器主页
- 【2022年终总结】前端之路第一篇——实习
- python 通达信板块_通达信如何自定义选股,使用python在通达信里面选股
- ubuntu下修复U盘并格式化
热门文章
- vos3000+短信+黑名单-数据分析
- arduino调试GY-MPU9250 9DOF九轴/9轴姿态传感器
- 某品牌电商促销活动运营分析
- 透过Q1财报,看米读成为趣头条核心增长曲线的价值逻辑
- 超微服务器双路主板系列,超微发布双路至强X12DPL系列服务器主板
- 租用美国服务器 解决java延迟_如何降低美国服务器延迟?美国服务器延迟多少算正常?...
- word另起一个自动编号,另外从头编号
- javascript swal不能用?
- 【转】Elon Musk 【带着目标学习、第一性原理思维,不去追逐平庸的机会,切身感受“追逐的力量”】
- PS如何物体加阴影,有什么相关教程吗