社区导航

 

搜索
查看: 131|回复: 0

[资料分享] 【工程源码】ARM汇编指令 连载一

[复制链接]

367

TA的帖子

2

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2020-2-29 19:37 | 显示全部楼层 |阅读模式

本文和设计代码由FPGA爱好者小梅哥编写,未经作者许可,本文仅允许网络论坛复制转载,且转载时请标明原作者。

 

 虽然现在很少有程序使用汇编进行编写,但是了解一下还是很有必要的。了解这个有些bug找起来会快很多。我现在看一些执行起来很奇怪的代码,就直接看看对应的汇编部分,很多C语言中不易发现的问题,汇编一目了然。        相信了解过arm汇编的都听说过ARM指令集,Thumb指令集。现在很多处理器还有Thumb-2指令集(如STM32)。我不打算在开头去讲各种指令集有什么区别,一起看看各种指令集下的指令,一切就都清楚了。


      ARM指令在机器中的表示格式是用32位的二进制数表示。计算机根据二进制代码去完成所需的操作。
      ARM指令代码一般分为5个域;
     [31:28]是4位的条件码域(cond),4位条件码共有16种组合;
     [27:20]是指令代码域 (opcode)。
     [19:16]是地址基址(Rn),为R0~R15共16个寄存器编码。
     [15:12]是目标或源寄存器Rd,为R0~R15共16个寄存器编码。
     [11:0]是地址偏移或操作寄存器、操作数区域 Op2。


     汇编指令的表示格式
     <opcode>{<cond>}{S}<Rd>,<Rn>{,<OP2>}
     <>中的内容必不可少,{}的内容可省略。
     <opcode>表示操作码,如ADD表示算术加法。
     {<cond>}表示指令的条件域,如EQ\NE等。
     {S}决定指令的执行结果是否影响CPSR的值,使用该指令后缀则指令执行的结果影响CPSR的值,否则不影响。
     <Rd>表示目的寄存器
     <Rn>表示第一个操作数,为寄存器
     <op2>表示第二个操作数,可以是立即数,寄存器或者寄存器移位操作数。
     例子:ADDEQS R0,R1,#8。其中操作码为ADD,条件为EQ,S表示执行结果影响CPSR寄存器。目的寄存器Rd为R0,第一个操作数Rn为R1,第二个操作为OP2为立即数#8。

 


       小知识:
       程序的执行指令都保存在存储器中。当计算机需要执行一条指令时,首先产生这条指令的地址,并根据地址去打开相应的存储单元,取出指令代码,CPU根据指令代码执行相应操作。
       当处理器工作在ARM状态时,几乎所有的指令都根据CPSR中条件码的状态和指令的条件域有条件的执行。当执行条件满足时,指令被执行,否则,指令被忽略。根据上面所说,每条指令的条件码为[31:28]这4bit,共16种,每种条件码可用两个字母表示,这两个字符可以添加在指令助记符的后面和指令同时使用。在16中条件码中,有15种可以使用,第16种(1111)被系统保留。指令条件码如下表:

01.png

 

 


 

此帖出自ARM技术论坛

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/5 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-2 18:37 , Processed in 0.086423 second(s), 21 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表