【问题标题】:Qemu recursive macro wrong outputQemu递归宏错误输出
【发布时间】:2021-02-28 03:33:16
【问题描述】:

谁能解释我的代码有什么问题,我使用qemu 和包arm-linux-gnueabignueabi-gcc 来运行和测试assembly 程序。

我的程序正在创建名为enummacro,它将一系列数字放入内存,但是当我运行程序时它不显示数字,它只打印0,而不是所有序列号?任何帮助

.data      
   rez: .asciz "the number is %d\n"  
   
.macro  enum from=0, into=5
.long   \from
.if    \into-\from
enum    "(\from+1)",\into
.endif
.endm

.global main
.extern printf
.func main

main:
    enum 0,6
    bx lr

【问题讨论】:

  • 印刷在哪里?你也有一个错字from3 ...它甚至没有组装。确保显示您实际使用的代码。
  • @Jester 我在宏中的错误,我不知道添加打印?请问有什么帮助吗?
  • @Frant 我刚刚更新了宏,因为 from3 中有一个错误,我不知道在我的代码中在哪里添加 printf 有什么帮助吗?
  • @Frant 我在组装时没有任何错误,请您现在检查一下吗?并帮我在哪里添加 printf 函数来打印数字?
  • @Jester 有什么帮助吗?

标签: assembly arm qemu


【解决方案1】:

我建议查看生成的代码,因为您的宏可能不会完全符合您的预期,包括调用 printf

startup-aarch32.s:

                .title startup-aarch32.s
                .arch armv7-a
                .text
                .section .text.startup,"ax"
                .globl Reset_Handler

                .macro  enum from=0, into=5
                .long   \from
                .if    \into-\from
                 enum    "(\from+1)",\into
                .endif
                .endm

Reset_Handler:
                ldr r0, =__StackTop
                mov sp, r0
                bl main
wait:           wfe
                b wait
main:
               enum 0,6
               bx lr
.data
rez:           .asciz "the number is %d\n"
               .end

/opt/arm/9/gcc-arm-9.2-2019.12-x86_64-arm-none-eabi/bin/arm-none-eabi-gcc -c -o startup3-aarch2.o startup-aarch32.s
/opt/arm/9/gcc-arm-9.2-2019.12-x86_64-arm-none-eabi/bin/arm-none-eabi-objdump -d startup3-aarch2.o

startup3-aarch2.o:     file format elf32-littlearm


Disassembly of section .text.startup:

00000000 <Reset_Handler>:
   0:   e59f002c        ldr     r0, [pc, #44]   ; 34 <main+0x20>
   4:   e1a0d000        mov     sp, r0
   8:   eb000001        bl      14 <main>

0000000c <wait>:
   c:   e320f002        wfe
  10:   eafffffd        b       c <wait>

00000014 <main>:
  14:   00000000        .word   0x00000000
  18:   00000001        .word   0x00000001
  1c:   00000002        .word   0x00000002
  20:   00000003        .word   0x00000003
  24:   00000004        .word   0x00000004
  28:   00000005        .word   0x00000005
  2c:   00000006        .word   0x00000006
  30:   e12fff1e        bx      lr
  34:   00000000        .word   0x00000000

如您所见,宏混合了数据和指令,这可能会导致无效指令错误,从而阻止您获得预期的结果。

您可能需要对其进行一些修改,恕我直言,这总是比查看生成的代码更好。

【讨论】:

  • 宏生成多个 .long 值,.long 0 .long 1 .long 2 直到最后一个元素 6,rez 只有一个 %d 而不是 long,所以我应该使用多个 %f 吗?以及如何修复它,宏看起来不错,但其他部分我不知道如何修复?!!
  • 我试图回答的问题是:“我的代码有什么问题”,我认为我提供了一个有效的答案。话虽这么说,如果这是作业的一部分,对你来说最好的想法是自己找到解决方案,这样你就可以学习/进步。这个论坛根本不是让别​​人做功课的地方。但是,如果您的代码的后续版本可能仍然无法工作,您可以提出更多问题。
  • 我试图了解宏以及它们是如何工作的,所以我创建了自己的宏,我只是希望您帮助打印宏中的长数字?请问有什么帮助吗?我真的很感激
  • 我希望你能回答我 1 个任务,枚举中的 .long 第一个数字,我想如何打印它?如何将其加载到内存和 printf 中?
  • 有很多例子,但是...首先你需要把它从main中移出并给它一个单独的标签,比如array:。您还应该为main 切换回.text,因为它不应该进入.data。然后你只需要调用printf,例如ldr r0, =rez; ldr r1, =array; ldr r1, [r1]; bl printf; b exit。 (注意我改为exit以避免保存lr。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2016-12-10
相关资源
最近更新 更多