ARM32 base instruction -- blx

BLX

带返回和状态切换的跳转指令,此指令只适用 ARMv5T*, ARMv6*, ARMv7。

BLX (immediate)

Branch with Link calls a subroutine at a PC-relative address.

Branch with Link and Exchange Instruction Sets (immediate) calls a subroutine at a PC-relative address, and changes instruction set from ARM to Thumb, or from Thumb to ARM.

带链接的分支调用PC相对地址处的子程序。

带链接和交换指令集的分支(立即)调用PC相对地址处的子程序,并将指令集从ARM更改为Thumb,或从Thumb更改为ARM。

ARM指令是4字节对齐,最低两位可以用作状态指示,如果最低两位是0,表示切换到ARM状态。

BLX<c> <label>

BLX (register)

Branch with Link and Exchange (register) calls a subroutine at an address and instruction set specified by a register.

带链接和交换(寄存器)的分支在寄存器指定的地址和指令集调用子例程。

BLX<c> <Rm>

blx immediate :

10534: b580 push {r7, lr}

10536: b082 sub sp, #8

10538: af00 add r7, sp, #0

1053a: 6078 str r0, [r7, #4] /* this 指针 */

printf("%d, %d\n", v1, v2);

1053c: 687b ldr r3, [r7, #4] /* r3 = this */

1053e: 6819 ldr r1, [r3, #0] /* r1 = [r3+0] = v1 */

10540: 687b ldr r3, [r7, #4] /* r3 = this */

10542: 685b ldr r3, [r3, #4] /* r3 = [r3+4] = v2 */

10544: 461a mov r2, r3 /* r2 = r3 = v2 */

10546: f240 50a8 movw r0, #1448 /* r0 = 0x5a8 */

1054a: f2c0 0001 movt r0, #1 /* r0 = (1 << 16) | 0x05a8 = 0x105a8,此为数据段地址 */

1054e: f7ff ef38 blx 103c0 <printf@plt> /* printf(r0, r1, r2) */

blx register :

104dc: e51b3008 ldr r3, [fp, #-8] ; x

104e0: e1a03103 lsl r3, r3, #2 ; r3 = x << 2 , [0, 4, 8]

104e4: e24b2004 sub r2, fp, #4 ; r2 = fp - 4

104e8: e0823003 add r3, r2, r3 ; r3 = r2 + r3 [0|4|8] --> (fp-4)+[0|4|8]

104ec: e5133014 ldr r3, [r3, #-20] ; 0xffffffec r3 = 0:[(fp-4)-20], 1:[(fp-4)+4-20], 2:[(fp-4)+8-20]

104f0: e50b300c str r3, [fp, #-12] ; save function address, 0:r3=(fp-24), 1:r3=(fp-20), 2:r3=(fp-16)

f();

104f4: e51b300c ldr r3, [fp, #-12] ; load function address

104f8: e12fff33 blx r3 ; execl

相关推荐
Crossoads1 天前
【汇编语言】call 和 ret 指令(一) —— 探讨汇编中的ret和retf指令以及call指令及其多种转移方式
android·开发语言·javascript·汇编·人工智能·数据挖掘·c#
Crossoads2 天前
【汇编语言】转移指令的原理(三) —— 汇编跳转指南:jcxz、loop与位移的深度解读
android·汇编·人工智能·redis·单片机·深度学习·机器学习
zhuqiyua3 天前
深入解析Kernel32.dll与Msvcrt.dll
汇编·microsoft·windbg·二进制·dll
Crossoads4 天前
【汇编语言】数据处理的两个基本问题(三) —— 汇编语言的艺术:从div,dd,dup到结构化数据的访问
android·linux·运维·服务器·汇编·机器学习·数据挖掘
Crossoads4 天前
【汇编语言】数据处理的两个基本问题(二) —— 解密汇编语言:数据长度与寻址方式的综合应用
android·java·开发语言·javascript·汇编·数据挖掘·c#
Coding~5 天前
逆向攻防世界CTF系列38-xxxorrr
c语言·汇编·安全
Crossoads5 天前
【汇编语言】数据处理的两个基本问题 —— 汇编语言中的数据奥秘:数据位置与寻址方式总结
android·汇编·人工智能·redis·单片机·深度学习·机器学习
Crossoads6 天前
【汇编语言】更灵活的定位内存地址的方法(一)—— 字符操作:and与or指令、ASCII码及大小写转换
android·linux·运维·服务器·汇编·机器学习·数据挖掘
不会写算法的小沈6 天前
函数栈帧的创建与销毁
c语言·汇编·数据结构
zhuqiyua7 天前
windows二进制安全零基础(二)
汇编·安全·二进制