写一条 ARM 指令,完成 *** 作r1 = r2 * 3(4分) ADD R1,R2,R2, LSL #1

写一条 ARM 指令,完成 *** 作r1 = r2 * 3(4分) ADD R1,R2,R2, LSL #1,第1张

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: }

然后取出其中的汇编代码就行了

LOOP

 LDRB  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芯片用什么编程语言)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10107037.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存