- arm采用32位架构
arm约定
- Byte(字节):8bits
- Halfword(半字):16bits (2byte)
- word(字):32bits(4byte)
- 大部分arm core提供
arm指令集 (32-bit)
thumb 指令集(T变种) (16bit)
-
arm指令集是以32位二进制编码的方式给出的,大部分的指令编码中定义了第一操作数、第二操作数、目标操作数、条件标志影响位、以及每天指令所对应的不同功能实现的二进制位。
-
每条指令是多功能的;
-
arm指令的一个重要特点是,它所有 的指令都带有条件,例如用户可以测试每个寄存器的值,但是,直到下一次使用同一条件测试时,才能有条件的执行这些指令。
-
arm指令的另一个重要的特点是具有灵活的第二操作数,即可以是立即数,也可以是逻辑运算数,使得arm指令在读取数值时同时进行算数和移位操作,它可以在集中模式下进行操作,包括通过使用SWI(软件中断)指令从用户模式进入系统模式。
-
28-31位是条件码,21-24为操作码,12-19为寄存器编号;
-
上边提到的跳转条件eq实际就是28-31位对应的条件码,但是28-31位都是二进制数据不好记,所以就对二进制的条件码取了好记的助记符,例如 eq。
-
eq英文单词equal的意思,注意这里equal并不是c语言当中==的意思,这里根据状态寄存器的条件标志位Z来判断,如果Z = 1则eq成立,如果Z = 0则eq不成立,就是NE。
-
ARM参数1、参数2、参数3分别保存在R1、R2、R3中,this指针存放R0中,剩下的参数从右往左依次入栈,被调用者实现栈平衡,返回值存放在 R0 中。
; 该代码是 arm-linux-androideabi-gcc + IDA PRO 生成的反汇编代码
.text:000085BC MOV R3, #4
.text:000085C0 STR R3, [SP] ; int
.text:000085C4 MOV R3, #5
.text:000085C8 STR R3, [SP,#4] ; int
.text:000085CC MOV R3, #6
.text:000085D0 STR R3, [SP,#8] ; int
.text:000085D4 MOV R3, #7
.text:000085D8 STR R3, [SP,#12] ; int
.text:000085DC MOV R3, #8
.text:000085E0 STR R3, [SP,#16] ; int
.text:000085E4 MOV R3, #9
.text:000085E8 STR R3, [SP,#20] ; int
.text:000085EC MOV R3, #10
.text:000085F0 STR R3, [SP,#24] ; int
.text:000085F4 MOV R0, R2 ; this
.text:000085F8 MOV R1, #1 ; int
.text:000085FC MOV R2, #2 ; int
.text:00008600 MOV R3, #3 ; int
.text:00008604 BL _ZN4Calc12thiscall_addEiiiiiiiiii ; Calc::thiscall_add(int,int,int,int,int,int,int,int,int,int)
.text:00008608 MOV R3, R0
.text:00008544 EXPORT _ZN4Calc12thiscall_addEiiiiiiiiii
.text:00008544
.text:00008544 STR R11, [SP,#-4]!
.text:00008548 ADD R11, SP, #0
.text:0000854C SUB SP, SP, #0x1C
.text:00008550 STR R0, [R11,#-16]
.text:00008554 STR R1, [R11,#-20]
.text:00008558 STR R2, [R11,#-24]
.text:0000855C STR R3, [R11,#-28]
.text:00008560 LDR R2, [R11,#-20]
.text:00008564 LDR R3, [R11,#-24]
.text:00008568 ADD R2, R2, R3
.text:0000856C LDR R3, [R11,#-28]
.text:00008570 ADD R2, R2, R3
.text:00008574 LDR R3, [R11,#4]
.text:00008578 ADD R2, R2, R3
.text:0000857C LDR R3, [R11,#8]
.text:00008580 ADD R2, R2, R3
.text:00008584 LDR R3, [R11,#12]
.text:00008588 ADD R2, R2, R3
.text:0000858C LDR R3, [R11,#16]
.text:00008590 ADD R3, R2, R3
.text:00008594 STR R3, [R11,#-8]
.text:00008598 LDR R3, [R11,#-8]
.text:0000859C MOV R0, R3 # 返回值
.text:000085A0 SUB SP, R11, #0
.text:000085A4 LDR R11, [SP],#4
.text:000085A8 BX LR
- ARM64,参数1~参数7 分别保存到 X1~X7 寄存器中,this指针存放X0中,剩下的参数从右往左依次入栈,被调用者实现栈平衡,返回值存放在 X0 中。
; 该代码是 aarch64-linux-android-gcc + IDA PRO 生成的反汇编代码
.text:00000000004006A0 MOV W0, #8
.text:00000000004006A4 STR W0, [SP] ; int
.text:00000000004006A8 MOV W0, #9
.text:00000000004006AC STR W0, [SP,#8] ; int
.text:00000000004006B0 MOV W0, #10
.text:00000000004006B4 STR W0, [SP,#16] ; int
.text:00000000004006B8 MOV X0, X1 ; this
.text:00000000004006BC MOV W1, #1 ; int
.text:00000000004006C0 MOV W2, #2 ; int
.text:00000000004006C4 MOV W3, #3 ; int
.text:00000000004006C8 MOV W4, #4 ; int
.text:00000000004006CC MOV W5, #5 ; int
.text:00000000004006D0 MOV W6, #6 ; int
.text:00000000004006D4 MOV W7, #7 ; int
.text:00000000004006D8 BL _ZN4Calc12thiscall_addEiiiiiiiiii ; Calc::thiscall_add(int,int,int,int,int,int,int,int,int,int)
.text:00000000004006DC STR W0, [X29,#0x1C]
.text:0000000000400628 EXPORT _ZN4Calc12thiscall_addEiiiiiiiiii
.text:0000000000400628
.text:0000000000400628 SUB SP, SP, #0x40
.text:000000000040062C STR X0, [SP,#40]
.text:0000000000400630 STR W1, [SP,#36]
.text:0000000000400634 STR W2, [SP,#32]
.text:0000000000400638 STR W3, [SP,#28]
.text:000000000040063C STR W4, [SP,#24]
.text:0000000000400640 STR W5, [SP,#20]
.text:0000000000400644 STR W6, [SP,#16]
.text:0000000000400648 STR W7, [SP,#12]
.text:000000000040064C LDR W1, [SP,#36]
.text:0000000000400650 LDR W0, [SP,#32]
.text:0000000000400654 ADD W1, W1, W0
.text:0000000000400658 LDR W0, [SP,#28]
.text:000000000040065C ADD W1, W1, W0
.text:0000000000400660 LDR W0, [SP,#24]
.text:0000000000400664 ADD W1, W1, W0
.text:0000000000400668 LDR W0, [SP,#20]
.text:000000000040066C ADD W1, W1, W0
.text:0000000000400670 LDR W0, [SP,#16]
.text:0000000000400674 ADD W1, W1, W0
.text:0000000000400678 LDR W0, [SP,#12]
.text:000000000040067C ADD W0, W1, W0
.text:0000000000400680 STR W0, [SP,#60]
.text:0000000000400684 LDR W0, [SP,#60] # 返回值
.text:0000000000400688 ADD SP, SP, #0x40
.text:000000000040068C RET