[ARM入门]

【工程源码】ARM汇编指令 连载一

[复制链接]
386|0
手机看帖
扫描二维码
随时随地手机跟帖
zgmxs|  楼主 | 2020-2-29 19:39 | 显示全部楼层 |阅读模式
本文和设计代码由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





使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

104

主题

104

帖子

3

粉丝