avr-gcc:遍历char数组不适用于太多的迭代

问题描述 投票:0回答:1

我有一个简单的函数,该函数遍历字符数组并为每个字符调用一个函数。

void loopFunction(void)                                                                                                                                               
{
    char *mystring = "ABCDEF";
    int i = 0;
    for (i = 0; i<3; i++) {
        LCD_Write(mystring[i]);
    }
}

此函数工作正常,可以提供适当的输出(最后在我的LCD显示屏上,并且中间的汇编代码看起来也不错:

loopFunction:
/* prologue: function */
/* frame size = 0 */
/* stack size = 0 */
.L__stack_usage = 0 
    ldi r24,lo8(65)
    call LCD_Write
    ldi r24,lo8(66)
    call LCD_Write
    ldi r24,lo8(67)
    jmp LCD_Write
    .size   loopFunction, .-loopFunction  

如我们所见,循环已转换为简单地调用该函数三次。

现在,当我要执行4次循环时,问题就开始了:

void loopFunction(void)                                                                                                                                               
{
    char *mystring = "ABCDEF";
    int i = 0;
    for (i = 0; i<4; i++) {
        LCD_Write(mystring[i]);
    }
}


loopFunction:
    push r28
    push r29
/* prologue: function */
/* frame size = 0 */
/* stack size = 2 */
.L__stack_usage = 2
    ldi r28,lo8(.LC0)
    ldi r29,hi8(.LC0)
.L12:
    ld r24,Y+
    call LCD_Write
    ldi r24,hi8(.LC0+4)
    cpi r28,lo8(.LC0+4)
    cpc r29,r24
    brne .L12
/* epilogue start */                                                                                                                                                      
    pop r29
    pop r28
    ret

所以,对我来说,似乎从未访问过实际存储的字符串

.LC0:
    .string "ABCDEF"
    .text

我在做什么错?

我正在呼叫avr-gcc

avr-gcc -mmcu=atmega16 -Wall -O3 --save-temps -Os -c lcd.c

在Debian10上,带有来自buster repo的软件包

  • avr-gcc版本5.4.0
  • avr-libc 2.0.0 + Atmel3.6.1-2
debian avr avr-gcc
1个回答
0
投票

存储的字符串在汇编代码中显示为Y+的部分中访问。

该代码段的意思是从Y指针读取,然后将其递增。 Y指针存储在寄存器r29和r28中。程序集中的前两个ldi指令将Y指针设置为指向存储的字符串的开头。

© www.soinside.com 2019 - 2024. All rights reserved.