发布于
逆向工程学习日志 02
认识指令集架构
在x86的指令集架构(ISA)中,各opcode(汇编指令对应的机器码)的长度不尽相同,出于兼容性考虑,当年的16位8086 CPU的指令甚至被保留到了现在的CPU中,而在ARM架构中,opcode的长度都为4个字节,也就是32位,但ARM架构的设计师们很快发现这种模式并不合适,因为实际应用中绝大多数CPU指令都用不满那4个字节,因此他们又推出了一种把每条指令封装在2个字节的“Thumb”模式中,不过因为Thumb模式并不能封装所有的指令,因此一个程序里可以同时存在两种模式的指令。
在ARM v7平台上出现了Thumb-2指令集,Thumb-2的指令基本都可封装到2个字节中,2个字节封装不下的指令则由4个字节封装。Thumb-2实际上是一种充分利用处理器性能,足以与ARM模式媲美的独立的运行模式,而不是ARM指令集和Thumb指令集的复合体。
在后来64位的ARM处理器出现,ARM64架构采用4位字节封装CPU指令,不再支持Thumb模式。所以ARM指令集实际分为三类:
- ARM模式指令集
- Thumb模式指令集(包括Thumb-2)
- ARM64模式指令集
本系列博客,我们主要学习x86和ARM指令集。
最简函数(第2章)
返回预定常量的函数,已经算得上是最简单的函数了。
int f()
{
return 123;
};
x86汇编
f:
mov eax, 123
ret
在x86上,这个函数仅由两条指令组成,一条是mov指令,用来将常量123加载到EAX寄存器中,另一条是ret指令,它会将EAX的值当作返回值返回给调用者函数,调用者函数会从EAX寄存器中取回返回值。
ARM汇编
f PROC
MOV r0,#0x7b ; 123
BC lr
ENDP