Как исправить директиву WHILE при использовании GCC? - PullRequest
1 голос
/ 27 июня 2019

На моем прежнем рабочем месте мы разрабатывали множество наших сборочных кодов ARM v7 с IDE Keil muvision.Для меня стало обычным делом злоупотреблять директивой WHILE для параметризованного дублирования строк кода (см. Пример, который работает в Keil IDE).

Теперь я хочу портировать некоторые из этих кодов, чтобы они работали на моем Raspberry Pi.Мне удалось решить все проблемы, с которыми я мог столкнуться, оставляя ту легкость, которую может обеспечить keil IDE, но я борюсь с этой последней частью.GCC не распознает никакую инструкцию директивы WHILE (WHILE, WEND, GBLA и т. Д.).Любая идея, как обойти эту проблему или есть какие-либо эквиваленты директив WHILE, которые не влияют на время или размер кода?

Я компилирую, вызывая следующую команду: gcc main.c * .h *.S-o exe

    GBLA        var
var SETA     0
    WHILE var < DEFINED_VALUE
    LDR     R4, [R7, #var*4]
    EOR     R4, R4, R5, LSL #16
    STR     R4, [R0, #var*4]
var SETA var+1
    WEND

1 Ответ

1 голос
/ 27 июня 2019

Вы можете использовать директивы .set, .rept / .endr и .set для достижения желаемого.

Пример:

.set var, 0
.rept 5
    LDR  R4, [R7, #var*4]
    EOR  R4, R4, R5, LSL #16
    STR  R4, [R0, #var*4]
.set var,var+1
.endr

Результат какследует:

$ gcc test.s -o test.o -c
$ objdump -d test.o

test.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <.text>:
   0:   e5974000        ldr     r4, [r7]
   4:   e0244805        eor     r4, r4, r5, lsl #16
   8:   e5804000        str     r4, [r0]
   c:   e5974004        ldr     r4, [r7, #4]
  10:   e0244805        eor     r4, r4, r5, lsl #16
  14:   e5804004        str     r4, [r0, #4]
  18:   e5974008        ldr     r4, [r7, #8]
  1c:   e0244805        eor     r4, r4, r5, lsl #16
  20:   e5804008        str     r4, [r0, #8]
  24:   e597400c        ldr     r4, [r7, #12]
  28:   e0244805        eor     r4, r4, r5, lsl #16
  2c:   e580400c        str     r4, [r0, #12]
  30:   e5974010        ldr     r4, [r7, #16]
  34:   e0244805        eor     r4, r4, r5, lsl #16
  38:   e5804010        str     r4, [r0, #16]

См. также: Полезные директивы ассемблера и макросы для ассемблера GNU .

...