×
单片机 > 单片机程序设计 > 详情

快速学Arm(10)--Arm,Thumb指令集汇编语言的一些特殊性

发布时间:2022-08-30 发布时间:
|

20多年前曾经是Z80汇编语言的高手,后来接触了8086,再后来接触了C51汇编,每一次都发现了一些与前面学的语言不同的东西,要逐渐的去习惯.再像后学,见得多了,也就不绝对奇怪了.


上午浏览了一下Arm的汇编语言,发现它的基本指令也并不算特别多.只是它又有与Z80,8086或者C51一些不同的东西.Arm的汇编语言在基本的指令上加了很多不同的前缀和后缀,或者"中缀",这样组合起来,把基本指令变得更加复杂,以至于会把初学者搞蒙.我把看到的一个个总结一下.


1.指令格式:

{} {S} , {,}

opcode:指令助记符,如LDR,STR等

cond:执行的条件,如EQ,NE等

S:是否影响CPSR寄存器的值,如果后S后缀,则运行会影响CPSR状态寄存器.

Rd:目标寄存器

Rn:第一个操作数的寄存器

operand2:第二个操作数


在指令书写的时候,<>符号内的项是必需的,{}符号内的项是可选的,{}为指令执行条件,是可选的.

2.条件后缀指令:

ADD R1,R0,#1;R1=R0+1

ADDHI R1,R0,#1;如果R1>R0,则R1=R0+1

ADDLS R1,R0,#1;如果R1<=R0,则R1=R=+1


从这个例子里,我们可以看到,ADD后面加上了不同的后缀,就形成了多种ADD指令,习惯了其他CPU的汇编的人不清楚此点,会被搞蒙,觉得ARM的指令为什么这么多,其实这些指令都有一个原型,只不过增加了一些,前缀,中缀,后缀而已.这些条件后缀可以在相关数据和手册中查到,我不将具体的,只讲理解和方法.

3.对字,半字,字节的后缀指令:

LDR,LDRB,LDRSH,LDRSB等等指令都来自于原型LDR

LDR:传送一个字(32bit)

LDRB:传送一个字节(8bit)

LDRSH:传送一个有符号的半字(16bit)

LDRSB:传送一个有符号的字节(8bit)

以此类推,又一个LDR又衍生出一大堆指令.

4.多寄存器传送:

对于多字节传送,传送后地址增加多少,也是一种后缀.例如:

LDM,LDMIA,LDMDA,LDMED等等,大家查手册吧,别被搞蒙了就行了.

除了单独的后缀,中缀,前缀以外,这些"缀"们还可能进行组合,形成书写更长的指令,这一点需要大家注意.我们虽然可以使用C语言来开发程序,但对汇编语言进行阅读也是有可能的,阅读的时候如果对指令的一些规则有所了解,查阅手册就有了方法,就不会花大量的时间来琢磨这些东西了.



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单