Как рассчитать размер файла с инструкцией по сборке Arm - PullRequest
1 голос
/ 12 июля 2020

После преобразования приведенного ниже кода сборки в двоичный размер моего файла составляет 48 байтов. Так как в руке каждая инструкция по 4 байта. Я думаю, что запись метки - 4 байта, arr - 3 байта, eoa - 1 байт, начало до l oop - 12 байтов, l oop до остановки - 16 байтов, стоп - 4 байта, таким образом, всего 40 байтов. Я не понимаю, почему он показывает 48 байтов.

    .text
entry:  b start
arr:    .byte 10, 20, 30
eoa:
    .align
start:  ldr r0, =eoa
        ldr r1, =arr
        mov r3, #0
loop:   ldrb r2, [r1], #1
        add r3, r3, r2 
        cmp r0, r1
        bne loop
stop:   b stop

user@stretch:~/Desktop/Gnu_Toolchain/Sum_An_Array$ arm-none-eabi-nm -n sum_an_array.elf
         U _start
00000000 t entry
00000004 t arr
00000007 t eoa
00000008 t start
00000014 t loop
00000024 t stop
00010030 T __bss_end__
00010030 T _bss_end__
00010030 T __bss_start
00010030 T __bss_start__
00010030 T __data_start
00010030 T _edata
00010030 T _end
00010030 T __end__
00080000 T _stack

Ответы [ 2 ]

4 голосов
/ 12 июля 2020

Причина, по которой у вас есть два лишних слова, заключается в том, что ldr здесь не инструкция, это псевдо-инструкция, как описано здесь .

Здесь ldr использует label-expression. Ассемблер генерирует команду ldr, относящуюся к P C, и помещает значение label-expression в литеральный пул.

Два дополнительных слова помещаются где-нибудь в вашей программе. Затем сгенерированные инструкции ldr загружаются с этих относительных адресов.

2 голосов
/ 12 июля 2020
    .text
entry:  b start
arr:    .byte 10, 20, 30
eoa:
    .align
start:  ldr r0, =eoa
        ldr r1, =arr
        mov r3, #0
loop:   ldrb r2, [r1], #1
        add r3, r3, r2
        cmp r0, r1
        bne loop
stop:   b stop


Disassembly of section .text:

00000000 <entry>:
   0:   ea000000    b   8 <start>

00000004 <arr>:
   4:   140a        .short  0x140a
   6:   1e              .byte   0x1e

00000007 <eoa>:
    ...

00000008 <start>:
   8:   e59f0018    ldr r0, [pc, #24]   ; 28 <stop+0x4>
   c:   e59f1018    ldr r1, [pc, #24]   ; 2c <stop+0x8>
  10:   e3a03000    mov r3, #0

00000014 <loop>:
  14:   e4d12001    ldrb    r2, [r1], #1
  18:   e0833002    add r3, r3, r2
  1c:   e1500001    cmp r0, r1
  20:   1afffffb    bne 14 <loop>

00000024 <stop>:
  24:   eafffffe    b   24 <stop>
  28:   00000007    .word   0x00000007
  2c:   00000004    .word   0x00000004

с опытом вы можете получить приблизительное представление о размере, но просто собрать и разобрать. оптимальная инструкция, другие ее либо не поддерживают, либо могут не оптимизировать. Таким образом, вы не можете просто сказать, что это будет три слова для реализации этих двух инструкций на ассемблере.

Вы могли бы сделать это без псевдо-инструкции

    .text
entry:  b start
arr:    .byte 10, 20, 30
eoa:
    .align
start:  ldr r0, eoa_add
        ldr r1, arr_add
        mov r3, #0
loop:   ldrb r2, [r1], #1
        add r3, r3, r2
        cmp r0, r1
        bne loop
stop:   b stop
eoa_add: .word eoa
arr_add: .word arr



Disassembly of section .text:

00000000 <entry>:
   0:   ea000000    b   8 <start>

00000004 <arr>:
   4:   140a        .short  0x140a
   6:   1e              .byte   0x1e

00000007 <eoa>:
    ...

00000008 <start>:
   8:   e59f0018    ldr r0, [pc, #24]   ; 28 <eoa_add>
   c:   e59f1018    ldr r1, [pc, #24]   ; 2c <arr_add>
  10:   e3a03000    mov r3, #0

00000014 <loop>:
  14:   e4d12001    ldrb    r2, [r1], #1
  18:   e0833002    add r3, r3, r2
  1c:   e1500001    cmp r0, r1
  20:   1afffffb    bne 14 <loop>

00000024 <stop>:
  24:   eafffffe    b   24 <stop>

00000028 <eoa_add>:
  28:   00000007    .word   0x00000007

0000002c <arr_add>:
  2c:   00000004    .word   0x00000004

и имели более близкая оценка.

...