我正在编写一个使某些指示灯闪烁的程序。用户将输入灯光切换和灯光顺序之间的延迟时间。因此,例如,用户将输入“ string_test 500000 123456”。两者之间的延迟将是500000,我认为它小于毫秒,因为500000相当快。数字123456将是LED编号。所以1-2-3等。当我通过调试器运行代码时,除了卡在BEQ上之外,其他所有操作都应按预期进行。如果我正常运行代码,则只有第一个灯亮起然后熄灭,该程序。我仍然必须清理代码,将延迟更改为更用户友好的方式,依此类推,但是我需要帮助的是为什么当r6为0时为什么它不在beq分支?我附加了我的汇编代码,因为我正在获取值从用户那里没问题,我也可以在调试器中循环通过LED,而没有问题,这使我相信组装方面的问题。 ASM文件中还有其他功能,这可能有问题吗?我在ARM组装中使用STM32板。
@@ 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寄存器