ARM指令集摘要

ARM是一种RISC体系结构的处理器芯片。和传统的CISC体系结构不同,RISC 有以下的几个特点:

◆ 简洁的指令集——为了保证CPU可以在高时钟频率下单周期执行指令,RISC指令集只提供很有限的操作(例如add, sub, mul等),而复杂的操作都需要由这些简单的指令来组合进行模拟。并且,每一条指令不仅执行时间固定,其指令长度也是固定的,这样,在译码阶段就可以对下一条指令进行预取。

◆ Load-Store 结构——这个应该是RISC 设计中比较有特点的一部分。RISC,CPU并不会对内存中的数据进行操作,所有的计算都要求在寄存器中完成。而寄存器和内存的通信则由单独的指令来完成。而在CSIC中,CPU是可以直接对内存进行操作的,这也是一个比较特别的地方。

arm处理器有七种运行模式,我们在这里只讨论user模式,在user模式下arm处理器的主要寄存器及其功能如下图所示:


arm的指令格式:

<opcode>{<cond>}{S}<Rd>,<Rn>{,<opcode2>}

       其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。

       opcode 指令助记符,如LDR,STR 等

       cond 执行条件,如EQ,NE 等

       S 是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响

       Rd 目标寄存器

       Rn 第一个操作数的寄存器

       operand2 第二个操作数

下面我们来通过一个简单的例子来熟悉一下Arm的指令集,源代码如下:

</pre><pre name="code" class="cpp">#include <stdio.h>
int main(int argc, char **argv)
{
	printf("Hello, ARM!\r\n");
	return 0;
}

IDA反汇编代码如下所示:

.text:000004C4 var_C           = -0xC
.text:000004C4 var_8           = -8
.text:000004C4
.text:000004C4                 STMFD   SP!, {R11,LR};将LR,R11压入栈,保存其值,!表示回写到SP
.text:000004C8                 ADD     R11, SP, #4;将R11指向栈幁底部,用来寻址访问变量
.text:000004CC                 SUB     SP, SP, #8;开辟2个临时变量的空间
.text:000004D0                 STR     R0, [R11,#var_8];将R0的值赋值给变量<span style="font-size: 13.3333px; font-family: Arial, Helvetica, sans-serif;">var_8</span>
.text:000004D4                 STR     R1, [R11,#var_C];<span style="font-size: 13.3333px; font-family: Arial, Helvetica, sans-serif;">将R1的值赋值给变量</span><span style="font-size: 13.3333px; font-family: Arial, Helvetica, sans-serif;">var_C</span><span style="font-size: 13.3333px; font-family: Arial, Helvetica, sans-serif;">
</span>.text:000004D8                 LDR     R3, =(aHelloArm - 0x4E4);=相当于X86里面的offset
.text:000004DC                 ADD     R3, PC, R3      ; 重定位将"Hello, ARM!\r"字符串的地址赋值给R3
.text:000004E0                 MOV     R0, R3          ; 将字符串地址赋值给R0进行传参
.text:000004E4                 BL      puts             ; 调用puts库函数
.text:000004E8                 MOV     R3, #0          ;R3清零,#表示立即数
.text:000004EC                 MOV     R0, R3          ;R0清零
.text:000004F0                 SUB     SP, R11, #4    ;SP还原,清除临时变量空间
.text:000004F4                 LDMFD   SP!, {R11,PC} ;还原R11值,并将函数返回地址赋值给PC

这里我们主要来观察一下STMFD指令对后面寄存器的压栈顺序:

这里反汇编引擎将STMFD指令使用PUSH指令替换,但是不影响我们观察结果,很明显,STMFD指令会将后面的寄存器参数列表按照从右向左的方式压入栈。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值