ADD R1,R2,R2, LSL #1
=> R1= R2+R2<<1 = R2+R22 =R23;
是的,左移2位就是乘22。
逻辑左移是从2进制来看,比如结尾是01,左移变10,1变成了2。
对比十进制来看,十进制的一个数左移一位,后面加了个0,相当于乘10。
二进制左移也是后面添0,只不过是最高位移到进位标志里,结果就是乘以2。
扩展资料:
128 位结果: 寄存器 0、1、2、和 3
第一个 128 位数: 寄存器 4、5、6、和 7
第二个 128 位数: 寄存器 8、9、10、和 11。
ADDS R0, R4, R8 ; 加低端的字
ADCS R1, R5, R9 ; 加下一个字,带进位
ADCS R2, R6, R10 ; 加第三个字,带进位
ADCS R3, R7, R11 ; 加高端的字,带进位
注意: 如果如果要做这样的加法,不要忘记设置 S 后缀来更改进位标志。
参考资料来源:百度百科-ARM指令集
最简单的办法,你用C实现该功能,然后仿真运行可以查看生成的汇编代码。
C语言原型
void strCpy(char pDst, const char pSrc){
while(pSrc)
{
pDst = pSrc;
pDst ++;
pSrc ++;
}
}
仿真编译结果
8: while(pSrc)9: {
0x00000EF0 E003 B 0x00000EFA
10: pDst = pSrc;
0x00000EF2 780A LDRB r2,[r1,#0x00]
0x00000EF4 7002 STRB r2,[r0,#0x00]
11: pDst ++;
0x00000EF6 1C40 ADDS r0,r0,#1
12: pSrc ++;
13: }
0x00000EF8 1C49 ADDS r1,r1,#1
8: while(pSrc)
9: {
10: pDst = pSrc;
11: pDst ++;
12: pSrc ++;
13: }
0x00000EFA 780A LDRB r2,[r1,#0x00]
0x00000EFC 2A00 CMP r2,#0x00
0x00000EFE D1F8 BNE 0x00000EF2
14: }
然后取出其中的汇编代码就行了
LOOPLDRB R2, [R1]
STRB R2, [R0]
ADDS R0, R0, #1
ADDS R1, R1, #1
LDRB R2, [R1]
CMP R2, #0
BNE LOOP
BX LR
注释参考C语言函数
这得看你用的哪家芯片,ARM7只是一个内核名称,用其做内核的单片机有很多。开发ARM单片机(你说的软件编程,其实到ARM芯片这里不那么简单了)用KEIL的比较多,并且很多芯片在这个环境下可以直接下载程序到单片机。
你能想像把所有的函数 都写在一个c 和h文件中 这有多难看吗
写这么多c h是方便维护 用到哪个函数 就包含哪个h 很方便
用source insight 软件看 各个函数的调用关系 可以层层跟进 一目了然
首先,arm的地址宽度是4个字节,所以每执行一条指令,PC就会自加4
而一条指令要完全被arm吸收,需要多个步骤,拿arm7举例它采用了3级流水线技术。
流水线,对于我们这种玩FPGA的再熟悉不过了,以3级流水线来说,就是把一件事情分成3个步骤,每个步骤同时处理,前两个周期为潜伏期,无法出结果,之后结果会源源不断的输出。
想象一下,一条条指令,就像一个个等待加工的产品,奔跑在传送带上“FETCH“DECODE”,“EXECUTE”,就是3道加工工序。在第一个周期,PC指向第一条程序指令,进行取值(FETCH),DECODE,和EXECUTE步骤“扑空”在第二个周期,接着PC + 4,PC指向第二条程序指令进行取值(FETCH),DECODE处理了在一个周期,FETCH到的指令,EXECUTE再次扑空。在第三个周期,依然PC + 4,PC指向第三条程序指令进行取值(FETCH),DECODE处理了在二个周期,FETCH到的指令,EXECUTE这时,处理在一个周期FETCH到的指令,这个指令同时也就是在第二个周期DECODE的指令。
以上就是关于写一条 ARM 指令,完成 *** 作r1 = r2 * 3(4分) ADD R1,R2,R2, LSL #1全部的内容,包括:写一条 ARM 指令,完成 *** 作r1 = r2 * 3(4分) ADD R1,R2,R2, LSL #1、编写一简单ARM汇编程序段、ARM程序语言该用什么开发软件编写呢(arm芯片用什么编程语言)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)