树莓派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的⾃由软件环境。在树
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)
发布时间:2020年3⽉13⽇

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。