Ошибка получения неверных инструкций при компиляции следующего кода в сборке

Я сейчас работаю над Raspberry Pi и столкнулся с проблемой с моим ассемблерным кодом. Когда я пытаюсь запустить его с помощью следующей команды:

     as button.o button.s

в терминале. Происходят следующие ошибки:

Assembler messages:
Error: can't open button.o for reading: No such file or directory
button.s:6: Error: bad instruction `errmsg .asciz "Setup didn't work... 
Aborting...\n"'
button.s:7: Error: bad instruction `pinup .int 3'
button.s:8: Error: bad instruction `pinleft .int 14'
button.s:9: Error: bad instruction `pindown .int 0'
button.s:10: Error: bad size 0 in type specifier
button.s:10: Error: bad instruction `pinright.int 7'
button.s:11: Error: bad instruction `pinpau .int 15'
button.s:12: Error: bad instruction `pinqu .int 2'
button.s:32: Error: bad instruction `blwiringpisetup'
button.s:48: Error: bad arguments to instruction -- `mov r7#1'
button.s:50: Error: bad instruction `be done'

Я не уверен, является ли это синтаксической ошибкой или проблемой с кодом в целом. Код следует:

//data Section

        .data
        .balign 4
Intro:  .asciz  "Raspberry Pi - Blinking led test inassembly\n"
ErrMsg  .asciz  "Setup didn't work... Aborting...\n"
pinUp   .int    3
pinLeft .int    14
pinDown .int    0
pinRight.int    7
pinPau  .int    15
pinQu   .int    2
i:  .int    0


//Code section

    .text
    .global main
    .extern printf
    .extern wiringPiSetup
    .extern delay
    .extern digitalRead
    .extern pinMode

main:   push    {ip, lr}
// printf message
    ldr r0, =Intro
    bl  printf

//Check for setup error
    blwiringPiSetup
    mov     r1,#-1
    cmp r0, r1
    bne init
    ldr r0, =ErrMsg
    bl  printf
    b   done
init:
    ldr r0, =pinUp
    ldr r1, =pinLeft
    ldr r2, =pinDown
    ldr r3, =pinRight
    ldr r4, =pinPau
    ldr r5, =pinQu

    mov r6, #1
    mov r7  #1
    cmp r6, r7
    be  done

done:
    pop {ip,pc}

После изменения переменной следующего кода:

//---------------------------------------
//  Data Section
// ---------------------------------------




          .data
          .balign 4 
Intro:   .asciz  "Raspberry Pi - Blinking led test in assembly\n"
ErrMsg:  .asciz "Setup didn't work... Aborting...\n"
pin:     .int   0
i:       .int   0
delayMs: .int   1000
OUTPUT   =      1

Любая помощь будет оценена.

1 ответ

Вы забыли двоеточие после имени вашего ярлыка, поэтому парсер рассматривал их как мнемонику инструкций. ErrMsg: вместо ErrMsg,

Кроме того, данные только для чтения обычно входят в .rodata не .data, Вы могли бы положить это в .data если вы хотите, чтобы это было рядом с чем-то другим, вы можете адресовать их все с одного базового адреса, вместо того, чтобы использовать совершенно отдельный ldr для каждого лейбла. (Вы можете генерировать адреса в регистрах с add вместо загрузки отдельного литерала.)

.section .rodata
  @ .balign 4   @ why align before strings?  Normally you'd pad for alignment *after*, unless the total string length is a multiple of 4 bytes or something.
  Intro:  .asciz  "Raspberry Pi - Blinking led test inassembly\n"
  ErrMsg:  .asciz  "Setup didn't work... Aborting...\n"

.data
    .balign 4
    pinUp:    .int    3
    pinLeft:  .int    14
    pinDown:  .int    0     @ zero-int vars could be placed in the .bss
    pinRight: .int    7
    pinPau:   .int    15
    pinQu:    .int    2

    i:  .int    0     @ do you really need / want  static int i  in your program?
                      @ Use a register for a loop counter.
Другие вопросы по тегам