【发布时间】:2011-11-05 18:50:52
【问题描述】:
我需要从 ARM 汇编语言例程中调用 printf。我编写了一个执行相同操作的 c 程序 (printf("%d.%d",1,2))。我反汇编了编译器输出,但格式字符串如何传递并不明显。你们有没有一个代码示例可以做到这一点?
这是我用来尝试查看如何调用 printf 的测试 c 例程。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("%d.%d\n",1,2);
return EXIT_SUCCESS;
}
我的主程序反汇编如下:
000081c4 <main>:
81c4: e1a0c00d mov ip, sp
81c8: e92dd800 stmdb sp!, {fp, ip, lr, pc}
81cc: e24cb004 sub fp, ip, #4 ; 0x4
81d0: e59f0014 ldr r0, [pc, #20] ; 81ec <.text+0x11c>
81d4: e3a01001 mov r1, #1 ; 0x1
81d8: e3a02002 mov r2, #2 ; 0x2
81dc: eb000212 bl 8a2c <_IO_printf>
81e0: e3a03000 mov r3, #0 ; 0x0
81e4: e1a00003 mov r0, r3
81e8: e89da800 ldmia sp, {fp, sp, pc}
81ec: 00060120 andeq r0, r6, r0, lsr #2
我看到了 _IO_printf 例程的分支,但我看不到如何将格式字符串传递给它。
【问题讨论】:
-
如果你附上了反汇编的相关部分,它会更容易解释(我们也可以确定我们说的是同一种语言方言)。
-
请查看我更新的问题。
-
格式字符串好像位于
00060120。请注意,最后解码的指令实际上并不意味着被解释为指令。 -
你给了我一个线索。看来我需要在 GNU arm 汇编器中指定一个像“%d.%d”这样的常量并将 r3 指向它?对吗?
-
是的,但
r0不是r3。阅读 ARM 调用约定并查看 Adam Liss 的答案。