微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM指令学习笔记

ARM指令学习笔记

时间:11-11 来源:互联网 点击:

rcrb

NEXT

..............

而在arm中可以很方便地写成

MOVE rcra

CMP rarb

MOVECC rcrb

灵活运用第二个操作数还能大大提高代码的效率,例如我们要将r1寄存器中的数乘以9,可以在arm中很方便地写成

ADD R1,R1,R1,LSL#3

换成80x86,那就是一堆步骤了

MOVE R2,R1

SHL R2,3

ADD R1,R2

就是说arm的指令更人性化,加上后来对arm伪指令的学习,我个人觉得arm指令集是汇编中的高级语言了。

在ARM中乘法操作可以用于任意两个寄存器结果可以保存到任意寄存器,而80x86则需要先将被乘数保存于AL/AX中再做乘法。并且高位和地位还要分开保存至AX/AL和DX/AH中,麻烦!

ARM的中断指令有:

(1)复位异常

(2)未定义指令异常

(3)软件中断异常

(4)预取指中断异常

(5)数据中止异常

(6)中断请求异常

(7)快速中断(FIQ)请求异常

种类繁多学起来很头疼,不像80x86从头到尾就是INT中断那样清爽。中断这块本人不甚明白,还需继续努力学习,

接下来的学习就到了伪指令。首先伪指令不是ARM指令集中的指令,只是为了编程方便编译器定义了伪指令,使用时可以像其他ARM指令一样使用,但在编译时这些指令会被等效的ARM指令代替。虽说有些伪指令只是一些极其简单的替换,但却极大地方便我们编程。可以说它是以它是一种特殊的助记符。

对于伪指令的学习也只是概念性的,没法深刻,很多指令虽然知道意思但完全不知道哪儿用的着。有待今后的时间吧。

总的来说,ARM指令有一下几种

1.符号定义伪指令

全局变量声明:GBLA、GBLL和GBLS。
局部变量声明:LCLA、LCLL和LCLS。
变量赋值:SETA、SETL和SETS。
为一个通用寄存器列表定义名称:RLIST。
为一个协处理器的寄存器定义名称:CN。
为一个协处理定义名称:CP。
为一个VFP寄存器定义名称:DN和SN。
为一个FPA浮点寄存器定义名称:FN。

2.数据定义伪指令
声明一个文字池:LTORG。
定义一个结构化的内存表的首地址:MAP。
定义结构化内存表中的一个数据域:FIELD。
分配一块内存空间,并用0初始化:SPACE。
分配一段字节的内存单元,并用指定的数据初始化:DCB。
分配一段字的内存单元,并用指令的数据初始化:DCD和DCDU。
分配一段字的内存单元,将每个单元的内容初始化为该单元相对于静态基址寄存器的偏移量:DCDO。
分配一段双字的内存单元,并用双精度的浮点数据初始化:DCFD和DCFDU。
分配一段字的内存单元,并用单精度的浮点数据初始化:DCFS和DCFSU。
分配一段字的内存单元,并用单精度的浮点数据初始化,指定内存单元存放的是代码,而不是数据:DCI。
分配一段双字的内存单元,并用64位整数数据初始化:DCQ和DCQU。
分配一段半字的内存单元,并用指定的数据初始化:DCW和DCWU。

断言错误:ASSERT。这个指令比较神奇,可以在程序首写一些诸如ASSERTtop<>temp的断言错误指令,在汇编编译器对汇编程序的第二遍扫描中,如果其中
ASSERT条件不成立,ASSERT伪指令将报告该错误信息,从而减少错误。有点像C++中try和catch。

3.汇编控制伪指令/宏伪指令

汇编控制伪指令用于条件汇编、宏定义、重复汇编控制等。该类伪指令如下:
条件汇编控制:IF、ELSE和ENDIF
宏定义:MACRO和MEND
重复汇编:WHILE及WEND

这些就是它有点像高级语言的地方,可以用伪指令实现某些高级语句。其实高级语言不就是一个个汇编指令的打包吗?大同小异。

值得提及的是MACRO和MEND,这个东西感觉就是C中的#define,很强大。

其伪指令格式:
MACRO
{$label}macroname{$parameter}{$parameter}…

其中:$label宏指令被展开时,label可被替换成相应的符号,通常为一个标号在一个 符号前使用$表示被汇编时将使用相应的值替代$后的符号。
macroname所定义的宏的名称。
$parameter宏指令的参数。当宏指令被展开时将被替换成相应的值,类似于函数 中的形式参数。

可以实现参数的传递!!这种伪指令让人看上去就有想去尝试使用的冲动,以后一定会有机会的!

这里简单假想下使用:

C语言中:#definebigger(a,b)(a>b)

可以写成(可能会有错,仅仅尝试一下而已):

MACRO

$labelbigger$a,$b

$label

;GL1为一个定义的全局变量

CMP $a,$b

MOVEGT GL1,1

MOVELE GL1,1

MEND

调用testbiggera,b

然后在GL1中得到大小结果

当然我们可以直接比较,这里只是为了演示一下。

4.杂项伪指令

杂项伪指令在汇编编程设计较为常用,如段定义伪指令,入口点设置伪指令,包含 文件伪指令,标号导出或引入声明等,该类伪指令如下:
边界对齐:ALIGN。
段定义:AREA。
指令集定义:CODE16和CODE32。
汇编结束:END。
程序入口:ENTRY。
常量定义:EQU。
声明一个符号可以被其它文件引用:EXPORT和GLORBAL。
声明一个外部符号:IMPORT和EXTERN。
包含文件:GET和INCLUDE。
包含不被汇编的文件:INCBIN。
保留符号表中的局部符号:KEEP。
禁止浮点指令:NOFP。
指示两段之间的依赖关系:REQUIRE。
堆栈8字节对准:PEQUIRE8和PRESERVE8。
给特定的寄存器命名:RN。
标记局部标号使用范围的界限:ROUT。

上一篇:关于LPC2103外部中断
下一篇:第7课:DMA

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top