flz, purtroppo devo darti una cattiva notizia....
il disassemblaggio di un file.HEX intanto è la peggiore strada da percorrere quando si vuole capire come è stata realizzata una funzione o una istruzione.
in molti casi il reverse engineering non porta a nulla anzi ti offusca le idee.
l'istruzione "Print" utilizza dei registri della uart in particolare il "Control and Status Register A - UCSRA" e l' "Uart data register - UDR"
- dove sono nel codice che hai disassemblato?
- dove si trova inoltre la costante "CIAO" ?
come vedi il disassemblatore che hai utilizzato non capisce la struttura del codice sorgente e quindi interpreta coppe x mazze.
non solo, traduce anche "CIAO" in istruzioni sballando tutto il codice assembly a partire proprio da li.
mi dispiace dirlo, ma secondo me tutto questo è il frutto di -------------- arduino !!!
programmare usando linguaggi ad alto livello, senza sapere cosa succede a livello registri cpu porta proprio a questo:
difficoltà nella interpretazione e ottimizzazione di un codice a basso livello.
per darvi un'idea, vi mostro quale dovrebbe essere il codice in assembly della istruzione "print":
- Code: Select all
;codice assembly della istruzione "Print"
;autore: Giovanni De Luca
;
.include "C:\AVRASM\inc\m8def.inc"
;
.DSEG
.CSEG
.ORG 0
,----qui inizializziamo la ram e il baud rate della uart con i reg UBRR
_Reset:
ldi yl,Low(RAMEND)
out SPL,yl
ldi yh,high(RAMEND)
out SPL+1,yh
sbiw yl,32
ldi zl,0x18
out UCSRB,zl
ldi zh,high(51)
ldi zl,Low(51)
out UBRRL,zl
out UBRRH,zh
;-------Print "CIAO"--
ldi zl,Low(S000*2)
ldi zh,high(S000*2)
call _PSc
call _PCL
; ------String constants:
S000: .db "CIAO", 0
;------- Print String constants
_PSc: lpm
tst r0
breq _PSc1
mov r24,r0
rcall _Pch
adiw zl,1
rjmp _PSc
_Psc1: ret
;------ Print Cr, Lf & char
_PCL: ldi r24,0x0d
rcall _Pch
ldi r24,0x0a
_Pch: sbis UCSRA,5
rjmp _Pch
out UDR,r24
ret
di seguito il codice per "INPUT" di una stringa
- Code: Select all
;
.include "C:\AVRASM\inc\m8def.inc"
;
.DSEG
a: .Byte 21
.CSEG
.ORG 0
_Reset:
ldi yl,Low(RAMEND)
out SPL,yl
ldi yh,high(RAMEND)
out SPL+1,yh
sbiw yl,32
ldi zl,0x18
out UCSRB,zl
ldi zh,high(51)
ldi zl,Low(51)
out UBRRL,zl
out UBRRH,zh
;-------Input a
ldi r25,20
ldi xl,Low(a)
ldi xh,high(a)
call _InSt9
;-------GetChar
_GetCh: sbis UCSRA,0x07
rjmp _GetCh
in zl,UDR
ret
;------ Input
_Input: ldi xl,Low(RAMEND - 32)
ldi xh,high(RAMEND - 32)
ldi r25,0x06
_InSt9: rcall _GetCh
cpi zl,0x0a
breq _InEnd
cpi zl,0x0d
breq _InSt9
cpi zl,0x08
breq _InBck
tst r25
breq _InSt9
st X+,zl
dec r25
rjmp _InSt9
_InEnd: clr zl
st X,zl
ret
_InBck: inc r25
sbiw xl,0x01
rjmp _InSt9
ciao