历史上的今天
今天是:2025年01月21日(星期二)
2021年01月21日 | 快速学Arm(10)--Arm,Thumb指令集汇编语言的一些特殊性
2021-01-21 来源:eefocus
20多年前曾经是Z80汇编语言的高手,后来接触了8086,再后来接触了C51汇编,每一次都发现了一些与前面学的语言不同的东西,要逐渐的去习惯.再像后学,见得多了,也就不绝对奇怪了.
上午浏览了一下Arm的汇编语言,发现它的基本指令也并不算特别多.只是它又有与Z80,8086或者C51一些不同的东西.Arm的汇编语言在基本的指令上加了很多不同的前缀和后缀,或者"中缀",这样组合起来,把基本指令变得更加复杂,以至于会把初学者搞蒙.我把看到的一个个总结一下.
1.指令格式:
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语言来开发程序,但对汇编语言进行阅读也是有可能的,阅读的时候如果对指令的一些规则有所了解,查阅手册就有了方法,就不会花大量的时间来琢磨这些东西了.
史海拾趣
|
《社区大讲堂》DO-254中的高设计可靠性的逻辑综合(六)--DO-254的工程需要考虑 DO-254的工程需要在综合时考虑更多 逻辑综合工具在设计可靠性方面能提供很多额外的价值。以下是一些支持DO-254项目中非常重要的功能。 可重复性的综合结果 DO-254需要设计的每一步都要有可重复性。 主要的目的是能够获取设计环境,设计工具 ...… 查看全部问答> |
|
小弟半路出家,代码工一个,经常有感于底子太薄,没搞过通信控制方面的,望各位前辈能介绍介绍需要看那些书籍. 我只知道,数电,模电,信号与系统,望各位大大能详细介绍下需要看那些书籍,万分感谢!… 查看全部问答> |
|
内核加了一些驱动之后就起不来了,下面是串口输出的信息: ERROR: StoreImageToBootMedia: Failed to write region to BINFS partition (start=0x80100000, length=0x21EAD18). ERROR: OEMLaunch: Failed to store image to Smart Media. ERROR: ...… 查看全部问答> |
|
由于之前其他项目用过LPC2478做USB相关的设备,领导要求,我们这个项目也用到这个LPC2478,但是我们需要采用FE组网, 求高手指导下LPC2478的软硬件组网方案和具体设计思路? 感谢!… 查看全部问答> |
|
随着一年多的真实产品开发——虽然,嘿嘿,按照他们的说法,我这实在有点非主流,但在后期的调试中吃了不少苦头,于是在蛋疼的调试中,以及在阅读诸如《代码大全》这些书籍时,渐渐地萌生了一种如何做一个方便调试,方便扩展,方便移植的单片机程序 ...… 查看全部问答> |




