|
Esercizi Assembler Svolti Collettivamente
|
| whitedragon |
Scritto il 16/07/2010 14:48
|
Studente logorroico

Messaggi: 377
Iscritto: 16.12.07
|
Codice
;Sia data una sequenza di byte salvata in memoria,
;il cui indirizzo del primo elemento è salvato all'interno
;del registro R0, mentre il numero di byte della sequenza
;è salvato all'interno del registro R1. Si scriva il codice
;assembler di una funzione che per ogni elemento della sequenza, calcoli
;DUE bit di parità, rispettivamente posizionati in posizione
;3 e 7, in particolare il bit 3 controllerà la parità dei primi
;tre bit, mentre il bit 7 controllerà la parità complessiva di
;tutti i bit del relativo byte. I byte risultanti andranno
;sovrascritti ai precedenti.
;Per esempio avendo il byte 1011 0111 (le posizioni sono indicate da 0 a 7 dal più significativo al meno significativo)
;Verrà d'apprima controllati i primi 3 bit del byte più significativo 101 che sono pari quindi il bit in posizione
;3 sarà 0
;Il byte parziale risultante sarà 1010 0111
;Poi verrà controllata la parità sui 7 bit più significativi 1010 011 che sono pari quindi il bit in posizione 7
;sarà 0
;Il byte ritornato sarà alla fine 1010 0110, che verrà sovrascritto al posto del precedente
STACK_ADDR: word 0F00
VEC: byte 00A4 ;1010 0100 -> 1010 0101
byte 00B7 ;1011 0111 -> 1010 0110
byte 00CD ;1100 1101 -> 1100 1100
byte 00FE ;1111 1111 -> 1110 1111
DIM: byte 04
;La funzione sottostante dato un byte in R2 restituisce il byte modificato
AUX: MV R2 R3 ;Copio R2 in R3
LDBI R4 00 ;Inizializzo R4 a 0, per il bit di parità
LDBI R5 03 ;Contatore per il primo gruppo di bit
LOOP1: RSH R3 ;Shifto a destra R3
XOR R3 R4 ;Faccio lo XOR tra R3 e R4
DEC R5 ;Decremento il contatore
JMPNZ LOOP1
LDBI R5 10 ;Il bit di parità sarà in posizione, 3 (da sinistra a destra)
AND R4 R5 ;Vedo il bit di parità
LDBI R4 00EF ;Qui c'è una furbata
AND R4 R2 ;Pongo a 0, a preescindere il bit in posizione 3
OR R5 R2 ;Ne faccio l'OR con quello di parità
MV R2 R3 ;Ricopio R2, modificato, in R3
LDBI R5 07 ;Devo controllare 7 bit
LDBI R4 00 ;Il bit 7 avrà la parità
LOOP2: RSH R3 ;Shito a destra R3
XOR R3 R4 ;Xor R3 R4
DEC R5 ;Decremento il contatore
JMPNZ LOOP2
LDBI R5 01 ;Carico in R5 il bit che mi interessa da controllare
AND R4 R5 ;Lo prelevo da R4
LDBI R4 00FE ;Ripeto la furbata
AND R4 R2 ;Pongo a 0 il bit in posizione 7
OR R5 R2 ;Lo scrivo con quello di parità
RETURN_AUX: RET
FUNC: LDWI R0 VEC ;Carico in R0 l'indirizzo del vettore
LDBA R1 DIM ;Carico in R1 la dimensione del vettore
LOOP: LDBR R2 R0 ;Carico in R2 l'elemento attuale del vettore
CALL AUX ;Chiamo la funzione ausiliaria
STBR R2 R0
INC R0
DEC R1
JMPNZ LOOP
RETURN: RET
START: LDWA R15 STACK_ADDR
SPWR R15
CALL FUNC
HLT
Posto a cui far ritorno... |
| |
|
|
| whitedragon |
Scritto il 17/07/2010 14:58
|
Studente logorroico

Messaggi: 377
Iscritto: 16.12.07
|
Codice
;Scrivere il codice assembler di una funzione che dato un array di 8 byte
;restituisca un word, il byte più significativo del word da restituire
;sarà costituita dai bit nella diagonale principale, mentre il meno
;significativo dai bit nella diagonale secondaria. L'indirizzo dell'array
;è contenuto in R0 mentre il risultato va messo in R1.
STACK_ADDR: word 0F00
VEC: byte 00A2
byte 004A
byte 00F4
byte 00CD
byte 00DF
byte 00BA
byte 00CC
byte 00FF
word 0ABC
FUNC: LDWI R0 VEC ;Vettore
LDBI R2 08 ;Contatore
LDBI R3 80 ;R3 ha i bit di scansione
LDWI R1 0000 ;R1 contiene il word da ritornare
LOOP_FUNC_1: MV R3 R4 ;Copio R3 in R4
LDBR R5 R0 ;Carico in R5 il dato di VEC
AND R5 R4 ;Prendo il bit rispettivo
OR R4 R1 ;Scrivo in R1
DEC R2 ;Decremento il contatore
JMPZ JUMP1 ;Se ho finito vado a vanti
INC R0 ;Vado avanti con le celle
RSH R3 ;Shifto il bit di scansione
JMP LOOP_FUNC_1
JUMP1: OUTB R1 0000
;Per scrivere il byte nella posizione corretta faccio
;una furbata tramite la memoria, in realtà risparmio solo un istruzione
LDWI R10 0D00 ;Uso una locazione ausiliaria
STBR R1 R10 ;R1 lo posso trattare come byte visto che ho scritto il meno significativo
LDWR R1 R10 ;In questo modo ho uno shift diretto di 4 posizioni
OUTW R1 0000
LDBI R3 01
LDWI R6 0000
LDBI R2 08
LDWI R0 VEC
LOOP_FUNC_2: MV R3 R4 ;Analogo a loop_func_1
LDBR R5 R0
AND R5 R4
OR R4 R1
DEC R2
JMPZ RETURN_FUNC
LSH R3
JMP LOOP_FUNC_2
RETURN_FUNC: OUTW R1 0000
RET
START: LDWA R15 STACK_ADDR
SPWR R15
CALL FUNC
HLT
Posto a cui far ritorno... |
| |
|
|
| whitedragon |
Scritto il 18/07/2010 11:32
|
Studente logorroico

Messaggi: 377
Iscritto: 16.12.07
|
Codice
;Scrivere il codice di una funzione assembler che ordini
;un array di byte in base al numero di bit
;di cui è composto il byte. Utilizzare l'algoritmo del
;bubble sort.
STACK_ADDR: word 0F00
VEC: byte 0F
byte 0E
byte 05
byte 09
byte 06
DIM: byte 05
;Dati un elemento in R2 ritorna il numero di bit
;di quell'elemento in R3
AUX_1: LDBI R3 00 ;Contatore
LDBI R4 01 ;Bit di controllo
LDBI R5 08
LOOP_AUX_1: AND R2 R4
JMPZ JUMP1
INC R3
JUMP1: RSH R2
LDBI R4 01
DEC R5
JMPNZ LOOP_AUX_1
RETURN_AUX_1: RET
;Dati due elementi in R6 e R7 restituisce R6 e R7
;se i bit di R6 sono minori di R7, altrimenti
;restituisce R6 e R7 con i contenuti scambiati in
;caso contrario
AUX_2: MV R6 R2
CALL AUX_1 ;Conteggio i bit di R6
MV R3 R8 ;Metto questo contatore in un registro dedicato
MV R7 R2
CALL AUX_1 ;Conteggio i bit di R7
MV R3 R9 ;Li metto in un registro dedicato
SUB R8 R9
JMPN JUMP2
RET ;Se i bit di R6 sono minori di quelli di R7 non scambio
JUMP2: MV R6 R9 ;Se i bit di R6 sono maggiori di quelli di R7 scambio i contenuti dei registri
MV R7 R6
MV R9 R7
RETURN_AUX_2: RET
BSORT: LDWI R0 VEC ;è l'algoritmo del bubblesort
LDBA R1 DIM
MV R1 R1
JMPZ RETURN_BSORT
LDBR R6 R0
INC R0
DEC R1
JMPZ RETURN_BSORT
MV R1 R10
LDBR R7 R0
LOOP: CALL AUX_2
DEC R0
STBR R6 R0 ;Metto in memoria a preescindere, tanto saranno corretti
INC R0
STBR R7 R0 ;Idem sopra
INC R0
MV R7 R6
LDBR R7 R0
DEC R10
JMPNZ LOOP
LDWI R0 VEC
LDBR R6 R0
INC R0
LDBR R7 R0
DEC R1
JMPZ RETURN_BSORT
MV R1 R10
JMP LOOP
RETURN_BSORT: RET
START: LDWA R15 STACK_ADDR
SPWR R15
CALL BSORT
HLT
Posto a cui far ritorno... |
| |
|
|
| blacknight |
Scritto il 18/07/2010 13:18
|
Studente freeloader

Messaggi: 24
Iscritto: 02.07.09
|
vorrei alcune delucidazioni sull'uso di JUMPZ, o JUMPNZ..
in particolare a quale vlore si riferiscono per effettuare il salto?
come mai sia JUMP che JUMPNZ prevedono un solo parametro?
JUMP LABEL1; salta a LABEL1
JUMPNZ LABEL1; salta a label 1 se un valore non è 0, ma dove è indicato? |
| |
|
|
| blacknight |
Scritto il 18/07/2010 13:27
|
Studente freeloader

Messaggi: 24
Iscritto: 02.07.09
|
Ancora non ho finito: i miei dubbi sono anche su altri comandi non spiegati ;
gruppo trasferimento dati:
ST, suppongo store, come si usa?
IN, OUT, TSTI TSTO,HALT?
|
| |
|
|
| whitedragon |
Scritto il 18/07/2010 16:45
|
Studente logorroico

Messaggi: 377
Iscritto: 16.12.07
|
jackblack ha scritto:
vorrei alcune delucidazioni sull'uso di JUMPZ, o JUMPNZ..
in particolare a quale vlore si riferiscono per effettuare il salto?
come mai sia JUMP che JUMPNZ prevedono un solo parametro?
JUMP LABEL1; salta a LABEL1
JUMPNZ LABEL1; salta a label 1 se un valore non è 0, ma dove è indicato?
Per JMPZ e JMPNZ, (così come JMPN/JMPNN e JMPV) un operando è implicitò si tratta dei registri special purpose
in particolare quelli che contengono i flag, in realtà dovrebbe essere solo 1 il registro.
Per farla breve JMPZ, JMPV e JMPN controllano rispettivamente che il flag Z V e N siano posti a 1 per poter effettuare il salto
mentre per le negazioni controllano siano posti a 0.
Posto a cui far ritorno... |
| |
|
|
| whitedragon |
Scritto il 18/07/2010 16:49
|
Studente logorroico

Messaggi: 377
Iscritto: 16.12.07
|
jackblack ha scritto:
Ancora non ho finito: i miei dubbi sono anche su altri comandi non spiegati ;
gruppo trasferimento dati:
ST, suppongo store, come si usa?
IN, OUT, TSTI TSTO,HALT?
Supponi giusto ST sta per STORE e porta il contenuto dell'operando di sinistra verso l'indirizzo di quello a destra, che può essere contenuto in un registro o meno a seconda dell'indirizzamento.
IN preleva un byte o un word in base all'indirizzo della periferica che specifichi.
OUT il contrario lo butta a quella periferica
TSTI TSTO in pratica stanno a 1 finchè non leggono qualkosa dal buffer input/output, se prelevano qualkosa si settano a 0.
HLT blocca il programma, non c'entra nulla con RET se è questo il tuo dubbio.
Cmq non c'è molto da spiegare devi vedere come agiscono nei registri special purpose per capire come funzionano, e questo le slide lo dicono. Cioè non c'è un motivo "profondo" del loro funzionamento tutti i comandi fanno qualkosa di puramente meccanico. Se ricordi cosa fanno nello specifico è tutto già spiegato.
Modificato da whitedragon il 18/07/2010 19:28
Posto a cui far ritorno... |
| |
|
|
| ilenia |
Scritto il 21/07/2010 11:39
|
Studente freeloader

Messaggi: 8
Iscritto: 15.10.08
|
Scusate, ma cosa bisogna scrivere al prof per farsi correggere il compito?  |
| |
|
|
| gsdefender |
Scritto il 21/07/2010 13:21
|

Super Amministratore

Messaggi: 316
Iscritto: 13.10.07
|
ilenia ha scritto:
Scusate, ma cosa bisogna scrivere al prof per farsi correggere il compito? 
Qualcosa tipo
Egregio prof. Sorbello,
le confermo che intendo consegnare il mio compito e che può, quindi, procedere alla correzione.
Grazie,
--Nome Cognome
Matricola 0123456
Usa il form del portale studenti per mandare l'email altrimenti sono guai
--Emanuele Cipolla
GNU/Linux User #283193
http://emanuelecipolla.net/
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/CM/H/IT/L/MU/O d- s-:+ a-- C++++ UBL++++ P+ L+++ E- W+++ N++ !o !K w--- O-- !M V- PS+ PE-- Y++ PGP++ t+++ !5 X R- tv+ b++++ DI+ D++ G++ e h! !r !y
-----END GEEK CODE BLOCK----- |
| |
|
|
| ilenia |
Scritto il 29/07/2010 04:28
|
Studente freeloader

Messaggi: 8
Iscritto: 15.10.08
|
Ma quanto ci mette a correggere i compiti? |
| |
|
|
| whitedragon |
Scritto il 29/07/2010 09:48
|
Studente logorroico

Messaggi: 377
Iscritto: 16.12.07
|
nn vorrei deluderti...ma li ha già corretti e ha fatto la registrazione xD, giorno 27.
Modificato da whitedragon il 29/07/2010 09:48
Posto a cui far ritorno... |
| |
|
|
| ilenia |
Scritto il 29/07/2010 10:27
|
Studente freeloader

Messaggi: 8
Iscritto: 15.10.08
|
whitedragon ha scritto:
nn vorrei deluderti...ma li ha già corretti e ha fatto la registrazione xD, giorno 27.
Ma un avviso su internet???? |
| |
|
|
| blacknight |
Scritto il 03/08/2010 13:07
|
Studente freeloader

Messaggi: 24
Iscritto: 02.07.09
|
Qualcuno, se ci dovesse essere qualche anima pia ancora non in vacanza, mi saprebbe spiegare PUSH e POP CALL e RET con qualche semplice applicazione pratica?MV Copia tra registri o sposta il contenuto da un registro ad un altro? grazie mille |
| |
|