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 字节,因为 r7
和 lr
各为 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:
压入堆栈的两个值是 r7
和 lr
中存储的值。
两个 4 字节值等于 8 字节。
对于评论 6:
标签 LPC1_0
后跟指令
add r0, pc
这两个地址之间的差异又增加了 4 个字节。
我正在研究 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 字节,因为 r7
和 lr
各为 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:
压入堆栈的两个值是 r7
和 lr
中存储的值。
两个 4 字节值等于 8 字节。
对于评论 6:
标签 LPC1_0
后跟指令
add r0, pc
这两个地址之间的差异又增加了 4 个字节。