09 Settembre 2010 16:17:24
Frase del giorno
Benvenuto/a

Questo è Massimo 30, un sito che fornisce servizi di community a tutti gli studenti universitari, di qualunque facoltà e di qualsivoglia università, che ne facciano richiesta.

La visualizzazione delle notizie e dei forum, nonchè l'iscrizione ai servizi di aggregazione delle news è libera: per poter accedere all'archivio dei file, partecipare direttamente alla vita della comunità – e, più in generale, per fruire appieno dei nostri contenuti è richiesto l'accesso.

Sentitevi liberi di contribuire nella misura che il vostro tempo e il vostro animo vi permettono. Vi consigliamo di leggere le FAQ per conoscere alcune consuetudini di questa community, e per richiamare alla mente alcuni principi di sana convivenza che spesso dimentichiamo.

Non abbiate timore di porre le vostre domande: se sono significative, formulate con garbo, precisione e rispetto, meritano tutte una risposta. È importante, infatti, ricordare che

Tutti sono ignoranti. Solo, su materie diverse.

Saluti,

Gli "ultimi smanettoni" del DINFO

Vedi Discussione
Massimo 30 :: Corso di Laurea in Ingegneria Informatica (sede di Palermo) :: Architetture dei Calcolatori
 Stampa Discussione
Esercizi Assembler Svolti Collettivamente
whitedragon
#61 Stampa Messaggio
Scritto il 16/07/2010 14:48
Studente logorroico


Messaggi: 377
Iscritto: 16.12.07

Scarica sorgente  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
#62 Stampa Messaggio
Scritto il 17/07/2010 14:58
Studente logorroico


Messaggi: 377
Iscritto: 16.12.07

Scarica sorgente  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
#63 Stampa Messaggio
Scritto il 18/07/2010 11:32
Studente logorroico


Messaggi: 377
Iscritto: 16.12.07

Scarica sorgente  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
#64 Stampa Messaggio
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
#65 Stampa Messaggio
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
#66 Stampa Messaggio
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
#67 Stampa Messaggio
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
#68 Stampa Messaggio
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? Shock
 
gsdefender
#69 Stampa Messaggio
Scritto il 21/07/2010 13:21
Avatar Utente

Super Amministratore


Messaggi: 316
Iscritto: 13.10.07

ilenia ha scritto:
Scusate, ma cosa bisogna scrivere al prof per farsi correggere il compito? Shock


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-----
 
http://emanuelecipolla.net/
ilenia
#70 Stampa Messaggio
Scritto il 29/07/2010 04:28
Studente freeloader


Messaggi: 8
Iscritto: 15.10.08

Ma quanto ci mette a correggere i compiti?
 
whitedragon
#71 Stampa Messaggio
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
#72 Stampa Messaggio
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
#73 Stampa Messaggio
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
 
Vai al Forum:
Cerca
   
Supportateci

Massimo 30 continua ad essere disponibile al pubblico anche grazie al contributo economico dei donatori. Se desiderate essere fra loro, ed avete una carta di credito, effettuate una donazione tramite PayPal.

Non vogliamo arricchirci con i vostri soldi, basta che teniate presente che, se ognuno dei 500+ utenti di questa community donasse 10 centesimi di Euro, avremmo immediatamente un budget sufficiente a sostenere le nostre spese annuali. Il problema è che quasi nessuno effettua donazioni, perciò affrettatevi :-D.

Feed e posta elettronica

I feed e la posta elettronica sono i mezzi più utilizzati per ricevere gli aggiornamenti di un sito senza che sia necessario visitarlo di continuo.

Di seguito una lista dei servizi da noi offerti:

Community

Feed E-mail Notizie
Feed E-mail Forum
Feed E-mail Download
Feed E-mail Wiki

Accademici

Università di Palermo

Feed E-mail News Segreteria

Facoltà di Ingegneria

Feed E-mail News Ingegneria
Feed E-mail News Ingegneria Informatica (PA)
Feed E-mail News Ingegneria Informatica (AG)
Feed E-mail News Ingegneria Informatica per i sistemi intelligenti
Feed E-mail Esami Ingegneria Informatica (PA)


Facoltà di Lettere e Filosofia

Feed E-mail Notizie in evidenza
Facebook
Facebook Badge

Se trovate complicato ricevere gli aggiornamenti tramite feed e/o la posta elettronica, potete provare a seguirci tramite la nostra pagina su Facebook.

Tenete conto che il servizio è altamente sperimentale (non sappiamo ancora cosa pubblicare esattamente, date le restrizioni dello strumento).

Login
Utente

Password



Non ti sei ancora registrato?
Clicca qui per registrarti.

Non ricordi più la password?
Richiedine una nuova qui.
Utenti Online
· Ospiti Online: 2

· Iscritti Online: 0

· Totale iscritti: 784
· Il nuovo iscritto: sd5
Tempo rendering: 0,53 secondi 274.617 visite uniche