Ошибка получения неверных инструкций при компиляции следующего кода в сборке
Я сейчас работаю над 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.