BEQ в сборке не разветвляется - PullRequest
0 голосов
/ 02 июля 2018

Я пишу программу, которая заставит некоторые огни мигать. Пользователь вводит время задержки между переключением источников света и последовательностью источников света. Так, например, пользователь введет «string_test 500000 123456». Задержка между ними составит 500000, я думаю, что это меньше миллисекунд, так как 500000 довольно быстро. Число 123456 будет номером светодиода. 1-2-3 и т. Д. Когда я запускаю свой код через отладчик, все работает как надо, за исключением того, что я застреваю на BEQ. Если я запускаю свой код нормально, только первый индикатор включается и выключается, а затем завершает работу. программа. Мне все еще нужно очистить код, изменить задержку на что-то более удобное для пользователя и т. Д., Но мне нужна помощь, почему он не разветвляется в beq, когда r6 равен 0? Я прикрепил свой код сборки, потому что я получаю значения У пользователя нет проблем, и я могу переключаться между светодиодами без проблем в отладчике, что заставляет меня поверить, что это что-то на стороне сборки. В файле ASM есть и другие функции, может ли это быть проблемой? Я использую плату STM32 в сборке ARM.

@@ Function Header Block
    .align  2              @ Code alignment - 2^n alignment (n=2)
                            @ This causes the assembler to use 8 byte alignment

    .syntax unified         @ Sets the instruction set to the new unified ARM + THUMB
                            @ instructions. The default is divided (separate instruction sets)

    .global string_test

    .code   16              @ 16bit THUMB code (BOTH .code and .thumb_func are required)
    .thumb_func             @ Specifies that the following symbol is the name of a THUMB
                            @ encoded function. Necessary for interlinking between ARM and THUMB code.`enter code here`

    .type   string_test, %function   @ Declares that the symbol is a function (not strictly required)

@ Function Declaration : int string_test(int delay,char *p, int count)
@
@ Input: r0, r1 , r2 (i.e. r0 holds the delay, r1 holds the lights, r2 holds the number of elements in the array(COUNT))
@ Returns: r0
@ 

@ Here is the actual function
string_test:

    push { r0, r1, r4-r7, lr}   @push the registers I am using to the stack
    mov r5, r0  @Move the delay size into r5
    mov r6, r2  @Move the array size into r6

loop:

    ldrb r7, [r1]
    mov r8, r1
    sub r7, #48

    mov r0, r7                  @move the value in r7 to r0 so BSP_LED_Toggle can use it 
    bl   BSP_LED_Toggle

    bl busy_delay

    mov r0, r7                  @move the value in r7 to r0 so BSP_LED_Toggle can use it 
    bl   BSP_LED_Toggle

    bl busy_delay
    mov r1, r8
    add r1, #1

    sub r6, #1
    cmp r6, #0

    beq endLoop

    b loop

endLoop:

    pop { r0, r1, r4-r7, lr}   @pop the registers I am using to the stack
    bx lr

Я также заметил, что BEQ пытается использовать регистр xPSR

...