【发布时间】: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
【问题讨论】: