伪指令的本质,是多条指令集合而成的一段代码;
写代码的时候难免用会经常用到一些固定的功能,比如if else之类的;如果单纯的使用汇编指令,每次都要先比较然后再根据CPSR的内容进行BL;这样就很繁复;
所以伪指令应运而生,它从形式上来看像是宏定义;从功能上而言,是帮助我们简化某些固定操作的指令;
GNU有一套伪指令,MDK也有一套伪指令;这两台套伪指令相似,实际上最常用的是GNU风格伪指令,MDK风格的伪指令大致看看就行;(注意,GNU风格的编译器不能编译MDK风格的代码,反之亦然)
注意:伪指令要遵循所谓的ADS Style;
ADS风格:顶行写 或者使用tab缩进
什么时候顶行?诸如EQU,SET这类 使用时第一个字段不是伪指令,一定要顶行写
AREA
CODE32/CODE16
ENTRY
表示程序的入口点;就好像C语言中的main函数
END
表示结尾
EQU
EXPORT与IMPORT与EXTERN
EXPORT:将标号声明为全局标号,本质上和.global功能一样
IMPORT:是静态引用,告知编译器,会用到其他源文件中的定义;通过这个指令可以实现混合编程(例如可以引入C语言的函数);同时静态引用代表着只要使用IMPORT声明引入,无论后续是否调用,被引入的定义均会被加入符号表中;
EXTERN:是动态引用,如果声名了EXTERN但是后续没有引用,那么编译器就不会把引入的标签加入符号表;
GET
相当于include
RN
为寄存器定义别名
name RN Rn; 将寄存器Rn取名为name /*同时要注意,类似于EQU,这个命令也应当顶头写*/
-------分割线-------
为了让汇编用起来更加方便,汇编也提供了类似于高级语言的定义,条件分支等伪指令
定义变量,赋值
汇编中使用伪指令可以定义:数字变量,逻辑变量,字符串变量;
也可以使用伪指令对变量进行赋值
那么,局部和全局,他们的生效范围具体是什么?这两类变量存在哪里?
全局:全局变量的默认范围是整个.S文件,不过可以用EXPORT(或者.global)将其扩展到整个项目
局部:局部变量的生效范围是在一个宏定义内;
无论是局部变量还是全局变量,他们都是存在内存中的,并不是存在寄存器里;
全局变量存在数据段中;局部变量存在代码段中;(这一点和C语言是一样的)
为寄存器列表定义别名RLIST
$符号
$符号 的用法类似于 SHELL中的$符号 用法
运算符伪指令
+ ;加法 - ;减法 * ;乘法 / ;触发 = ;等于 > ;大于 < ;小于 >= ;大于等于 <= ;小于等于 /= ;不等于 <> ;不等于 ROL ;循环左移 ROR ;循环右移 SHL ;左移 SHR ;右移 AND ;按位与 OR ;按位或 NOT ;按位非 EOR ;按位异或 LAND ;逻辑与 LOR ;逻辑或 LNOT ;逻辑非 LEOR ;逻辑异或
寄存器伪指令
LDR:load date to register
ADR:
ADRL:
ADRL ;中范围寻址到寄存器
DCB:data control bytes
DCB可以用"="替代
DCW:data control half word(注意:以半字为单位)
DCD:以字为单位
SPACE
MAP与FIELD
这两个指令可以用于定义结构体
MAP用于定义一张结构化内存表的首地址(MAP可以用 "^" 替代)
FIELD用于定义结构化的内存表的数据域(FIELD可以用 "#" 替代)
控制语句IF ELSE
循环语句WHILE WEND
下一张看看GNU风格的语法
到此这篇ldr伪指令的用法(arm ldr伪指令)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rfx/13402.html