【发布时间】:2018-11-30 03:25:06
【问题描述】:
这是从C编译的反汇编代码:
00799d60 <sub_799d60>:
799d60: b573 push {r0, r1, r4, r5, r6, lr}
799d62: 0004 movs r4, r0
799d64: f000 e854 blx 799e10 <jmp_sub_100C54>
799d68: 4b15 ldr r3, [pc, #84] ; (799dc0 <sub_799d60+0x60>)
799d6a: 0005 movs r5, r0
799d6c: 4668 mov r0, sp
799d6e: 4798 blx r3
子程序调用的目标 (799d6e: 4798 blx r3) 接受一个 64 位整数指针参数并返回一个 64 位整数。该例程是一个库函数,因此我无法对其进行任何修改。 此操作是否会覆盖存储 lr 和 r6 值的堆栈?
【问题讨论】:
-
编译器不需要为少数本地对象使用堆栈,因为寄存器可用。
-
blx指令在执行之前不会修改压入堆栈的内容。被调用的例程可以但不应该;这将违反 ABI 规则。 -
你为什么要问?您是在寻找错误还是只是好奇?
-
不完全清楚你在问什么。
lr在正常的 ARM 调用约定中被调用破坏,但r6不是。例如例如,允许函数以pop {r0, r1, r4, r5, r6, pc}返回,而 LR 被修改。 -
不知道为什么这个问题被否决了。当然,措辞有些模棱两可,但它本质上是一个关于参数传递和堆栈使用的有效且具体的问题。