AVR gcrt1.S странный вызов - PullRequest
0 голосов
/ 24 января 2020

Итак, в основном я декомпилировал неоптимизированную простую программу и увидел, что она запускается через 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

У меня есть такое понимание, почему он загружает байт из регистра PORT C, так как по умолчанию будет 0x00 в любом случае

Микроконтроллер atmega328p ссылка на таблицу данных

1 Ответ

1 голос
/ 24 января 2020

Загрузка R29 из 0x08 (ПОРТ C?)

Инструкция LDI R29,0x08, которая загружает 8 в R29. LDI - это «загрузить немедленно для регистрации»; он не считывает данные из памяти, см. раздел «31. Сводка набора инструкций» в используемом руководстве ATmega328. Код инициализирует указатель кадра Y из символа __stack, см. Код запуска в gcrt1.S .

...