这是 iPhone 上 syscall() 的反汇编。
(gdb) disass syscall
Dump of assembler code for function syscall:
0x3195fafc <syscall+0>: mov r12, sp
0x3195fb00 <syscall+4>: push {r4, r5, r6, r8}
0x3195fb04 <syscall+8>: ldm r12, {r4, r5, r6}
0x3195fb08 <syscall+12>: mov r12, #0 ; 0x0
0x3195fb0c <syscall+16>: svc 0x00000080
0x3195fb10 <syscall+20>: pop {r4, r5, r6, r8}
0x3195fb14 <syscall+24>: bcc 0x3195fb2c <syscall+48>
0x3195fb18 <syscall+28>: ldr r12, [pc, #4] ; 0x3195fb24 <syscall+40>
0x3195fb1c <syscall+32>: ldr r12, [pc, r12]
0x3195fb20 <syscall+36>: b 0x3195fb28 <syscall+44>
0x3195fb24 <syscall+40>: cfldrdeq mvd15, [r12], #992
0x3195fb28 <syscall+44>: bx r12
0x3195fb2c <syscall+48>: bx lr
End of assembler dump.
有人可以解释一下偏移量 +28,+32 的指令在做什么吗?在 +28 时,r12 的值为 0(设置为 +12),因此看起来 r12 被设置为(在 C 表示法中)*(pc + 4)。在 +32 时,r12 设置为 *(pc + r12) - 请注意,该指令未编译 - 请参见下面的 #3。+36 处的 'b' 跳转到 +44,返回到 r12 中的地址。那么 +28 和 +32 将什么值加载到 r12 中?
+40 处的 cfldrdeq 指令有什么作用?我检查了 ARM 指令集并进行了搜索,但没有找到任何东西。
我使用asm ()将此代码添加到我的 C 程序中。编译时,编译器会显示这些错误。知道如何解决这个问题吗?
/var/folders/62/3px_xsd56ml5gz18lp8dptjc0000gv/T//ccDThXFx.s:7607: 不能将寄存器索引用于 PC 相对寻址 --ldr r12,[pc,r12]' /var/folders/62/3px_xsd56ml5gz18lp8dptjc0000gv/T//ccDThXFx.s:7609:selected processor does not support
cfldrdeq mvd15,[r12],#992'