【问题标题】:avr-gcc: Itearting over char array does not work with too many iterationsavr-gcc:对 char 数组进行迭代不适用于太多迭代
【发布时间】:2020-03-23 20:49:55
【问题描述】:

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

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  

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

现在,当我想执行循环 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

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

  • avr-gcc 版本 5.4.0
  • avr-libc 2.0.0+Atmel3.6.1-2

【问题讨论】:

    标签: debian avr avr-gcc


    【解决方案1】:

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

    那段代码意味着从 Y 指针中读取,然后增加指针。 Y 指针存储在寄存器 r29 和 r28 中。程序集中的前两条 ldi 指令将 Y 指针设置为指向存储字符串的开头。

    【讨论】:

      猜你喜欢
      • 2013-04-12
      • 2019-01-04
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多