Сообщение об ошибке ARM Неправильное назначение ветви - PullRequest
0 голосов
/ 18 марта 2020

Итак, я только что закончил простую программу, которая принимает массив входными данными и возвращает его в обратном порядке ... или так я, хотя, когда я скомпилировал с использованием ARMSim (требуется для моего назначения), он вызвал у меня 2 вида ошибки: «Неверная константа литерала» и «Неправильное назначение ветви»

enter image description here

- это часть кода, которая наиболее важна для этого error (неправильное назначение ветки)



@ PROGRAMA
.text
.global main
main:
    ldr r0, =primero
    bl prints
    ldr r0, adr_num                     @donde se guardara n
    mov r1, #4                          @buffer para el primer numero (que pueda ser de maximo 3 char + un terminante)
    mov r2, #0                          @indica que fgets debe leer de stdin
    bl fgets
    bl atoi                             @se transforma a int para poder evaluar los numeros sin considerar un posible "\n" irrelevante
    mov r5, r0                          @guardar el entero recibido
    mov r7, r0
firstLoop:
    ldr r0, =segundo
    bl prints
    cmp r5, #0
    beq msg 
    ldr r0, adr_num                     @donde se guardara n
    mov r1, #4                          @buffer para el primer numero (que pueda ser de maximo 3 char + un terminante)
    mov r2, #0                          @indica que fgets debe leer de stdin
    bl fgets
    bl atoi                             @se transforma a int para poder evaluar los numeros sin considerar un posible "\n" irrelevante
    str r6, [r0], #4                    @guardo el numero en el registro
    sub r5, r5, #1                      
    b firstLoop
msg:
    ldr r0, =tercero
    bl prints
secondLoop:
    cmp r7, #0
    beq exit
    ldr r0, [r6], #-4
    sub r7, r7, #1
    b secondLoop                            

.data
result_str:     .asciz      "Pi is approximately 22/7 = %f \n"
exit_str:       .ascii      "Terminating program.\n"

@Direcciones de memoria de los valores en DATOS

adr_num: .word number       @Aca se define el espacio para un entero (ver el final al documento, seccion .DATA)
adr_str: .word string           @Acá se define el espacio para un string (ver el final al documento, seccion .DATA)

@Lectura primer caracter (n):
ldr r0, adr_num                     @donde se guardara n
mov r1, #4                          @buffer para el primer numero (que pueda ser de maximo 3 char + un terminante)
mov r2, #0                          @indica que fgets debe leer de stdin
bl fgets
bl atoi                             @se transforma a int para poder evaluar los numeros sin considerar un posible "\n" irrelevante
mov r5, r0                          @guardar el entero recibido

mov r0, r5                          @Se mueve el resultado a el registro R0 para transformar el entero a string
ldr r1, adr_str                     @Se guarda el espacio suficiente para guardar el resultado de la transformacion


bl itoa
bl prints

b exit

exit:
mov r0, #0x18
mov r1, #0
swi 0x123456

@ prints: Retorna un string ASCII terminado en null a stdout
@
@ Uso abstracto:
@    prints(r0)
@ Inputs:
@    r0: direccion de memoria al string ASCII terminado en null
@ Resultado:
@    N/A, pero se escribe el string al stdout (la consola)
prints:
    stmfd   sp!, {r0,r1,lr}
    ldr r1, =operands
    str r0, [r1,#4]
    bl  strlen
    str r0, [r1,#8]
    mov r0, #0x0
    str r0, [r1]
    mov r0, #0x05
    swi 0x123456
    ldmfd   sp!, {r0,r1,pc}

atoi - это еще одна функция внизу, которая передает ascii в эквивалент в int

1 Ответ

0 голосов
/ 18 марта 2020

Благодаря Шуту я понял, что мне нужно вернуться на .text с .data

...