Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Valore inaspettato sulla STACK simulando un avr

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Valore inaspettato sulla STACK simulando un avr

Messaggioda Foto UtenteIlGuru » 9 mag 2020, 21:04

Stavo giocherellando con simavr ed avr-gdb per emulare un Atmega328p.
Ho compilato questo listato banalissimo:
Codice: Seleziona tutto
#include <avr/io.h>
int main(void){
  return 0;
}

Ho compilato con -S per avere l'assembler in cui inserire un break all'entrata nel main
Codice: Seleziona tutto
        .file   "main.c"
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__SREG__ = 0x3f
__tmp_reg__ = 0
__zero_reg__ = 1
        .text
.global main
        .type   main, @function
main:
        push r28
        push r29
        in r28,__SP_L__
        in r29,__SP_H__
/* prologue: function */
/* frame size = 0 */
/* stack size = 2 */
.L__stack_usage = 2
        break
        ldi r24,0
        ldi r25,0
/* epilogue start */
        pop r29
        pop r28
        ret
        .size   main, .-main
        .ident  "GCC: (GNU) 4.9.2"

E compilato il file .elf da questo file .s
Avviato il simulatore, collegato avr-gdb, mi trovo sul vettore di RESET
Codice: Seleziona tutto
(gdb) disassemble
Dump of assembler code for function __vectors:
=> 0x00000000 <+0>:     jmp     0x68    ;  0x68 <__trampolines_start>

Lo stack pointer punta alla fine della SRAM della mcu
Codice: Seleziona tutto
(gdb) print $SP
$3 = (void *) 0x8008ff

Eseguo il programma che da qui entra nella __trampolines_start che poi esegue la call alla funzione main. Qui mi aspetto che la call carichi sulla STACK l'indirizzo di ritorno
Codice: Seleziona tutto
(gdb) continue
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x00000088 in main ()

Disassemblando vedo che sono proprio sulla break
Codice: Seleziona tutto
(gdb) disassemble
Dump of assembler code for function main:
   0x00000080 <+0>:     push    r28
   0x00000082 <+2>:     push    r29
   0x00000084 <+4>:     in      r28, 0x3d       ; 61
   0x00000086 <+6>:     in      r29, 0x3e       ; 62
=> 0x00000088 <+8>:     break
   0x0000008a <+10>:    ldi     r24, 0x00       ; 0
   0x0000008c <+12>:    ldi     r25, 0x00       ; 0
   0x0000008e <+14>:    pop     r29
   0x00000090 <+16>:    pop     r28
   0x00000092 <+18>:    ret
End of assembler dump.

Ora se guardo il valore che c'è nell'indirizzo puntato da SP prima di entrare nel main trovo un valore che non mi torna.
Codice: Seleziona tutto
(gdb) x/xb 0x8008ff
0x8008ff:       0x3c

Lo SP in questo punto vale
Codice: Seleziona tutto
(gdb) print $SP
$4 = (void *) 0x8008fb

E se guardo il contenuto degli altri indirizzi i valori mi tornano, 0x8008fd e 0x8008fc contengono i valori di r29 ed r28 ( l' Y register ) inseriti con le due push
Codice: Seleziona tutto
(gdb) x/xb 0x8008ff
0x8008ff:       0x3c
(gdb) x/xb 0x8008fe
0x8008fe:       0x00
(gdb) x/xb 0x8008fd
0x8008fd:       0xff
(gdb) x/xb 0x8008fc
0x8008fc:       0x08
(gdb) x/xb 0x8008fb
0x8008fb:       0x00

Se disassemblo l'elf il listato che vedo, riguardo la __trampolines_start
Codice: Seleziona tutto
  68:   11 24           eor     r1, r1
  6a:   1f be           out     0x3f, r1        ; 63
  6c:   cf ef           ldi     r28, 0xFF       ; 255
  6e:   d8 e0           ldi     r29, 0x08       ; 8
  70:   de bf           out     0x3e, r29       ; 62
  72:   cd bf           out     0x3d, r28       ; 61
  74:   0e 94 40 00     call    0x80    ;  0x80
  78:   0c 94 4a 00     jmp     0x94    ;  0x94

Io mi aspettavo di trovare 0x78 non 0x3c nel primo indirizzo della STACK

Dov'è che sbaglio?
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
4.434 1 10 13
Master
Master
 
Messaggi: 1530
Iscritto il: 31 lug 2015, 23:32

1
voti

[2] Re: Valore inaspettato sulla STACK simulando un avr

Messaggioda Foto Utentexyz » 9 mag 2020, 22:30

IlGuru ha scritto:....
Io mi aspettavo di trovare 0x78 non 0x3c nel primo indirizzo della STACK

Dov'è che sbaglio?


Non hai letto il data sheet, il set di istruzioni sono codificati come multipli di 16 bit quindi il program counter conta per 16 bit non per 8 bit, se leggi 0x3C punta in realtà a 2*0x3C = 0x78
Avatar utente
Foto Utentexyz
6.170 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1639
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[3] Re: Valore inaspettato sulla STACK simulando un avr

Messaggioda Foto UtenteIlGuru » 9 mag 2020, 23:27

Grazie Foto Utentexyz! Effettivamente sono stato poco attento.
\Gamma\nu\tilde{\omega}\theta\i\ \sigma\epsilon\alpha\upsilon\tau\acute{o}\nu
Avatar utente
Foto UtenteIlGuru
4.434 1 10 13
Master
Master
 
Messaggi: 1530
Iscritto il: 31 lug 2015, 23:32


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti