【问题标题】:How to use printf to print long in ARM-Assembly如何在 ARM-Assembly 中使用 printf 进行长打印
【发布时间】:2020-11-16 23:14:51
【问题描述】:

如何使用printf函数打印ARM-Assembly中多个.long的值?

.global main
.extern printf
.func main

main:
    .long 15
    .long 17 
    bx lr

【问题讨论】:

    标签: assembly qemu


    【解决方案1】:

    为什么不简单地尝试一下?

    void fun ( long a, long b)
    {
        printf("%ld %ld\n",a,b);
    }
    

    编译器输出(已编辑)

    .LC0:
        .ascii  "%ld %ld\012\000"
    fun:
        mov r3, r0
        push    {r4, lr}
        mov r2, r1
        ldr r0, .L4
        mov r1, r3
        bl  printf
        pop {r4, lr}
        bx  lr
    .L4:
        .word   .LC0
    

    编译器输出(反汇编)

    00000000 <fun>:
       0:   e1a03000    mov r3, r0
       4:   e92d4010    push    {r4, lr}
       8:   e1a02001    mov r2, r1
       c:   e59f000c    ldr r0, [pc, #12]   ; 20 <fun+0x20>
      10:   e1a01003    mov r1, r3
      14:   ebfffffe    bl  0 <printf>
      18:   e8bd4010    pop {r4, lr}
      1c:   e12fff1e    bx  lr
      20:   00000000    andeq   r0, r0, r0
    
    Disassembly of section .rodata.str1.4:
    
    00000000 <.rodata.str1.4>:
       0:   20646c25    rsbcs   r6, r4, r5, lsr #24
       4:   0a646c25    beq 191b0a0 <fun+0x191b0a0>
        ...
    

    【讨论】:

    • 我正在尝试以与我提供帮助的方式相同的方式进行操作?
    • 您不明白的部分是您将操作数加载到寄存器中并调用函数,哪个寄存器保存编译器向您显示的内容。
    • @我想打印 .long 例如 .long 5 那么如何在 nxt 编码中打印它谢谢
    • 参见上面的示例,其中 .L4 被读入寄存器。没有什么不同。或者你可以在 C 中尝试一下,看看编译器会产生什么来找出语法。
    猜你喜欢
    • 1970-01-01
    • 2018-06-04
    • 2022-11-09
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多