首页 > 解决方案 > GNU AS 中的标签在反汇编中的行为与 GCC 代码不同

问题描述

当我使用标签编写自定义汇编代码时,反汇编真的很难阅读,因为它为每个标签启动了一个新块,例如以下代码:

    lui t2, %hi(_edata)
    addi t2, t2, %lo(_edata)
.copy_loop:
    bgeu t1, t2, .copy_end
    lw t3, 0(t0)
    sw t3, 0(t1)
    addi t0, t0, 4
    addi t1, t1, 4
    j .copy_loop
.copy_end:

变成以下混乱objdump

 168:   00030313            mv  t1,t1
 16c:   000033b7            lui t2,0x3
 170:   01838393            addi    t2,t2,24 # 3018 <_edata>

00000174 <.copy_loop>:
 174:   /-> 00737c63            bgeu    t1,t2,18c <.copy_end>
 178:   |   0002ae03            lw  t3,0(t0)
 17c:   |   01c32023            sw  t3,0(t1)
 180:   |   00428293            addi    t0,t0,4
 184:   |   00430313            addi    t1,t1,4
 188:   \-- fedff06f            j   174 <.copy_loop>

0000018c <.copy_end>:
 18c:   000032b7            lui t0,0x3
 190:   02028293            addi    t0,t0,32 # 3020 <_irq_reg_save>

但是当我反汇编由 GCC 生成的 C 代码时,标签并没有像那样“分离”,并且跳转箭头被正确绘制:

 470:          01076713             ori a4,a4,16
 474:          00e7a023             sw  a4,0(a5)
 478:      /-- 01c0006f             j   494 <lcd_puts+0x4c>
 47c:   /--|-> fec42783             lw  a5,-20(s0)
 480:   |  |   00178713             addi    a4,a5,1
 484:   |  |   fee42623             sw  a4,-20(s0)
 488:   |  |   0007c783             lbu a5,0(a5)
 48c:   |  |   00078513             mv  a0,a5
 490:   |  |   dfdff0ef             jal ra,28c <lcd_write_raw>
 494:   |  \-> fec42783             lw  a5,-20(s0)
 498:   |      0007c783             lbu a5,0(a5)
 49c:   \----- fe0790e3             bnez    a5,47c <lcd_puts+0x34>
 4a0:          00000013             nop
 4a4:          00000013             nop

在 GNU AS 中编写自定义汇编代码时,有没有办法获得相同的结果?我用错了标签吗?

标签: assemblydisassemblygnu-assemblerriscvobjdump

解决方案


推荐阅读