Метки в 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>

Но когда я дизассемблирую код C, сгенерированный GCC, метки не «разделяются» так, и стрелки перехода рисуются правильно:

 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? Я неправильно использую ярлыки?


person Katharina    schedule 11.04.2020    source источник
comment
Мой objdump этого не делает. Какую версию вы используете? В любом случае, старайтесь не использовать метки с точкой в ​​начале.   -  person Jester    schedule 11.04.2020
comment
Кроме того, какие аргументы командной строки вы даете objdump?   -  person Nate Eldredge    schedule 11.04.2020
comment
Начинайте названия ярлыков с .L, чтобы они не отображались.   -  person fuz    schedule 11.04.2020
comment
Вывод, который вы описываете как беспорядок, не является неверным. Ярлыки не занимают места. Машинный код в любом случае разветвляет целевые инструкции, а не метки.   -  person Erik Eidt    schedule 11.04.2020