Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [gcc avr]Assembly pre-programma
Forum - C/C++ - [gcc avr]Assembly pre-programma

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 17:57
Martedì, 01/12/2015
Buonasera, divido il precedente topic in due per garantire una piu semplice risoluzione. Quello che mi trovo davanti non è un problema bensì una perplessità. Compilato un listato in C mi ritrovo sempre questo listato assembly prima del mio programma.
Codice sorgente - presumibilmente Plain Text

  1. 00000000  JMP 0x00000034                Jump
  2. 00000002  JMP 0x00000046                Jump
  3. 00000004  JMP 0x00000046                Jump
  4. 00000006  JMP 0x00000046                Jump
  5. 00000008  JMP 0x00000046                Jump
  6. 0000000A  JMP 0x00000046                Jump
  7. 0000000C  JMP 0x00000046                Jump
  8. 0000000E  JMP 0x00000046                Jump
  9. 00000010  JMP 0x00000046                Jump
  10. 00000012  JMP 0x00000046                Jump
  11. 00000014  JMP 0x00000046                Jump
  12. 00000016  JMP 0x00000046                Jump
  13. 00000018  JMP 0x00000046                Jump
  14. 0000001A  JMP 0x00000046                Jump
  15. 0000001C  JMP 0x00000046                Jump
  16. 0000001E  JMP 0x00000046                Jump
  17. 00000020  JMP 0x00000046                Jump
  18. 00000022  JMP 0x00000046                Jump
  19. 00000024  JMP 0x00000046                Jump
  20. 00000026  JMP 0x00000046                Jump
  21. 00000028  JMP 0x00000046                Jump
  22. 0000002A  JMP 0x00000046                Jump
  23. 0000002C  JMP 0x00000046                Jump
  24. 0000002E  JMP 0x00000046                Jump
  25. 00000030  JMP 0x00000046                Jump
  26. 00000032  JMP 0x00000046                Jump
  27. 00000034  CLR R1                Clear Register
  28. 00000035  OUT 0x3F,R1           Out to I/O location
  29. 00000036  SER R28               Set Register
  30. 00000037  LDI R29,0x08          Load immediate
  31. --- Nessun file di origine -----------------------------------------------------
  32. 00000038  OUT 0x3E,R29          Out to I/O location
  33. 00000039  OUT 0x3D,R28          Out to I/O location
  34. 0000003A  LDI R18,0x01          Load immediate
  35. 0000003B  LDI R26,0x00          Load immediate
  36. 0000003C  LDI R27,0x01          Load immediate
  37. 0000003D  RJMP PC+0x0002                Relative jump
  38. 0000003E  ST X+,R1              Store indirect and postincrement
  39. 0000003F  CPI R26,0x02          Compare with immediate
  40. 00000040  CPC R27,R18           Compare with carry
  41. 00000041  BRNE PC-0x03          Branch if not equal
  42. 00000042  CALL 0x00000048               Call subroutine
  43. 00000044  JMP 0x00000050                Jump
  44. 00000046  JMP 0x00000000                Jump


Sinceramente non ne capisco l'utilità, qualcuno potrebbe illuminarmi, la compilazione è avvenuta con gcc-avr rilasciato con Atmel Studio 7(il listato appariva anche nelle vecchie versioni) per un ATmega328P.
Grazie.

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 0:06
Mercoledì, 02/12/2015
Codice sorgente - presumibilmente Plain Text

  1. 00000044  JMP 0x00000050                Jump
  2. 00000046  JMP 0x00000000                Jump



Suppongo che il codice inizi all'indirizzo 0x00000050  e che a esecuzione completa ci sia un JMP 0x00000046 questo per dare la ripetitività del programma.
ATmega328P è l'atmega montato su arduino, stai usando le librerie arduino? Perche sospetto che quel codice prima.... inizializzi la seriale...........

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 14:32
Mercoledì, 02/12/2015
In Arduino la seriale viene inizializzata nel bootloader. Che comunque viene ripetuta per sicurezza all'avvio del programma, che il compilatore inserisce all'indirizzo 0x0047(in questo caso) per motivi a me sconosciuti.
Prendiamo per esempio
Codice sorgente - presumibilmente C/C++

  1. int main {}


Questo è l'assembly generato
Codice sorgente - presumibilmente C/C++

  1. --- Nessun file di origine -----------------------------------------------------
  2. 00000000  JMP 0x00000034                Jump
  3. 00000002  JMP 0x0000003E                Jump
  4. 00000004  JMP 0x0000003E                Jump
  5. 00000006  JMP 0x0000003E                Jump
  6. 00000008  JMP 0x0000003E                Jump
  7. 0000000A  JMP 0x0000003E                Jump
  8. 0000000C  JMP 0x0000003E                Jump
  9. 0000000E  JMP 0x0000003E                Jump
  10. 00000010  JMP 0x0000003E                Jump
  11. 00000012  JMP 0x0000003E                Jump
  12. 00000014  JMP 0x0000003E                Jump
  13. 00000016  JMP 0x0000003E                Jump
  14. 00000018  JMP 0x0000003E                Jump
  15. 0000001A  JMP 0x0000003E                Jump
  16. 0000001C  JMP 0x0000003E                Jump
  17. 0000001E  JMP 0x0000003E                Jump
  18. 00000020  JMP 0x0000003E                Jump
  19. 00000022  JMP 0x0000003E                Jump
  20. 00000024  JMP 0x0000003E                Jump
  21. 00000026  JMP 0x0000003E                Jump
  22. 00000028  JMP 0x0000003E                Jump
  23. 0000002A  JMP 0x0000003E                Jump
  24. 0000002C  JMP 0x0000003E                Jump
  25. 0000002E  JMP 0x0000003E                Jump
  26. 00000030  JMP 0x0000003E                Jump
  27. 00000032  JMP 0x0000003E                Jump
  28. 00000034  CLR R1                Clear Register
  29. 00000035  OUT 0x3F,R1           Out to I/O location
  30. 00000036  SER R28               Set Register
  31. 00000037  LDI R29,0x08          Load immediate
  32. --- Nessun file di origine -----------------------------------------------------
  33. 00000038  OUT 0x3E,R29          Out to I/O location
  34. 00000039  OUT 0x3D,R28          Out to I/O location
  35. 0000003A  CALL 0x00000040               Call subroutine
  36. 0000003C  JMP 0x00000043                Jump
  37. 0000003E  JMP 0x00000000                Jump
  38. --- ./main.c
  39. {
  40. }
  41. 00000040  LDI R24,0x00          Load immediate
  42. 00000041  LDI R25,0x00          Load immediate
  43. 00000042  RET           Subroutine return
  44. --- Nessun file di origine -----------------------------------------------------
  45. 00000043  CLI           Global Interrupt Disable
  46. 00000044  RJMP PC-0x0000                Relative jump
  47. 00000045  NOP           Undefined


Per esempio il registro 0x3F è il registro di stato del microcontrollore.

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 17:40
Mercoledì, 02/12/2015
Aggiornamenti, ho controllato meglio il codice e le istruzioni presenti non sono messe poi cosi a caso.
Codice sorgente - presumibilmente C/C++

  1. 00000034  CLR R1                ;Il registro R1 diventa il mio registro di riferimento 0
  2. 00000035  OUT 0x3F,R1                 ;Resetto il registro di stato della CPU
  3. 00000036  SER R28              
  4. 00000037  LDI R29,0x08
  5. 00000038  OUT 0x3E,R29         ;Stack point high diventa 0x08
  6. 00000039  OUT 0x3D,R28        ;Stack point low diventa 0xFF => Lo stack pointer punta all'indirizzo 0x08FF della RAM (l'indirizzo 0 dello stack)
  7. 0000003A  LDI R18,0x01
  8. 0000003B  LDI R26,0x00
  9. 0000003C  LDI R27,0x01
  10. 0000003D  RJMP PC+0x0002   ;Salta a 0x40
  11. 0000003E  ST X+,R1              
  12. 0000003F  CPI R26,0x02
  13. 00000040  CPC R27,R18        ;Compara i due registri contenti 0 e 1 e non vedo come possa venire un risultato diverso da 1 visto che carry è stato impostato a 0 al passo 0x35
  14. 00000041  BRNE PC-0x03      ;Questa condizione non dovrebbe mai essere vera quindi ignoriamo il jump a 0x3F
  15. 00000042  CALL 0x00000048     ;Avvio il programma principale => che non comprendo in quanto una jump sarebbe piu sensata


Risultano ancora delle parti poco sensate ai miei occhi compresi i numerosi jump iniziali che non si sa a che servono. Qualcuno ha idee?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:47
Mercoledì, 02/12/2015
Che versione di Arduino ?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 18:16
Mercoledì, 02/12/2015
Codice sorgente - presumibilmente C/C++

  1. CALL 0x00000048     ;Avvio il programma principale => che non comprendo in quanto una jump sarebbe piu sensata



No, ti sbagli: dal main fai return, ergo una call può funzionare, un jump no.

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 18:30
Mercoledì, 02/12/2015
Non stiamo parlando di Arduino, ma di un semplice ATmega328P programmato in C.

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 19:02
Mercoledì, 02/12/2015
Testo quotato

Postato originariamente da TheDarkJuster:

Codice sorgente - presumibilmente C/C++

  1. CALL 0x00000048     ;Avvio il programma principale => che non comprendo in quanto una jump sarebbe piu sensata



No, ti sbagli: dal main fai return, ergo una call può funzionare, un jump no.


Nei microcontrollori non è previsto a livello logico il return nel main, un programma deve essere eseguito in loop senza uscita, un jump sarebbe piu che sufficiente.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:18
Mercoledì, 02/12/2015
Testo quotato

Postato originariamente da Roby94:

ATmega328P  



Allora quella è la tabella standard dei vettori del micro.

Il dettaglio di ogni vettore è il seguente

Codice sorgente - presumibilmente Plain Text

  1. 0x0000 jmp RESET ; Reset Handler
  2. 0x0002 jmp EXT_INT0 ; IRQ0 Handler
  3. 0x0004 jmp EXT_INT1 ; IRQ1 Handler
  4. 0x0006 jmp PCINT0 ; PCINT0 Handler
  5. 0x0008 jmp PCINT1 ; PCINT1 Handler
  6. 0x000A jmp PCINT2 ; PCINT2 Handler
  7. 0x000C jmp WDT ; Watchdog Timer Handler
  8. 0x000E jmp TIM2_COMPA ; Timer2 Compare A Handler
  9. 0x0010 jmp TIM2_COMPB ; Timer2 Compare B Handler
  10. 0x0012 jmp TIM2_OVF ; Timer2 Overflow Handler
  11. 0x0014 jmp TIM1_CAPT ; Timer1 Capture Handler
  12. 0x0016 jmp TIM1_COMPA ; Timer1 Compare A Handler
  13. 0x0018 jmp TIM1_COMPB ; Timer1 Compare B Handler
  14. 0x001A jmp TIM1_OVF ; Timer1 Overflow Handler
  15. 0x001C jmp TIM0_COMPA ; Timer0 Compare A Handler
  16. 0x001E jmp TIM0_COMPB ; Timer0 Compare B Handler
  17. 0x0020 jmp TIM0_OVF ; Timer0 Overflow Handler
  18. 0x0022 jmp SPI_STC ; SPI Transfer Complete Handler
  19. 0x0024 jmp USART_RXC ; USART, RX Complete Handler
  20. 0x0026 jmp USART_UDRE ; USART, UDR Empty Handler
  21. 0x0028 jmp USART_TXC ; USART, TX Complete Handler
  22. 0x002A jmp ADC ; ADC Conversion Complete Handler
  23. 0x002C jmp EE_RDY ; EEPROM Ready Handler
  24. 0x002E jmp ANA_COMP ; Analog Comparator Handler
  25. 0x0030 jmp TWI ; 2-wire Serial Interface Handler
  26. 0x0032 jmp SPM_RDY ; Store Program Memory Ready Handler
  27. ;
  28. 0x0034 RESET:



Ovviamente non tutti i vettori sono utilizzati


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo