Я пишу программу, которая заставит некоторые огни мигать. Пользователь вводит время задержки между переключением источников света и последовательностью источников света. Так, например, пользователь введет «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