arm汇编

  • arm采用32位架构
arm约定
 - Byte(字节):8bits
 - Halfword(半字):16bits (2byte)
 - word(字):32bits(4byte)
  • 大部分arm core提供
arm指令集 (32-bit)
thumb 指令集(T变种) (16bit)
  1. arm指令集是以32位二进制编码的方式给出的,大部分的指令编码中定义了第一操作数、第二操作数、目标操作数、条件标志影响位、以及每天指令所对应的不同功能实现的二进制位。
    在这里插入图片描述

  2. 每条指令是多功能的;

  3. arm指令的一个重要特点是,它所有 的指令都带有条件,例如用户可以测试每个寄存器的值,但是,直到下一次使用同一条件测试时,才能有条件的执行这些指令。

  4. arm指令的另一个重要的特点是具有灵活的第二操作数,即可以是立即数,也可以是逻辑运算数,使得arm指令在读取数值时同时进行算数和移位操作,它可以在集中模式下进行操作,包括通过使用SWI(软件中断)指令从用户模式进入系统模式。

  5. 28-31位是条件码,21-24为操作码,12-19为寄存器编号;

  6. 上边提到的跳转条件eq实际就是28-31位对应的条件码,但是28-31位都是二进制数据不好记,所以就对二进制的条件码取了好记的助记符,例如 eq。

  7. eq英文单词equal的意思,注意这里equal并不是c语言当中==的意思,这里根据状态寄存器的条件标志位Z来判断,如果Z = 1则eq成立,如果Z = 0则eq不成立,就是NE。
    在这里插入图片描述

  8. 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

reference

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值