本文和设计代码由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)被系统保留。指令条件码如下表:
|