ARM指令学习笔记
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。
ARM指令学习笔 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)