因此,基本上,我已经对未优化的简单程序进行了反编译,并看到它运行在gcrt1.S中,然后我进入了汇编语言,并试图理解其确切功能。这是我的代码和对其功能的假设
00000034 CLR R1 Clear Register
00000035 OUT 0x3F,R1 Out to I/O location
00000036 SER R28 Set Register
00000037 LDI R29,0x08 Load immediate
00000038 OUT 0x3E,R29 Out to I/O location
00000039 OUT 0x3D,R28 Out to I/O location
0000003A CALL 0x00000040 Call subroutine
0000003C JMP 0x00000050 Jump
0000003E JMP 0x00000000 Jump
Clear R1
Clear stratus register
Set R28 1111 1111
Here is where my questions start:
Load R29 from 0x08 (PORTC ?)
OUT to SPH <-R29
OUT to SPL <-R28
Call Main
我的疑惑是为什么它从PORTC寄存器加载字节,因为无论如何默认值是0x00
微控制器为atmega328p link to a datasheet
从0x08加载R29(PORTC吗?]
指令为LDI R29,0x08
,它将8加载到R29中。 LDI是“立即加载以进行注册”;它不会从内存中读取数据,请参见所用ATmega328手册中的“ 31.指令集摘要”部分。该代码正在从符号Y
初始化帧指针__stack
,请参见gcrt1.S中的启动代码。