我有一个简单的函数,该函数遍历字符数组并为每个字符调用一个函数。
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的软件包
存储的字符串在汇编代码中显示为Y+
的部分中访问。
该代码段的意思是从Y指针读取,然后将其递增。 Y指针存储在寄存器r29和r28中。程序集中的前两个ldi
指令将Y
指针设置为指向存储的字符串的开头。