View Full Version : Assembler
Ciao,
qualcuno è pratico di assembler e micro ??
Ciao,
qualcuno è pratico di assembler e micro ??
Beh ... io. Poi dipende quale assembler/micro. ;)
In particolare Motorola 68HC11, ma credo che una conoscenza generale dei micro e dell'assembler sia sufficiente :
- devo comandare un multiplexer utilizzando 3 bits di un PORT in uscita (PORTB), in particolare PB3,PB4 e PB5 (allo scopo di selezionare 1 di 8 sonar che monta un robot)
- come scrivo il ciclo che fa girare da 0 a 7 la variabile rappresentata dai 3 bit senza intaccare gli altri bits del PORTB ?? :confused: :mbe:
PORTB
sonar1 : xx000xxx
sonar2 : xx001xxx
....
....
sonar8 : xx111xxx
In particolare Motorola 68HC11, ma credo che una conoscenza generale dei micro e dell'assembler sia sufficiente :
- devo comandare un multiplexer utilizzando 3 bits di un PORT in uscita (PORTB), in particolare PB3,PB4 e PB5 (allo scopo di selezionare 1 di 8 sonar che monta un robot)
- come scrivo il ciclo che fa girare da 0 a 7 la variabile rappresentata dai 3 bit senza intaccare gli altri bits del PORTB ?? :confused: :mbe:
PORTB
sonar1 : xx000xxx
sonar2 : xx001xxx
....
....
sonar8 : xx111xxx
Ah ... il 68HC11 ... che bell'oggettino! :) :) Ci avevo fatto qualcosa durante un corso di specializzazione. Naturalmente molto tempo fa e quindi non mi ricordo molto (e il manuale dell'HC11 ce l'ho a casa, quindi non saprei darti del codice adesso).
Io comunque farei così: userei una variabile in cui tengo i 3 bit da impostare. Inizialmente la metterei a 00000000 e poi nel loop gli sommerei ogni volta 00001000. Sulla variabile su cui non devi toccare gli altri bit farei ogni volta un AND con 11000111 in modo da azzerare i tuoi 3 bit e poi un OR con la variabile che ho detto prima.
Spero di essere stato chiaro.
Mmm...sì abbastanza chiaro direi,
provo a buttar giù il codice e poi ti faccio sapere,
in caso potresti riuscire a dirmi se è giusto o meno...
Debuggare 'sti programmi è un casino !!
Dove trovo una bella guida per imparare a programmare in assembler ??
Il manuale del 68HC11 è bello dettagliato, ma alcune cose non si capiscono tanto bene...
Mmm...sì abbastanza chiaro direi,
provo a buttar giù il codice e poi ti faccio sapere,
in caso potresti riuscire a dirmi se è giusto o meno...
Debuggare 'sti programmi è un casino !!
Certo, volentieri, così riprendo in mano il buon "vecchio" manuale del HC11 (spudoratamente fotocopiato da quello del prof. del corso) ;)
Dove trovo una bella guida per imparare a programmare in assembler ??
Il manuale del 68HC11 è bello dettagliato, ma alcune cose non si capiscono tanto bene...
Il manuale ufficiale è molto ben fatto, mi sembra strano che ci sia qualcosa che non si capisce bene (che cosa non ti è chiaro?).
Probabilmente non sono nozioni che mi può dare il manuale,
forse dovrei andarmi a ripassare il corso di Calcolatori Elettronici ?? ;)
Posso includere file come si fa in altri linguaggi ??
Le routine possono essere richiamate da qualsiasi punto del programma o solo da punti successivi/precedenti alla loro dichiarazione/scrittura ??
RTS mi porta alla routine precedente che ha chiamato quella in cui mi trovo ??
Mi fai un esempio calzante di uso di bset e bclr tramite maschera ??
X ora credo che possa bastare ;)
Ciao, sto facendo in questo momento un ... tuffo nel passato (back to the past :cool: ). Ho appena ripreso in mano il mio "vecchio" manuale del 68HC11 ed ho anche ritrovato un vecchio floppy (ancora leggibile, wow!) su cui ci sono i tools software che avevo usato tempo addietro. Il cross assembler che usavo era il Motorola AS11.
Posso includere file come si fa in altri linguaggi ??
Il fatto di poter includere un altro file non dipende tanto dal microprocessore o dall'assembly in sé ma dal software "cross assembler" che si usa. Ho appena rivisto adesso che il AS11, ad esempio, non supportava questa funzionalità. Molto spesso in progetti medio/piccoli si faceva (e penso si faccia ancora oggi) tutto in un solo sorgente.
Probabilmente soltanto i cross assembler più evoluti supportano le direttive ad esempio per le macro o per le inclusioni di file.
Le routine possono essere richiamate da qualsiasi punto del programma o solo da punti successivi/precedenti alla loro dichiarazione/scrittura ??
Certamente! L'assembly è un linguaggio di basso livello e oltretutto non "strutturato", dove ci possono essere molti salti in avanti e all'indietro nel codice.
Molti cross assembler (come il AS11) vengono definiti "2-pass assembler" proprio perché elaborano il sorgente 2 volte. Nella prima passata stabiliscono e creano la tabella dei simboli e nella seconda passata generano il codice. Questo vuol dire che quando generano il codice sanno già se il target di un salto è in avanti o all'indietro.
RTS mi porta alla routine precedente che ha chiamato quella in cui mi trovo ??
Sì, proprio così. RTS sta per "Return from Subroutine" e serve per ritornare alla istruzione successiva alla chiamata di una BSR (Branch to Subroutine) oppure di una JSR (Jump to Subroutine).
Mi fai un esempio calzante di uso di bset e bclr tramite maschera ??
Le istruzioni BSET e BCLR sono delle istruzioni specifiche per settare/resettare un certo numero di bit all'interno di un operando. Tu forse vuoi sapere come fare un set/reset dei bit senza usare queste istruzioni?
In effetti BSET fa una semplice OR mentre BCLR fa una semplice AND. Le due istruzioni sono state inserite semplicemente perché le istruzioni AND/ORA hanno come limite il fatto di avere come operando di destinazione solamente i registri A e B.
In pratica:
BCLR VAR #$03 ; reset dei bit 1 e 0
dovrebbe essere uguale a:
LDAA VAR
ANDA #$FC
STAA VAR
Mentre:
BSET VAR #$03 ; set dei bit 1 e 0
dovrebbe essere uguale a:
LDAA VAR
ORAA #$03
STAA VAR
Spero di aver scritto giusto e spero che sia quello che chiedevi.
Sì, proprio così. RTS sta per "Return from Subroutine" e serve per ritornare alla istruzione successiva alla chiamata di una BSR (Branch to Subroutine) oppure di una JSR (Jump to Subroutine).
Uhm...quindi con BEQ, BNE & c. non funge ?!
Spero di aver scritto giusto e spero che sia quello che chiedevi.
Sì, ora testo un po' comunque mi sei stato molto utile e magari ti sfrutto un po' ;)
Anzi...a proposito di test...se io voglio capire se il mio programma funge come posso monitorare le porte
ovvero sapere se i famosi PB3,PB4 e PB5 che devo settare io fanno quello che devono ??
Presumo che PCBUG11 mi fornisca qualche info...ma difficilmente interpretabile !! :mbe:
Non dirmi che devo attaccarmi all'oscilloscopio :doh: ;)
Intanto GRAZIE !!
Uhm...quindi con BEQ, BNE & c. non funge ?!
No, infatti. Tutti gli altri tipi di salti (condizionati o incondizionati, relativi o assoluti che siano) come BRA, BVC, BGT, JMP, BRSET, ecc... fanno solo un salto e basta. Non salvano l'instruction pointer sullo stack.
Anzi...a proposito di test...se io voglio capire se il mio programma funge come posso monitorare le porte ovvero sapere se i famosi PB3,PB4 e PB5 che devo settare io fanno quello che devono ??
Presumo che PCBUG11 mi fornisca qualche info...ma difficilmente interpretabile !! :mbe:
Non dirmi che devo attaccarmi all'oscilloscopio :doh: ;)
L'oscilloscopio è sicuramente il metodo più giusto per vedere cosa succede realmente "sul campo". Se invece stai simulando il programma, il software di simulazione, se non è proprio sgalfo, dovrebbe almeno metterti a disposizione una o più finestre dove si può vedere lo stato dei registri, delle porte, ecc...
Uhm...come creo quindi l'istruzione di confronto per verificare se il ciclo è concluso ??
Ho la variabile multisonar che uso come maschera x azzerare i bits del PORTB che mi servono,
la incremento di 4 ad ogni ciclo facendo una cosa di questo tipo (suppongo) :
LDA multisonar
ADDA #$4
STA multisonar
poi una volta che raggiunge il valore 00111000 devo riazzerarla...
Come lo verifico ??
Sgalfo ?? :D
Il comando rmb non è contenuto nel manuale del 68HC11 e lo uso x definire la variabile dopo aver visto qualche altro esempio,
ma come si fa a conoscerne il significato e la sintassi esatta ??
Mi servirebbe davvero una bella guida !! :rolleyes: :cool:
Giusto per saperlo, quale cross assembler stai usando?
Uhm...come creo quindi l'istruzione di confronto per verificare se il ciclo è concluso ??
Ho la variabile multisonar che uso come maschera x azzerare i bits del PORTB che mi servono,
la incremento di 4 ad ogni ciclo facendo una cosa di questo tipo (suppongo) :
LDA multisonar
ADDA #$4
STA multisonar
poi una volta che raggiunge il valore 00111000 devo riazzerarla...
Come lo verifico ??
L'istruzione CMPA serve per comparare il contenuto del registro A con qualcosa (un valore immediato, una variabile, ecc...). In base allo stato dei flag modificati dalla CMPA, usi una istruzione di salto condizionale per andare dove vuoi.
Sgalfo ?? :D
Sinonimo di ciofeca ... :D
Non posso dire (non lo conosco) se il PCBUG11 è una ciofeca o meno. ;)
Il comando rmb non è contenuto nel manuale del 68HC11 e lo uso x definire la variabile dopo aver visto qualche altro esempio,
ma come si fa a conoscerne il significato e la sintassi esatta ??
Mi servirebbe davvero una bella guida !! :rolleyes: :cool:
rmb infatti è uno pseudo-opcode implementato dal cross assembler AS11.
La Motorola ha dato la gestione dei suoi semiconduttori alla freescale (www.freescale.com (http://www.freescale.com)). Se vai sul sito, nella sezione "Documentation", ci trovi la documentazione del 68HC11 e del PCBUG11.
Inoltre forse troverai utile la pagina "An ASM11 Primer (http://www.seattlerobotics.org/encoder/apr97/asm11.html)", una introduzione al AS11, dove parla anche del rmb.
Uhm...
...ho trovato infatti sul manuale CMPA ed ho provato a fare una cosa del genere :
multisonar rmb 1
multiplex BSET PORTB,multisonar
JSR sonarloop ; routine che legge il singolo sonar
LDA multisonar
ADDA #$4
STA multisonar
CMPA %00111000 ; verifico condizione ultimo sonar
BNE multiplex ;se non è finito
BCLR PORTB,multisonar ;azzero PB3,4,5
RTS
Che ne dici ??
Ora dò un'occhiata al tuo link, grazie !!
-------> RMB :
The memory is reserved but is not initialized.
Ciò significa che dopo che definisco la variabile tramite
multisonar rmb 1
sarebbe meglio inizializzarla, tipo così :
bclr multisonar, %11111111
Che software mi consiglieresti di usare per fare il debug e "gestire" il micro ??
Uhm...
...ho trovato infatti sul manuale CMPA ed ho provato a fare una cosa del genere :
multisonar rmb 1
multiplex BSET PORTB,multisonar
JSR sonarloop ; routine che legge il singolo sonar
LDA multisonar
ADDA #$4
STA multisonar
CMPA %00111000 ; verifico condizione ultimo sonar
BNE multiplex ;se non è finito
BCLR PORTB,multisonar ;azzero PB3,4,5
RTS
Che ne dici ??
Ci sono alcune cose che secondo me non vanno bene. Intanto usi troppe BSET/BCLR. Se sulla porta B devi settare ad esempio xx101xxx non basta settare i bit a 1 di multisonar!
Poi fai la comparazione con 00111000 e se è uguale esci dal loop. Certo, ma così nel loop non ci passerà mai con multisonar a 00111000. Cioè ti perdi "un giro" del loop.
The memory is reserved but is not initialized.
Ciò significa che dopo che definisco la variabile tramite
multisonar rmb 1
sarebbe meglio inizializzarla, tipo così :
bclr multisonar, %11111111
Sì, esatto.
Che software mi consiglieresti di usare per fare il debug e "gestire" il micro ??
Questo non te lo so dire. È una vita che non programmo più "attivamente" sui micro.
Ci sono alcune cose che secondo me non vanno bene. Intanto usi troppe BSET/BCLR. Se sulla porta B devi settare ad esempio xx101xxx non basta settare i bit a 1 di multisonar!
Troppe ?? In che senso ??
E' vero, dovrei anche resettare a zero gli altri, conviene allora fare un BCLR di quei 3 bit e poi scriverci sopra multisonar ??
Poi fai la comparazione con 00111000 e se è uguale esci dal loop. Certo, ma così nel loop non ci passerà mai con multisonar a 00111000. Cioè ti perdi "un giro" del loop.
Uhm...allora faccio così :
invece di confrontare multisonar con 00111000 la confronto con 01000000 :cool: ;)
Troppe ?? In che senso ??
E' vero, dovrei anche resettare a zero gli altri, conviene allora fare un BCLR di quei 3 bit e poi scriverci sopra multisonar ??No, è che io l'avrei fatto diversamente. Comunque sì, puoi azzerare i 3 bit con la BCLR e settargli i bit a 1 di multisonar.
Uhm...allora faccio così :
invece di confrontare multisonar con 00111000 la confronto con 01000000 :cool: ;)Infatti.
Grazie !!
Comunque se hai consigli per migliorare la performance del software son ben accetti visto che il robot ha già il collo tirato ed io con l'assembler sono alle prime armi !! :mc:
Torno all'attacco con dei problemi nel debugging,
potete darmi una mano please ??
Non riesco a capire che errori mi riporti l'assembler, anche perchè nel manuale non riporta il codice di questi errori :
nel manuale gli errori son del tipo "error Axxxx", mentre nel file .lst che l'assemblatore crea mi ritrovo "error xxx",
in particolare "error 235" e "error 250" :confused: :confused:
Grazie
nel manuale gli errori son del tipo "error Axxxx", mentre nel file .lst che l'assemblatore crea mi ritrovo "error xxx",
in particolare "error 235" e "error 250" :confused: :confused:
Ciao, ho appena visto adesso che nel documento M68PCBUG11.pdf c'è una pagina con una tabella "ASM Error Message Codes" in cui vengono elencati gli errori:
235 Symbol: undefined symbol
250 Data: displacement too large (normally branch)
Non so se possono esserti utili. Ciao.
PCBUG11 ?? :muro: :muro:
Grazie...ma perchè non son andato a vederlo io ?? :muro:
Adesso vedo di capire il motivo di questo "undefined symbol" !!
250 : displacement too large :cry:
Urc...questo mi sa che è un problema un po' grosso :mbe:
250 : displacement too large :cry:
Urc...questo mi sa che è un problema un po' grosso :mbe:
Beh, se questo errore è dovuto ad un branch relativo il cui target è troppo lontano e quindi non raggiungibile, si risolve abbastanza facilmente.
Uhm...in che modo ??
Dovrei "avvicinare" la destinazione del salto od utilizzare un tipo di salto che permetta distanze maggiori ??
Uhm...in che modo ??
Dovrei "avvicinare" la destinazione del salto od utilizzare un tipo di salto che permetta distanze maggiori ??
Avvicinare il target del salto sarebbe l'ottimale ma non sempre è possibile. Basta quindi "invertire" il salto. Esempio:
...
BEQ pippo ; salta se uguale
...
Se pippo è troppo lontano, trasformi il codice in:
...
BNE next ; salta se diverso
JMP pippo ; salto assoluto
next:
...
Uhm, ti riporto il problema così vediamo subito se ho capito,
l'istruzione che crea l'errore è questa :
CPD $0028
BEQ son_to *** qui si genera il salto troppo lungo alla label son_to
SUBD $0026
Allora dovrei fare una cosa del tipo
CPD $0028
BNE next1
JMP son_to
next1 SUBD $0026
Creando una label per l'istruzione SUBD ??
CPD $0028
BNE next1
JMP son_to
next1 SUBD $0026
Sì, esatto. Certo ... perdi qualche ciclo macchina in più ma se non riesci ad avvicinare il target del branch e visto che il HC11 non permette salti condizionali più lunghi di +127/-128, non vedo altra soluzione.
Uhm...stavo già provando a farlo ma ho comunque un errore (260 e 238) sulla riga
next : :mc:
Uhm...stavo già provando a farlo ma ho comunque un errore (260 e 238) sulla riga
next : :mc:
Prova a mettere il ':' attaccato alla label o a toglierlo.
Dal manuale del AS11:
Label: A symbol starting in the first column is a label and may optionally be ended with a ':'. A label may appear on a line by itself and is then interpreted as:
Label EQU *
rasega: dovresti limitare un po' le dimensioni della firma: http://www.hwupgrade.it/forum/regolamento.php
Chiedo scusa,
provvedo :cry: ;)
Prova a mettere il ':' attaccato alla label o a toglierlo.
Dal manuale del AS11:
Label: A symbol starting in the first column is a label and may optionally be ended with a ':'. A label may appear on a line by itself and is then interpreted as:
Label EQU *
Uhm...ho fatto qualche prova, ma l'errore rimane, anche perchè altre label erano già state definite allo stesso modo e non segnalano alcun errore :mbe:
Uhm...ho fatto qualche prova, ma l'errore rimane, anche perchè altre label erano già state definite allo stesso modo e non segnalano alcun errore :mbe:
Posta magari il pezzetto di codice che dà l'errore.
:eek: :eek: :eek: URC :muro: :muro: :muro:
Ho trovato il problema, il dubbio me l'hai fatto venire proprio tu con l'esempio
Label EQU *
Le label finora le avevo definite semplicemente così
Label : ma il mio compilatore non le prende,
definendole tutte come sopra ora non ci son + problemi :doh:
...per ora :rolleyes: ;)
GRAZZZIEEEEEEEEEEEEEEEEEEEEEE !!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.