1225|1

6968

帖子

11

TA的资源

版主

楼主
 

打好基础,学习GUN汇编语法 [复制链接]

前言

认真学习学习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"指令是返回指令,函数返回语句不是秘需的。

最新回复

汇编语言,学习好后对调试程序帮助很大,值得深入地学习   详情 回复 发表于 2023-10-25 08:19
点赞 关注

回复
举报

227

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

汇编语言,学习好后对调试程序帮助很大,值得深入地学习

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表