iOS 汇编语言的澄清

Clarifications on iOS Assembly Language

我正在研究 Objective-C 语言如何映射到 Assembly。我是从 iOS Assembly Tutorial.

上的教程开始的

分析的代码片段如下。

void fooFunction() {
    int add = addFunction(12, 34);
    printf("add = %i", add);
}

翻译成

 _fooFunction:
@ 1:
    push    {r7, lr}
@ 2:
    movs    r0, #12
    movs    r1, #34
@ 3:
    mov r7, sp
@ 4:
    bl  _addFunction
@ 5:
    mov r1, r0
@ 6:
    movw    r0, :lower16:(L_.str-(LPC1_0+4))
    movt    r0, :upper16:(L_.str-(LPC1_0+4))
LPC1_0:
    add r0, pc
@ 7:
    blx _printf
@ 8:
    pop {r7, pc}

关于汇编代码,以下两点看不懂

->评论@1

作者说 push 将堆栈递减 8 字节,因为 r7lr 各为 4 字节。好的。但他也说这两个值是用一条指令存储的。这是什么意思?

->评论@6

movw    r0, :lower16:(L_.str-(LPC1_0+4))
movt    r0, :upper16:(L_.str-(LPC1_0+4))

作者说 r0 将保存 "add = %i" 的地址(可以在数据段中找到),但我真的不明白内存布局是什么样的。为什么他用黑色虚线而不是红色虚线(我画的)表示差异L_.str-(LPC1_0+4)

如有任何说明,我们将不胜感激。

编辑

我缺少将 r7 压入堆栈的概念。推送该值是什么意思,它包含什么?

But he also says that the two values are stored with the one instruction. What does it mean?

单个 push 指令会将两个值都放入堆栈。

Why does he represent the difference L_.str-(LPC1_0+4)

因为 add r0, pc 隐含地增加了 4 个字节。引用 instruction set reference:

Add an immediate constant to the value from sp or pc, and place the result into a low register.
Syntax: ADD Rd, Rp, #expr
where:
Rd   is the destination register. Rd mustbe in the range r0-r7.
Rp   is either sp or pc.
expr is an expression that evaluates (at assembly time) to a multiple of 4 in the range 0-1020.

If Rp is the pc, the value used is: (the address of the current instruction + 4) AND &FFFFFFFC.

对于评论 1: 压入堆栈的两个值是 r7lr 中存储的值。

两个 4 字节值等于 8 字节。

对于评论 6: 标签 LPC1_0 后跟指令

add r0, pc

这两个地址之间的差异又增加了 4 个字节。