Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
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 |
00000000 JMP 0x00000034 Jump
00000002 JMP 0x00000046 Jump
00000004 JMP 0x00000046 Jump
00000006 JMP 0x00000046 Jump
00000008 JMP 0x00000046 Jump
0000000A JMP 0x00000046 Jump
0000000C JMP 0x00000046 Jump
0000000E JMP 0x00000046 Jump
00000010 JMP 0x00000046 Jump
00000012 JMP 0x00000046 Jump
00000014 JMP 0x00000046 Jump
00000016 JMP 0x00000046 Jump
00000018 JMP 0x00000046 Jump
0000001A JMP 0x00000046 Jump
0000001C JMP 0x00000046 Jump
0000001E JMP 0x00000046 Jump
00000020 JMP 0x00000046 Jump
00000022 JMP 0x00000046 Jump
00000024 JMP 0x00000046 Jump
00000026 JMP 0x00000046 Jump
00000028 JMP 0x00000046 Jump
0000002A JMP 0x00000046 Jump
0000002C JMP 0x00000046 Jump
0000002E JMP 0x00000046 Jump
00000030 JMP 0x00000046 Jump
00000032 JMP 0x00000046 Jump
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
--- Nessun file di origine -----------------------------------------------------
00000038 OUT 0x3E,R29 Out to I/O location
00000039 OUT 0x3D,R28 Out to I/O location
0000003A LDI R18,0x01 Load immediate
0000003B LDI R26,0x00 Load immediate
0000003C LDI R27,0x01 Load immediate
0000003D RJMP PC+0x0002 Relative jump
0000003E ST X+,R1 Store indirect and postincrement
0000003F CPI R26,0x02 Compare with immediate
00000040 CPC R27,R18 Compare with carry
00000041 BRNE PC-0x03 Branch if not equal
00000042 CALL 0x00000048 Call subroutine
00000044 JMP 0x00000050 Jump
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.
|
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
Codice sorgente - presumibilmente Plain Text |
00000044 JMP 0x00000050 Jump
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...........
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
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++ |
Questo è l'assembly generato
Codice sorgente - presumibilmente C/C++ |
--- Nessun file di origine -----------------------------------------------------
00000000 JMP 0x00000034 Jump
00000002 JMP 0x0000003E Jump
00000004 JMP 0x0000003E Jump
00000006 JMP 0x0000003E Jump
00000008 JMP 0x0000003E Jump
0000000A JMP 0x0000003E Jump
0000000C JMP 0x0000003E Jump
0000000E JMP 0x0000003E Jump
00000010 JMP 0x0000003E Jump
00000012 JMP 0x0000003E Jump
00000014 JMP 0x0000003E Jump
00000016 JMP 0x0000003E Jump
00000018 JMP 0x0000003E Jump
0000001A JMP 0x0000003E Jump
0000001C JMP 0x0000003E Jump
0000001E JMP 0x0000003E Jump
00000020 JMP 0x0000003E Jump
00000022 JMP 0x0000003E Jump
00000024 JMP 0x0000003E Jump
00000026 JMP 0x0000003E Jump
00000028 JMP 0x0000003E Jump
0000002A JMP 0x0000003E Jump
0000002C JMP 0x0000003E Jump
0000002E JMP 0x0000003E Jump
00000030 JMP 0x0000003E Jump
00000032 JMP 0x0000003E Jump
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
--- Nessun file di origine -----------------------------------------------------
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 0x00000043 Jump
0000003E JMP 0x00000000 Jump
--- ./main.c
{
}
00000040 LDI R24,0x00 Load immediate
00000041 LDI R25,0x00 Load immediate
00000042 RET Subroutine return
--- Nessun file di origine -----------------------------------------------------
00000043 CLI Global Interrupt Disable
00000044 RJMP PC-0x0000 Relative jump
00000045 NOP Undefined
|
Per esempio il registro 0x3F è il registro di stato del microcontrollore. |
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Aggiornamenti, ho controllato meglio il codice e le istruzioni presenti non sono messe poi cosi a caso.
Codice sorgente - presumibilmente C/C++ |
00000034 CLR R1 ;Il registro R1 diventa il mio registro di riferimento 0
00000035 OUT 0x3F,R1 ;Resetto il registro di stato della CPU
00000036 SER R28
00000037 LDI R29,0x08
00000038 OUT 0x3E,R29 ;Stack point high diventa 0x08
00000039 OUT 0x3D,R28 ;Stack point low diventa 0xFF => Lo stack pointer punta all'indirizzo 0x08FF della RAM (l'indirizzo 0 dello stack)
0000003A LDI R18,0x01
0000003B LDI R26,0x00
0000003C LDI R27,0x01
0000003D RJMP PC+0x0002 ;Salta a 0x40
0000003E ST X+,R1
0000003F CPI R26,0x02
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
00000041 BRNE PC-0x03 ;Questa condizione non dovrebbe mai essere vera quindi ignoriamo il jump a 0x3F
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?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
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à. |
|
TheDarkJuster (Member)
Guru^2
Messaggi: 1620
Iscritto: 27/09/2013
|
Codice sorgente - presumibilmente C/C++ |
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.
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Non stiamo parlando di Arduino, ma di un semplice ATmega328P programmato in C.
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Postato originariamente da TheDarkJuster:
Codice sorgente - presumibilmente C/C++ |
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. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
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 |
0x0000 jmp RESET ; Reset Handler
0x0002 jmp EXT_INT0 ; IRQ0 Handler
0x0004 jmp EXT_INT1 ; IRQ1 Handler
0x0006 jmp PCINT0 ; PCINT0 Handler
0x0008 jmp PCINT1 ; PCINT1 Handler
0x000A jmp PCINT2 ; PCINT2 Handler
0x000C jmp WDT ; Watchdog Timer Handler
0x000E jmp TIM2_COMPA ; Timer2 Compare A Handler
0x0010 jmp TIM2_COMPB ; Timer2 Compare B Handler
0x0012 jmp TIM2_OVF ; Timer2 Overflow Handler
0x0014 jmp TIM1_CAPT ; Timer1 Capture Handler
0x0016 jmp TIM1_COMPA ; Timer1 Compare A Handler
0x0018 jmp TIM1_COMPB ; Timer1 Compare B Handler
0x001A jmp TIM1_OVF ; Timer1 Overflow Handler
0x001C jmp TIM0_COMPA ; Timer0 Compare A Handler
0x001E jmp TIM0_COMPB ; Timer0 Compare B Handler
0x0020 jmp TIM0_OVF ; Timer0 Overflow Handler
0x0022 jmp SPI_STC ; SPI Transfer Complete Handler
0x0024 jmp USART_RXC ; USART, RX Complete Handler
0x0026 jmp USART_UDRE ; USART, UDR Empty Handler
0x0028 jmp USART_TXC ; USART, TX Complete Handler
0x002A jmp ADC ; ADC Conversion Complete Handler
0x002C jmp EE_RDY ; EEPROM Ready Handler
0x002E jmp ANA_COMP ; Analog Comparator Handler
0x0030 jmp TWI ; 2-wire Serial Interface Handler
0x0032 jmp SPM_RDY ; Store Program Memory Ready Handler
;
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à. |
|