从ARM汇编语言调用c函数printf?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (363)

我需要从ARM汇编语言例程调用printf。我写了一个执行相同操作的ac程序(printf("%d.%d",1,2))。我反汇编了编译器输出,但格式字符串的传递方式并不明显。你们有没有一个代码的例子来做到这一点?

这是我用来尝试查看如何调用printf的测试例程。

 #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例程的分支,但我没有看到如何传递格式字符串。

提问于
用户回答回答于

你的代码等同于:

const char formatString[] = "%d.%d";
printf(&formatString[0], 1, 2);
用户回答回答于

我看到_IO_printf例程的分支,但我没有看到如何传递格式字符串。

寄存器R0是字符串的地址,R1是“1”,R2是“2”。Adam Liss错了,在ARM中你使用R0-R4作为前4个函数参数。

这条线

81d0: e59f0014 ldr r0, [pc, #20] ; 81ec <.text+0x11c>

加载存储在返回R0后面的函数“尾部”的地址。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励