0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

学习GNU汇编语法

华仔的编程随笔 来源:华仔的编程随笔 作者:华仔的编程随笔 2023-04-30 08:42 次阅读

前言

最近在学习Cortex-A的linux编程,拿到的是《原子嵌入式Linux驱动开发说解》,文中说到,如果想要学习好Uboot和Linux内核,就必须要学会汇编

GNU汇编语法

我们在使用过的STM32中的MDK与IAR下启动文件startup_stmp32f10x_hd.s中的汇编语法是有所不同的,所以不用将MDK下的汇编文件直接复制到IAR下去编译,这是因为MDK和IAR的编译器不同,因此汇编语法就有一些区别,ARM汇编使用的是GCC交叉编译器,所以汇编代码要符合GNU语法。

GNU汇编语法适用于所有的架构,并不是ARM独享的,GNU汇编由一系列的语句组成,每行一条语句,每条语句有3个可选部分,解释如下:

label:instruction @ comment

Lable : 即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通这个标号得到指令的地址,标号也可以用来表数据地址,注意label后面的“:",任何以":"结尾的标识符者会被识别为一个标号。

instruction : 即指令,也就是汇编指令的伪指令。

@符号:表示后面的是注释,就跟C语言中的”/ “和” /“一样的,其实在GNU汇编文件中我们也可以使用"/ "和" /”来注释。

comment :就是注释内容。

代码如下所示

add:
MOVS R0, #0x123 @设置 R0=0x123

上面的代码中"add:”就是标号,“MOVS R0,#0x123"就是指令,最后的"@设置 R0=0x123"就是注释。

注意:ARM中的指令,伪指令、伪操作、寄存器名等可以全部使用大写,也可以全部使用小写,但是不能大小写混用。

用户可以使用.section伪操作来定义一个段,汇编系统预定义一些段名,解释如下:

.tex :表示代码段。

.data :初始化的数据段。

.bss :未初始化的数据段。

.rodata :只读数据段。

我们当然可以使用.section来定义一个段,每个段以段名开始,以下一段名或者文件结尾结束。代码如下:

.section .testsection @定义一个testsection段

汇编程序的黙认入口标号是_start,不过我们可以在链接脚本中使用ENTRY来指明其他的入口点,下面的代码就是使用_start作为入口标号。

.gloabl _start

_start:
ldr r0, =0x12 @ 给r0移入0x123.

上面代码中,global是伪操作,表示_start 是一个全局标号,类似C语言中的全局变量一样,下面为常见的伪操作。

.byte :定义单字节数据,比如.byte 0x123。

.short :定义双字节数据,比如.short 0x1234。

.long :定义一个4字节数据,比如.long 0x12345678。

.equ :赋值语句,格式为.equ变量名,表达式如.equ num,0x123 表示num = 0x123。

.align :数据字节对齐,如.align 4 表示4字节对齐。

.end :表示源文件结束。

.global :定义一个全局符号,格式为.global sysmbol,比如 .global _start。

GNU汇编还有其他的伪操作,最常见的如上所示。如果想详细地了解全部的伪操作,可以参考《ARM Cortex-A(armV7)编程手册V4.0》中的相关内容。

GNU汇编同样也支持函数,函数格式如下:

函数名:
函数体
返回语句

GNU汇编函数返回语句不是必需要的,以下示例就是汇编写的Cortex-A7中断服务函数:

/* 未定义中断 */
Undef ined_Handler:
    ldr r0, = Undefined_Handler
    bx r0

/*  SVC 中断 */
    ldr r0, = SVC_Handler
    bx r0

/*  预取终止中断 */
    ldr r0, = PrefAbort_Handler
    bx r0

上述代码中定义了3个汇编函数:Unddefined_Handler、SVC_Handler和PrefAbort_Handler。以Undefined_Handler函数为来看汇编函数组成,"Undefined_Handler“就是函数名,"ldr r0, = Undefined_Handler”是函数体,“bx r0"是函数返回语句,"bx"指令是返回指令,函数返回语句不是秘需的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4981

    文章

    18274

    浏览量

    288367
  • Linux
    +关注

    关注

    87

    文章

    10988

    浏览量

    206725
  • GNU
    GNU
    +关注

    关注

    0

    文章

    141

    浏览量

    17333
  • Cortex-A
    +关注

    关注

    0

    文章

    18

    浏览量

    34207
  • 汇编语法
    +关注

    关注

    0

    文章

    2

    浏览量

    2073
收藏 人收藏

    评论

    相关推荐

    GNU-ARM汇编

    GNU-ARM汇编第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如
    发表于 10-22 11:17

    Makefile的语法

    购买地址:http://t.elecfans.com/topic/20.html本节我们只是简单的讲解Makefile的语法,如果想比较深入学习Makefile的话可以:a.百度搜 “gnu make
    发表于 04-19 09:41

    请问u-boot start.S中条件编译的语法是属于ARM GNU汇编中内嵌C语言吗?

    东山大哥,u-bootstart.S中那些条件编译的语法是属于ARM GNU汇编中内嵌C语言吗?如下:#include #include /* turn off the watchdog
    发表于 06-21 05:45

    ARM汇编基础出栈入栈操作

    DDR 控制器。GNU 汇编语法GNU 汇编语法适用于所有的架构,并不是 ARM 独享的,
    发表于 12-13 07:43

    Linux内核中GNU C扩展的一些常用C语言语法分析

    13.1 总结前面12节的课程,主要针对 Linux 内核中 GNU C 扩展的一些常用 C 语言语法进行了分析。GNU C 的这些扩展语法,主要用来完善 C 语言标准和编译优化。而通
    发表于 12-14 06:29

    GNU汇编语法

    ARM汇编基础Cortex-A芯片上电后SP指针还没初始化,C环境还没准备好,不能运行C代码。必须先用汇编语言设置好C环境,如初始化DDR、设置SP指针等。GNU汇编
    发表于 12-20 07:04

    GNU汇编哪些语句组成呢

    GNU 汇编语法适用于所有的架构,并不是 ARM 独享的, GNU 汇编由一系列的语句组成,每行一条语句,每条语句有三个可选部分,如下:la
    发表于 12-20 07:08

    ARM汇编基础之GNU汇编语法简介

    ARM汇编基础GNU 汇编语法Cortex-A7 常用汇编指令处理器内部数据传输指令存储器访问指令压栈和出栈指令跳转指令算术运算指令逻辑运算
    发表于 12-20 06:58

    ARM标准汇编GNU汇编大全

    ARM标准汇编GNU汇编 前段时间看arm的汇编,发现很多有一个小点,但是借来的书上的语法却没有,问同学也不知道,于是在网上查了一番
    发表于 03-03 16:24 100次下载

    GNU-ARM汇编

    GNU-ARM汇编 第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化
    发表于 03-10 13:48 102次下载

    内嵌汇编语法大全

    内嵌汇编语法大全 内嵌汇编语法如下:        __asm__(汇编语句模
    发表于 03-11 14:54 46次下载

    分享一些单片机汇编语言常见的语法和程序错误

    这里采用Keil C51软件包中的宏汇编器A51作为编绎器,单片机的汇编语言编写时要注意一定的语法,详细介绍可以参考相关参考书,语法错误会造成汇编
    的头像 发表于 01-13 09:41 7278次阅读
    分享一些单片机<b class='flag-5'>汇编</b>语言常见的<b class='flag-5'>语法</b>和程序错误

    GNU ARM汇编入门教程的详细资料免费下载

    注意的是,GNU汇编器遵循 AT&T 的汇编语法,可以从 GNU 的站点(www.gnu.o
    发表于 11-26 08:00 15次下载

    GNU汇编入门教程免费下载

    以前用ARM的IDE工具,使用的是ARM标准的汇编语言。现在要使用GNU的工具,当然要了解一点GNU ARM汇编的不同之处。其实非常的简单,浏览一下文档然后再看看程序就完全可以搞定了,
    发表于 11-02 17:53 20次下载
    <b class='flag-5'>GNU</b><b class='flag-5'>汇编</b>入门教程免费下载

    学习STM32时为什么要学习汇编

    不同的平台的汇编代码是不一样的,最早的汇编在50年代就发明了,比很多人的父母的年龄都大,老掉牙,不用学习怎么写汇编。一个公司有一个人知道怎么写汇编
    发表于 04-12 06:00 18次下载
    <b class='flag-5'>学习</b>STM32时为什么要<b class='flag-5'>学习</b><b class='flag-5'>汇编</b>?