Sie sind auf Seite 1von 236

La CPU Intel 8086:

Architettura
e Programmazione Assembly

Alberto BROGGI
Dipartimento di Ingegneria dell’Informazione
Università di Parma
La CPU Intel 8086:
Architettura
e Programmazione Assembly

Alberto BROGGI
Dipartimento di Ingegneria dell’Informazione
Università di Parma
Seconda edizione
Per eventuali aggiunte e/o correzioni:
 
  "!#!#!$
% &%'(" %)& *"
oppure 
Prefazione alla prima edizione

Questo volume raccoglie le trasparenze proposte durante le lezioni


di Assembly nell’ambito del corso di Calcolatori Elettronici tenuto
presso la Facoltà di Ingegneria dell’Università degli Studi di Parma.

In esso è affrontato lo studio del processore 8086 da un punto


di vista funzionale con un breve cenno all’architettura hardware.
Particolare enfasi è stata posta nella descrizione di ogni istruzione
macchina, corredando ogni argomento con esempi.

La seconda parte di questo testo contiene una sostanziosa colle-


zione di gran parte delle Prove Scritte d’Esame assegnate dal 1989
ad oggi.

Spero che questo volume possa essere un valido aiuto a quanti


si avvicinano per la prima volta a questa disciplina, un buon riferi-
mento per i più esperti, o che possa almeno occupare un posto nella
biblioteca personale di ogni futuro Ingegnere.

Parma, Novembre 1992


Alberto Broggi
Sommario

I LINGUAGGI ASSEMBLY 2
Caratteristiche dei Linguaggi Assembly 3
Statements 4
Istruzioni 5
Pseudo-Istruzioni 9
Macro 10
Commenti 11
Vantaggi dei Programmi Assembly 12

ARCHITETTURA LOGICA DELLA CPU 8086 16


La CPU INTEL 8086 17
Gestione della Memoria 18
Registri e Flags 20
Composizione Manuale di Istruzioni Macchina 27

IL LINGUAGGIO ASSEMBLY 8086 29


Elementi di Base del Linguaggio 30
Istruzioni 35
Modi di Indirizzamento 70
Tempo di Esecuzione delle Istruzioni 87
Pseudo-Istruzioni 89
LE FUNZIONI MS-DOS 90
Accesso alle Funzioni DOS e BIOS 92
Accesso diretto alla memoria video 93

LA FAMIGLIA DI PROCESSORI 80X86 94


Il processore 8008 95
Il processore 8080 96
Il processore 8085 97
Il processore 8086 98
Il processore 8088 99
Il processore 80286 100
Il processore 80386 101
Il processore 80486 102
Il processore Pentium 103
La tecnologia MMX 104
Modalita‘ reale e protetta 105

CREAZIONE DI UN PROGRAMMA ASSEMBLY 106


Suddivisione in moduli differenti 107
L’Assemblatore 108
Il Linker 109
Il Debugger 110
Struttura e Documentazione di un Programma Assembly 111

APPENDICI 114
A: Programma di Esempio 114
B: Esempio di Documentazione dell’Istruzione AND 120
C: Instruction Set della CPU 8086 121
D: Funzioni DOS (INT 21h) 124
E: Funzioni BIOS 127
F: Pseudo Istruzioni del MACRO ASSEMBLER 128
G: Tracce per la Risoluzione di Alcune Prove Scritte 132
La CPU Intel 8086: Architettura e Programmazione Assembly 1

La CPU Intel 8086:


Architettura
e Programmazione Assembly

+
I Linguaggi Assembly
+
Architettura logica della CPU Intel 8086
+
Il linguaggio Assembly 8086
+
Le funzioni MS-DOS
+
La famiglia di processori 80X86
+
Procedura di creazione di un programma Assembly
2 A.Broggi

I LINGUAGGI ASSEMBLY

+
Caratteristiche dei Linguaggi Assembly
+
Statements
+
Istruzioni
+
Pseudo-Istruzioni
+
Macro
+
Commenti
+
Vantaggi dei Programmi Assembly
La CPU Intel 8086: Architettura e Programmazione Assembly 3

Caratteristiche dei Linguaggi Assembly

+
Sono linguaggi di basso livello
+
Vi è corrispondenza uno a uno con le istruzioni del linguaggio
macchina
+
I simboli mnemonici utilizzati sono associati a
– istruzioni
– sequenze di istruzioni
– indirizzi di memoria
– aree di memoria
– dispositivi di I/O
+
Possibilità di utilizzare al meglio la macchina hardware
+
La stesura di un programma Assembly è molto complessa
+
Possibilità, nei macro-assemblatori, di definire macro-istruzioni
+
Possibilità di introdurre nel programma chiamate di libreria
4 A.Broggi

Statements

Un programma Assembly è composto di Statements. Ogni state-


ment comprende una direttiva per l’Assemblatore e corrisponde ad
una riga del programma.

Se la direttiva corrisponde ad una istruzione macchina esegui-


bile dalla CPU, essa è detta Istruzione, altrimenti è una Pseudo-
Istruzione.

Nel seguito verranno quindi analizzate:


+
Istruzioni
– Etichette
– Codici Operativi
– Operandi
+
Pseudo-Istruzioni
+
Macro
+
Commenti
La CPU Intel 8086: Architettura e Programmazione Assembly 5

Istruzioni

Vengono tradotte dall’Assemblatore in istruzioni macchina. Ogni


istruzione è composta in generale da:
+
una Etichetta (o Label)
+
un Codice Operativo (o Operation Code)
+
uno o più Operandi (o Operands)

Esempio:

,-  .) /02134 /5  - 6487:9;

<>=#?A@B=  C /FE
D ? GJILKMG
H
1MCON ?HGJIQPSR

T*U VMWAX ? ,
Y[Z = R"P

@ V =
V\WFX ? ,  

6 A.Broggi

Etichette

Sono identificatori associati ad una istruzione; l’assemblatore le


sostituisce con l’indirizzo dell’istruzione che rappresentano.

Offrono i seguenti vantaggi:


+
permettono di trovare più facilmente un punto del programma
+
permettono di non avere a che fare con indirizzi fisici
+
facilitano la modifica del programma

Esempio:

7] PP>P ;

] P ^ ] 1 T.,_V `3YbaFY = P
P] ] V < X K `5,
`3Ya Y =FP  ] PPP CD/cE 1 , IdR
] PPfe <>g , `h, IQP
La CPU Intel 8086: Architettura e Programmazione Assembly 7

Codici Operativi

+
È lo mnemonico di un’istruzione assembly: in altri termini spe-
cifica l’operazione che deve essere eseguita dalla CPU

+
È l’unico campo che non può mai mancare in un’istruzione

Esempio:

<>=#?A@B=  C /FE
D ? GJILKMG
H
1MCON ?HGJIQPSR

T*U VMWAX ? ,
Y[Z = R"P

@ V =
V\WFX ? ,  

8 A.Broggi

Operandi

Contiene l’indicazione necessaria a reperire gli operandi (uno o


più, a seconda dei casi) richiesti dall’istruzione.

Sulla base di quanto indicato in questo campo, la CPU provvederà,


durante l’esecuzione del programma, a reperire gli operandi:

+
nell’istruzione stessa
+
in un registro
+
in memoria
+
su una porta di I/O

Esempio:

CD/cE ?0GJIdR
CD/cE ?0GJILK\G
CD/cE ?0GJI E ? , / @ V
Y[Z ?iGJI ` G
La CPU Intel 8086: Architettura e Programmazione Assembly 9

Pseudo-Istruzioni

Sono comandi utilizzati durante il processo di assemblaggio (dal-


l’Assemblatore o Assembler), che non vengono tradotti in istruzioni
macchina eseguibili dalla CPU.

Esempio:

= Y = ,\V N8 -jkjl- 4>mNn -

` < V3a < V0a C ViZ = N ?A@B? N X K ,oY 1 p ` ?B=q? p

,V =#= X @q?sr < Z N @ / 1 ZiV ?A@ t Y u%&v


% .4w -v,V =q= X @c?$r < Z

VZA` N t x '6 ybz


% .4w -v,V =q= X @c?$r < Z

VZA` t x & {4" %)m


z4&
 {4 -v- 99 j ) - 
10 A.Broggi

Macro

Sono comandi utilizzati per semplificare la stesura di un program-


ma complesso in cui c’è la necessità di ripetere più volte determinati
segmenti di codice.
Vengono tradotti in sequenze di istruzioni macchina eseguibili
dalla CPU.

Esempio:
<"g Y x|=Ar ,\V x|=Fr}?cGsr}~ C ? 1 @ /
<>g , ?0GIQP
>< g , ?0GIQP
>< g , ?0GIQP
>< g , ?0GIQP
<"g Y x|=Ar ,\V x|=Fr}?cGsr}~ VZA` C

, / ? ` r ?cGsr}? Zc` r C XA, rPf€ C ? 1 @ / E ? ,_XAV


CD/FE ?0GJI E ? ,_XAV
<>g Y x|=Ar ,_V x|=Ar ?BGr~
, / ? ` r ?cGsr}? c
Z ` rC A
X , rPf€ VoZc` C

CD/FE ?0GJIm C V Cƒ‚


<>g Y x|=Ar ,_V x|=Ar ?BGr~
CD/FE KMGIL?0G
, / ? ` r?cGr}? ZA` r C XA, r Pf€ R ]
CD/FE KMGIL?0G

La CPU Intel 8086: Architettura e Programmazione Assembly 11

Commenti

Sono parole o frasi inserite dal programmatore per rendere il pro-


gramma più comprensibile; servono al programmatore stesso e a chi
analizzerà in futuro il codice.
Vengono ignorati dall’assemblatore, che si limita a visualizzarli
quando si richiede il listato del programma.
Tutti i caratteri compresi tra un ’;’ e un „ CR … , vengono consi-
derati commenti.
+
Devono essere utili ed esplicativi; ad esempio:
t
t  -jkjl-†j$- )m
 jkj % - 
t
<>=#?A@B=  C /AE
‡ ? GILKMG
0 t 1 - &
% ?HG
bˆ)l
w %wv4> KMG
1MCON ?0GIdR(~ t 1iw‰Šw ?0G
ˆ)ln - )b R(~ 4 .
"
T*U VMWAX ? , t < ?HG$‹$R"~ - )&) - 9 - ) -Œ-V\W X ? ,
Y[Z = R"P t 1  ->jl- )p YŽZ = V @c@ X N =  j . R"P 2
  
@ V = t @ ' -Œ- )') - z
% .4w -
 -jl- w

V\WFX ? ,  

t
t  -jkjl-  .
b j‘j .w - b
t
<>=#?A@B=  C /AE
‡ ? GILKMG
0 t 1 - &
%v ?iG )k j ’4 )) - “ -
1MCON ?0GIdR(~ ”t < 9• - )k• . j ' –4" .)&)&’9“
% j 

T*U VMWAX ? , t - )&) - 9•
%'n—Œ)') -
Y[Z = R"P t <
 &n—l) - b99b jk- “& - 4 %)l• .9

@ V = t @ ' -
V\WFX ? ,  
12 A.Broggi

Vantaggi dei programmi Assembly

L’utilizzo del linguaggio Assembly anzichè di un linguaggio ad


alto livello (tipo C o Pascal) è talvolta giustificato dalla maggiore
efficienza del codice; infatti i programmi in Assembly sono tipica-
mente
+
più veloci,
+
più corti,
+
ma più complessi
dei programmi scritti in linguaggi ad alto livello.

La maggior complessità è data dal fatto che anche le più comuni


routines devono essere sintetizzate dal programmatore (talvolta per
semplificare la programmazione e per aumentare la compatibilità del
codice, si utilizzano librerie general purpose, ma sono ovviamente
meno efficienti).

Come esempio si consideri un programma per stampare i numeri


pari da 0 a 100:

Il programma BASIC è:
P >] ] Y ‹ ]
P%P ]’N @ YŽZ = Y
PSR ] Y ‹ Y˜ R
Pe ] Y x Yš™ P ]] a / = / P%P ]
La CPU Intel 8086: Architettura e Programmazione Assembly 13

Il codice Assembly generato da un compilatore BASIC è il seguente:

Y `3› œ

, ]] P ]]w C‡/AE YI ]


, ]] PP ]w C‡/AE ?0GJI Y
1 ? ,o, <=q? CN ?
, ]] P*R ]w C‡/AE ?0GJI Y
? `F` ?iGJIdR
CD/FE Y IL?0G
, ]] Pfe ]w C‡/AE ?0GJI Y
1MCON ?0GJIQP ]]
T K , ]] PP ]

Si notano almeno due semplici modifiche, che ne migliorano no-


tevolmente le prestazioni:
+
L’uso di registri al posto di locazioni di memoria
+
L’uso di particolari caratteristiche dell’Assembly
14 A.Broggi

Il programma scritto direttamente in Assembly è quindi il seguen-


te:

CD/FE ?0GJI ] t Y u% - )&&u%u - )ln - )& {4" %)m


 - 
1 Y 1 , /L 1 ? ,o, <>=#? CON ? t”<  -j  - )kn - )' {
Ž %b {4> ?iG
Y[Z 1 ? G
0 t 1 - )
%>) - )lnžv> j %Œ -  -
Y[Z 1 ? G
0 t  - &b {4 - )Qnf f
%
' ?0G

1MCON ? GIQP ]]
0 t < ?0G  -  - 'wŒ)kn - )'

T K 1 Y1 , / t j$- 99b j  I •' -Œ- 1 Y 1 , /

Il programma così ottenuto presenta rispetto a quello prodotto dal


compilatore BASIC due fondamentali vantaggi:
+
è più veloce (perchè usa i registri e non locazioni di memoria)
+
è composto da un numero minore di istruzioni e quindi occupa
una minore estensione di memoria

NB: si noti che l’operazione generale di somma (in questo caso


Ÿ
2) è stata tradotta in una sequenza di operazioni elementari ad hoc.

Per programmi più articolati risulta più evidente la maggiore com-


plessità di sintesi direttamente in Assembly.
La CPU Intel 8086: Architettura e Programmazione Assembly 15

Esempio di procedura Assembly:


assemblato e disassemblato

t¡ "                      >                           >                        
t¡   
t¡  N
% .4w - 4> - b f9 - 4>Q•9b9b - 7 <  Z ;¢4 - )&)•p£ .w yn* -  - 9 % -  
t¡   
t¡ "                      >                           >                        

,V #= = X @c?sr}< Z N @ $ / 1 Z3V ?A@ t Y uŒz


 .4 -Œ,V =#= X @q?sr< Z
Z X F
i / E ?sr ,oV =q= X @c?  C¤/cE ?0gI ]z¥ t < %nžu%& ` / < p @ - 4¦5 %§— - 4

Y[Z = R*P t › ' w V
p
  
/ @ ? , I}R ] t 13nž %b y j &9
%>)

1MCN ? , I p8p t < –)‘ - 9Œ j wv pQp Z p
T"U x YZAV r ,_V =#= X @c? t 9
{4 - )&) - 
% %4w6 -
1MCN ? , I p}9 p t <  pQp < p I
TfZFU Z3X /FE ? r ,_V =#= X @q? t  y)   - )'
x ŽY ZcV r ,_V =#= X @q?  @ V = t @  - )&) - z
>L
 -jl- w

,V =#= X @c?sr}< Z V_ZA` N t x & {4> )) - z
.4 -

¨ ¥ ` ? ]] ?AR K\~ ]^¥ C¤/cE ?0gI ]^¥


¨ ¥ ` ? ]] ?B~ 1 ` RžP Y[Z = R"P
¨ ¥ ` ? ]] ?c€ ]%1 R ] / @ ? , I}R ]
¨ ¥ ` ? ]] ?c© e 1 € V 1|CON ? , I€ V
¨ ¥ ` ? ]] ?c? ¥ ~ ] ~ T"U ] ] K ]
¨ ¥ ` ? ]] ? 1 e 1h¥ e 1MCªN ? , I¥ e
¨ ¥ ` ? ]] ? V ¥ ¨ x«R T.Z U ]%] ?FR
¨ ¥ ` ? ]] K ] 1 e @ V =
16 A.Broggi

ARCHITETTURA LOGICA
DELLA CPU INTEL 8086

+
La CPU INTEL 8086
+
Gestione della Memoria
+
Registri e Flags
+
Composizione manuale di istruzioni macchina
La CPU Intel 8086: Architettura e Programmazione Assembly 17

La CPU INTEL 8086

L’8086 è un microprocessore general purpose a 16 bit.

Le caratteristiche principali sono:


+
Capacità di indirizzamento di 1 MegaByte
+
14 registri interni da 16 bit
+
7 modi di indirizzamento
+
Alimentazione a 5 volt
+
48 pin di interconnessione
+
Set di istruzioni esteso (CISC)
18 A.Broggi

Gestione della memoria

Per comodità la memoria si può pensare divisa in


+
Paragrafi
+
Segmenti

I paragrafi sono zone di memoria costituite da 16 byte contigui. Il


sistema può gestire fino a 64k paragrafi. I paragrafi sono numerati a
partire dalla locazione 00000h di memoria. I paragrafi non possono
sovrapporsi.

I segmenti sono zone di memoria costituite da 64k byte contigui.


Il sistema può gestire fino a 64k segmenti; ogni segmento inizia in
corrispondenza con un paragrafo, ossia ad un indirizzo multiplo di
16. I segmenti possono sovrapporsi (Overlapping Segments).

Memoria ...

0 16 32 48 64 80 96 1M-32 1M-16 1M

Paragrafi
0 1 2 3 4 5 64k-2 64k-1
0
1
Segmenti
2
La CPU Intel 8086: Architettura e Programmazione Assembly 19

Calcolo dell’Indirizzo Fisico

L’indirizzo fisico di una cella di memoria è espresso da 20 bit; non


è quindi possibile un indirizzamento mediante un solo registro a 16
bit. Esso è infatti ottenuto mediante la somma di due contributi:
+
il Segment Address:
è l’indirizzo di testa del segmento e viene ottenuto moltiplicando
per 16 il numero del segmento.
+
l’Effective Address (EA):
è l’indirizzo effettivo all’interno del segmento, calcolato come
offset (spostamento) rispetto all’inizio del segmento stesso.

NB: la moltiplicazione per 16 può essere notevolmente velocizza-


ta da un semplice shift a sinistra di 4 posizioni della rappresentazione
binaria del numero.

Effective Address + 16 bit

Segment Address = 16 bit

Physical Address 20 bit


20 A.Broggi

Registri e Flags

La CPU INTEL 8086 possiede i seguenti 14 registri:


+
4 General Purpose Registers
+ Ÿ
5 Pointer (o Index o Offset) Registers ( 1)
+
4 Segment Registers
+
1 Flag Register

La precedente suddivisione è dettata dai tipi di operazioni che tali


registri possono eseguire.
La CPU Intel 8086: Architettura e Programmazione Assembly 21

General Purpose Registers

Sono registri da 16 bit, ciascuno dei quali utilizzabile indifferen-


temente come un registro da 16 bit o come due registri da 8 bit. Essi
sono:

+
AX: Accumulator, utilizzabile anche come AH + AL
+
BX: Base, utilizzabile anche come BH + BL
+
CX: Count, utilizzabile anche come CH + CL
+
DX: Data, utilizzabile anche come DH + DL
22 A.Broggi

Pointer Registers

I registri Pointer (o Index o Offset) sono generalmente utilizzati


come puntatori a dati in memoria. Si possono dividere in:

+
Base Pointer
– BX: Data Segment Base Pointer (è il BX precedente!)
– BP: Stack Segment Base Pointer
+
Index Pointer
– SI: Source Index Pointer
– DI: Destination Index Ponter
+
Stack Pointer
– SP: Stack Pointer
+
Instruction Pointer
– IP: Instruction Pointer
La CPU Intel 8086: Architettura e Programmazione Assembly 23

Segment Registers

Sono 4 registri destinati a contenere l’indirizzo di testa dei seg-


menti usati dal programma.

+
CS: Code Segment Register
Contiene sempre l’indirizzo di testa del segmento contenente
il codice; viene inizializzato dal Sistema Operativo e non deve
essere utilizzato dal programmatore.
+
SS: Stack Segment Register
Contiene sempre l’indirizzo di testa del segmento contenente
lo stack; viene inizializzato dal Sistema Operativo e non deve
essere modificato dal programmatore.
+
DS: Data Segment Register
Di solito contiene l’indirizzo di testa del segmento dei dati utiliz-
zati dal programma; deve essere inizializzato dal programmatore
all’interno del suo programma.
+
ES: Extra Segment Register
Può essere utilizzato per definire un segmento ausiliario, per
esempio per un ulteriore segmento dati; deve essere inizializzato
dal programmatore all’interno del suo programma.
24 A.Broggi

Flag Register

L’8086 dispone di 9 bit detti flag, organizzati all’interno di un


registro a 16 bit (Flag Register).

I bit non usati sono fissi al valore 0.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF

Carry Flag
Parity Flag
Auxiliary Flag
Zero Flag
Sign Flag
Trap Flag
Interrupt Flag
Direction Flag
Overflow Flag

I flag si possono suddividere in due categorie:


+
di stato
+
di controllo
La CPU Intel 8086: Architettura e Programmazione Assembly 25

Flag di Stato

Forniscono indicazioni relative al risultato dell’ultima istruzio-


ne eseguita. Vengono automaticamente aggiornati dal processore
ed il loro valore può essere testato dall’utente tramite opportune
istruzioni. Sono:
+
Carry Flag (CF)
Forzato ad 1 principalmente quando un’istruzione di somma (o
sottrazione) produce un riporto (o un prestito)
+
Parity Flag (PF)
Forzato ad 1 quando il risultato di una operazione contiene un
numero pari di 1; usato principalmente per trasmissione dati.
+
Auxiliary Carry Flag (AF)
Forzato ad 1 quando si produce un riporto tra il bit 3 e il bit 4 di
un operando; usato per operazioni su numeri decimali packed
+
Zero Flag (ZF)
Forzato ad 1 quando il risultato di una operazione è un valore
nullo; rimane a 0 altrimenti.
+
Sign Flag (SF)
Ripete il valore del bit più significativo del risultato di una ope-
razione
+
Overflow Flag (OF)
Forzato ad 1 quando un’operazione aritmetica da origine ad una
condizione di overflow.
26 A.Broggi

Flag di Controllo

Il loro valore può essere forzato dall’utente attraverso apposite


istruzioni.

In determinate situazioni sono testati dal processore che, a secon-


da del loro valore, si comporta in modi diversi.
+
Trap Flag (TF)
Usato in ambiente di debug, causa l’esecuzione single-step dei
programmi
+
Interrupt Enable Flag (IF)
Usato per disabilitare (quando uguale a 0) eventuali richieste di
interruzioni esterne (interrupt)
+
Direction Flag (DF)
Usato nelle operazioni sulle stringhe per regolare l’incremento
(DF=0) o il decremento (DF=1) dei Registri Indice
La CPU Intel 8086: Architettura e Programmazione Assembly 27

Composizione Manuale
di Istruzioni Macchina

Basandosi sulle tabelle fornite dal costruttore, si emuli il compor-


tamento dell’Assemblatore, costruendo manualmente un’istruzione
macchina: ad esempio

MOV AH,11

Si esamina la tabella relativa all’istruzione MOV, unitamente alla


speigazione dei simboli in essa contenuti.
28 A.Broggi

Esempio: MOV AH, 11

Dalla tabella fornita per l’istruzione MOV si osserva il formato


nel caso di trasferimento di un dato contenuto nell’istruzione stes-
sa (immediate) in un registro; si consideri quindi la terza riga della
tabella.
Il formato macchina dell’istruzione occupa quindi due byte, così
composti:

OpCode W Reg Dato

Il significato dei vari campi è il seguente:


+
i primi 4 bit rappresentano l’Operation Code, che identifica il
tipo di istruzione;
+
il bit W vale 1 se l’operando è su 16 bit, 0 se è su 8 bit: nel caso
in esame W ¬ 0;
+
i 3 bit Reg indicano il registro destinazione, secondo la tabella
indicata: nel caso in esame Reg ¬ 100;
+
gli 8 bit di dato contengono l’operando:
nel caso in esame 11 ­ 10 ® ¬ 00001011 ­ 2® .

Il formato macchina dell’istruzione MOV AH, 11 è quindi:


1011 0 100 00001011
La CPU Intel 8086: Architettura e Programmazione Assembly 29

IL LINGUAGGIO ASSEMBLY 8086

+
Elementi di Base del Linguaggio
+
Istruzioni
+
Modi di Indirizzamento
+
Tempo di Esecuzione delle Istruzioni
+
Pseudo-Istruzioni

Come esempio si farà riferimento ad un semplice programma di


conversione di formato di interi.
30 A.Broggi

Elementi di base del linguaggio

+
Un programma scritto in Assembly 8086 è composto di State-
ments; normalmente ognuno di essi occupa una riga fino ad un
„ LF … o una coppia „ CR …ˆ„ LF … .

+
Uno statement può proseguire sulla riga successiva, se questa
comincia con il carattere ’&’.
+
L’insieme dei caratteri utilizzabili è composto da
– caratteri alfanumerici (maiuscole, minuscole, cifre),
– caratteri non stampabili (spazio, TAB, „ CR … , „ LF … ),
Ÿ ¯ °h±
– caratteri speciali ( ¬ ²³M´'µ„ˆ… ;’.",_:?@$&)
+
All’interno del programma possono comparire:
– Identificatori
– Costanti
– Espressioni
La CPU Intel 8086: Architettura e Programmazione Assembly 31

Identificatori

+
Sono usati come nomi assegnati ad entità definite dal program-
matore (segmenti, variabili, label, etc.)
+
Sono composti da lettere, numeri o uno dei tre caratteri @ ? _,
ma non possono iniziare con un numero
+
Hanno lunghezza massima di 31 caratteri
32 A.Broggi

Costanti

Si possono utilizzare costanti:


+
binarie: 001101B
+
ottali: 15O, 15Q
+
esadecimali: 0Dh, 0BEACh (devono iniziare con un numero)
+
decimali: 13, 13D
+
ASCII: ’S’, ’Salve’
+
reali in base 10: 2.345678, 112E-3
La CPU Intel 8086: Architettura e Programmazione Assembly 33

Espressioni

Si possono utilizzare i seguenti operatori:


+
artimetici
Ÿ·¶¯ˆ¶—°A¶^± ¶
( MOD, SHL, SHR)
+
logici
(AND, OR, XOR, NOT)
+
relazionali
(EQ, NE, LT, GT, LE, GE)
+
che ritornano un valore
($, SEG, OFFSET, LENGTH, TYPE)
+
attributi
(PTR, DS:, ES:, SS:, CS:, HIGH, LOW)
34 A.Broggi

Precedenze tra gli operatori

Gli operatori visti possono essere elencati in ordine di priorità


decrescente nel modo che segue:
+
LENGTH, SIZE, WIDTH, MASK, ²³ , ´'µ , „ˆ…

+
PTR, OFFSET, SEG, TYPE, THIS, segment override
+
HIGH, LOW
+ Ÿ ¯
(unario), (unario)
+ ° ±
, , MODE, SHL, SHR
+ Ÿ ¯
,
+
EQ, NE, LT, LE, GT, GE
+
NOT
+
AND
+
OR, XOR
+
SHORT

La priorità può essere modificata tramite l’uso delle parentesi ton-


de.
La CPU Intel 8086: Architettura e Programmazione Assembly 35

Istruzioni

L’Assembly 8086 rende disponibili 92 tipi di istruzioni, raggrup-


pabili nelle seguenti classi:

+
Trasferimento Dati
+
Aritmetiche
+
Manipolazione di Bit
+
Trasferimento di Controllo
+
Manipolazione di Stringhe
+
Manipolazione di Interruzioni
+
Controllo del Processore
36 A.Broggi

Istruzioni di Trasferimento Dati

OpCode Descrizione
General Purpose
MOV Move (Byte or Word)
POP Pop a Word from the Stack
PUSH Push Word onto Stack
XCHG Exchange Registers
XLAT Translate
Input/Output
IN Input Byte or Word
OUT Output to Port
Trasf. di indirizzi
LDS Load Pointer Using DS
LEA Load Effective Address
LES Load Pointer Using ES
Trasf. Flag Register
LAHF Load Register AH from
SAHF Store Register AH into
POPF Pop Flags from the Stack
PUSHF Push Flags onto Stack
La CPU Intel 8086: Architettura e Programmazione Assembly 37

Combinazioni non ammesse da MOV

Non sono ammessi i seguenti trasferimenti:


+
memoria ¸ memoria
Si deve passare attraverso un registro general-purpose: esempio:
CD/AE ?0GJId<>@ 1
CD/AE `5V <=AIL?0G

+
segment register ¸ immediato
Si deve passare attraverso un registro general-purpose: esempio:
CD/AE ?0GJI ` ?c=#?sr< V0a
CD/AE ` <2IL?iG

+
segment register ¸ segment register
Si deve passare attraverso un registro general-purpose (4 cicli):
esempio:
CD/AE ?0GJI V <
CD/AE ` <2IL?iG

oppure attraverso lo stack (26 cicli): esempio:


N X <g V <
N /FN
\ ` <

+
Qualsiasi trasferimento che utilizzi CS come destinazione
38 A.Broggi

Uso dello Stack

Lo Stack è un potente mezzo per memorizzare dati run-time; è


inoltre basilare ricordare che è una struttura dati LIFO (Last In First
Out) e i dati devono venire estratti (POP) nell’ordine inverso a quello
in cui erano stati inseriti (PUSH).

Esempio:

N X w < g ?0G
N X <wg V <
N X <wg ` Y
3
N X <wg < Y

N\/FN < Y
N\/FN `3Y
N\/FN V <
N\/FN ?0G
La CPU Intel 8086: Architettura e Programmazione Assembly 39

Effetti di PUSH e POP sullo Stack


40 A.Broggi

Istruzioni Artimetiche
OpCode Descrizione
Addizione
AAA ASCII Adjust after Addition
ADC Add with Carry
ADD Addition
DAA Decimal Adjust after Addition
INC Increment
Sottrazione
AAS ASCII Adjust after Subtraction
SUB Subtract
SBB Subtract with Borrow
DAS Decimal Adjust after Subtraction
DEC Decrement
CMP Compare
NEG Negate
Moltiplicazione
AAM ASCII Adjust after Multiply
IMUL Integer Multiply, Signed
MUL Multiply, Unsigned
Divisione
AAD ASCII Adjust before Division
DIV Divide, Unsigned
IDIV Integer Divide, Signed
Conversione
CBW Convert Byte to Word
CWD Convert Word to Doubleword
La CPU Intel 8086: Architettura e Programmazione Assembly 41

Formato dei dati


nelle Istruzioni Aritmetiche

Il processore 8086 può eseguire operazioni aritmetiche su numeri


nei seguenti formati:
+
numeri binari senza segno, su 8 o 16 bit
+
numeri binari con segno, su 8 o 16 bit
+
numeri decimali packed, in cui ogni byte contiene due numeri
decimali codificati in BCD; la cifra più significativa è allocata
nei 4 bit superiori
+
numeri decimali unpacked, in cui ogni byte contiene un solo nu-
mero decimale BCD nei 4 bit inferiori; i 4 bit superiori devono
essere a 0 se il numero è usato in una operazione di moltiplica-
zione o divisione
42 A.Broggi

Operazioni su 32 bit

Le operazioni di somma e sottrazione possono essere facilmente


eseguite anche su operandi di dimensioni superiori a 16 bit, usando
le istruzioni
+
ADC (ADd with Carry)
+
SBB (SuBtract with Borrow)

che eseguono rispettivamente le seguenti operazioni:


+ Ÿ Ÿ
destination ¸ destination source Carry
+ ¯ ¯
destination ¸ destination source Carry

Esempio 1:
Per sommare i 32 bit memorizzati in BX:AX con DX:CX, lasciando
il risultato in BX:AX,
? `F` ? GJI 1 G
i ”t <  jkjk-  P €  j .v9“&&‰[
- &nž
? ` 1 KMGJI ` G t”<  k j jl-  P€ ¹'8ºL9•''‰Š&
- nž

Esempio 2:
Per sottrarre i 32 bit memorizzati in BX:AX a DX:CX, lasciando il
risultato in BX:AX,
< X K ?iGJI 1 G t <   - –) »!«4 j %v9•&'‰Š
- n^
< K 1
 KMGJI ` G t”< "  - y ) »!«4ˆ2ºd9Š'‰[
- &nž
La CPU Intel 8086: Architettura e Programmazione Assembly 43

Moltiplicazione e Divisione

Il processore 8086, a differenza di molti processori ad 8 bit, di-


spone delle istruzioni di moltiplicazione e divisione.

Per entrambe le operazioni esistono forme distinte a seconda che


gli operandi siano interi senza segno (MUL o DIV) o interi con segno
(IMUL e IDIV).

Le due operazioni hanno un solo operando, che deve essere un


registro generale o una variabile (cioè il contenuto di una locazione
di memoria).

A seconda delle dimensioni di tale operando (byte o word), si


hanno operazioni di tipo byte oppure word.
44 A.Broggi

Moltiplicazione

Si distinguono i due casi:


+
operazioni di tipo byte:
AX ¸ AL * source-8-bit
+
operazioni di tipo word:
DX:AX ¸ AX * source-16-bit

Divisione

Si distinguono i due casi:


+
operazioni di tipo byte:
AL ¸ INT( AX / source-8-bit )
AH ¸ resto
+
operazioni di tipo word:
AX ¸ INT( DX:AX / source-16-bit )
DX ¸ resto
La CPU Intel 8086: Architettura e Programmazione Assembly 45

Operazioni su Numeri Decimali

Il processore 8086 dispone di alcune istruzioni che permettono di


eseguire le 4 operazioni fondamentali anche sui numeri decimali.

Esse non hanno operandi, in quanto lavorano sempre sul registro


AL (AX per la moltiplicazione). Nel caso della divisione l’istruzio-
ne di conversione deve essere applicata al dividendo (in AX) prima
della divisione.

Il risultato della conversione è memorizzato ancora nel registro


AL (AX per la moltiplicazione e la divisione).

Esempio di diversa rappresentazione:

binario: 0000 0000 0010 0011


decimale packed: 0011 0101
decimale unpacked: 0000 0011 0000 0101
46 A.Broggi

Le Istruzioni di conversione decimale-binario sono:


+
AAA:
converte il risultato di un’addizione in decimale unpacked
+
AAS:
converte il risultato di una sottrazione in decimale unpacked
+
AAM:
converte il risultato di una moltiplicazione in decimale unpacked
+
AAD:
converte il dividendo di una divisione da decimale unpacked a
binario
+
DAA:
converte il risultato di un’addizione in decimale packed
+
DAS:
converte il risultato di una sottrazione in decimale packed
La CPU Intel 8086: Architettura e Programmazione Assembly 47

Istruzioni
per la Manipolazione dei Bit

OpCode Descrizione
Logiche
AND Logical AND
OR Logical OR
XOR Exclusive OR
NOT Logical NOT
TEST Test
Di Traslazione
SAL Shift Arithmetic Left (=SHL)
SAR Shift Arithmetic Right
SHL Shift Logical Left (=SAL)
SHR Shift Logical Right
Di Rotazione
ROL Rotate Left
ROR Rotate Right
RCL Rotate through Carry Left
RCR Rotate through Carry Right
48 A.Broggi

Istruzioni di Shift e Rotate


La CPU Intel 8086: Architettura e Programmazione Assembly 49

Trasferimento del Controllo


OpCode Descrizione
Salti incondizionati
CALL Call Procedure
RET Return from Procedure
JMP Jump Unconditionally
Salti condizionati
JA, JNBE Jump If Above
JAE, JNB Jump If Above or Equal
JB, JNAE, JC Jump If Below
JBE, JNA Jump If Below or Equal
JCXZ Jump if CX Register Zero
JE, JZ Jump If Equal
JG, JNLE Jump If Greater
JGE, JNL Jump If Greater or Equal
JL, JNGE Jump If Less
JLE, JNG Jump If Less or Equal
JNC Jump If No Carry
JNE, JNZ Jump If Not Equal
JNO Jump If No Overflow
JNP, JPO Jump If No Parity
JNS Jump If No Sign
JO Jump If Overflow
JP, JPE Jump If Parity
JS Jump If Sign
Istruzioni iterative
LOOP Loop on Count
LOOPE, LOOPZ Loop While Equal
LOOPNE, LOOPNZ Loop While Not Equal
50 A.Broggi

Istruzioni di Salto

Permettono di effettuare:
+
Salti Condizionati:
– il salto viene eseguito o meno a seconda del valore corrente
di uno o più flag; questi sono solitamente modificati da una
precedente istruzione CMP, SUB, etc.;
– la distanza relativa dell’istruzione cui saltare deve essere com-
¯ Ÿ
presa tra 128 e 127;
– non sono ammessi salti ad un segmento diverso da quello
corrente.
+
Salti Incondizionati:
Il salto avviene comunque e ad istruzioni ovunque posizionate,
anche all’interno di un segmento diverso da quello corrente.
La CPU Intel 8086: Architettura e Programmazione Assembly 51

Nota:

Alcune delle istruzioni di salto condizionato elencate sono ridon-


danti: ad esempio la JA (Jump if Above) è equivalente alla JNBE
(Jump if Not Below or Equal).

La seguente tabella riporta l’insieme minimo di istruzioni di salto


condizionato da usare dopo un’istruzione
CMP NUM1, NUM2
dove NUM1 e NUM2 possono essere due numeri con o senza segno.

numeri senza segno numeri con segno


NUM1 … NUM2 JA JG
NUM1 ¬ NUM2 JE JE
NUM1 ¬ ¼ NUM2 JNE JNE
NUM1 „ NUM2 JB JL
NUM1 ½ NUM2 JBE JLE
NUM1 ¾ NUM2 JAE JGE
52 A.Broggi

Le Istruzioni CALL e RET

L’Assembly 8086 permette l’uso delle Procedure, in modo simile


a quanto avviene nei linguaggi ad alto livello: l’unica differenza sta
nell’impossibilità di passare dei parametri nel modo consueto.

Mediante una Procedura è possibile scrivere una volta per tut-


te quelle parti di codice che vengono ripetutamente eseguite in un
programma, ottenendo molti vantaggi:
+
Maggiore leggibilità del codice
+
Risparmio di tempo per il programmatore
+
Risparmio di memoria occupata dal codice
+
Possibilità di ricorsione e annidamento (limitate solo dalle di-
mensioni dello stack)
+
Una Procedura è diversa da una Macro!

Le istruzioni CALL e RET permettono di effettuare una chiamata


ad una procedura e di ritornare da essa.
La CPU Intel 8086: Architettura e Programmazione Assembly 53

Una procedura può essere:


+
NEAR:
può essere chiamata solo dall’interno dello stesso segmento di
codice cui appartiene;
+
FAR:
può essere chiamata dall’interno di un segmento di codice qual-
siasi.
Il tipo di procedura (NEAR o FAR) deve essere dichiarato all’atto
della creazione della procedura stessa.

La CALL provvede a:
+
salvare il valore corrente di IP (e di CS nel caso di procedura
FAR) nello stack, tramite un’operazione di PUSH;
+
caricare in IP (e in CS) il valore corrispondente all’indirizzo di
partenza della procedura chiamata.

La RET provvede a:
+
ripristinare tramite un’istruzione POP il valore di IP (e di CS nel
caso di procedura FAR) salvato nello stack, riprendendo quindi
l’esecuzione del programma a partire dell’istruzione successiva
all’ultima CALL.
54 A.Broggi

Istruzioni
per il Controllo delle Iterazioni

Il processore 8086 prevede anche alcune istruzioni per la gestione


dei loop. Il loro formato è:

OpCode Label

dove OpCode può essere:


+
LOOP:
decrementa il registro CX e salta a Label se questo è diverso da
zero;
+
LOOPE / LOOPZ:
decrementa il registro CX e salta a Label se:
– CX è diverso da zero e
– lo Zero Flag vale 1;
+
LOOPNE / LOOPNZ:
decrementa il registro CX e salta a Label se:
– CX è diverso da zero e
– lo Zero Flag vale 0;
La CPU Intel 8086: Architettura e Programmazione Assembly 55

Istruzioni
per la Manipolazione delle Stringhe

OpCode Descrizione
Istruzioni di Spostamento
MOVS Move String (Byte or Word)
MOVSB Move String Byte
MOVSW Move String Word
Istruzioni di Confronto
CMPS Compare String (Byte or Word)
CMPSB Compare String Byte
CMPSW Compare String Word
Istruzioni di Ricerca
SCAS Scan String (Byte or Word)
SCASB Scan String Byte
SCASW Scan String Word
Istruzioni di Caricamento
LODS Load String (Byte or Word)
LODSB Load String Byte
LODSW Load String Word
Istruzioni di Scrittura
STOS Store String (Byte or Word)
STOSB Store String Byte
STOSW Store String Word
56 A.Broggi

Le istruzioni per la manipolazione delle stringhe operano su bloc-


chi di dati consecutivi in memoria, denominati stringhe e costituiti
da byte o word.

Eseguono 5 tipi di operazioni:


+
Move:
sopstamento di un dato da una posizione di memoria ad un’altra
+
Compare:
confronto di due dati in memoria
+
Scan:
ricerca di un dato in memoria
+
Load:
caricamento di un dato dalla memoria in un registro accumula-
tore
+
Store:
scrittura in memoria di un dato presente in un registro accumu-
latore
La CPU Intel 8086: Architettura e Programmazione Assembly 57

Le istruzioni per la manipolazione delle stringhe si distinguono


dalle normali istruzioni di MOV, CMP, etc. in quanto:
+
l’accesso ai dati in memoria avviene attraverso i registri SI e DI,
usati come offset rispettivamente all’interno del Data Segment
(DS) e dell’Extra Segment (ES);
+
SI e DI vengono automaticamente modificati al termine di ogni
operazione, in modo da puntare al successivo dato all’interno
della stringa; in particolare SI e DI vengono
– incrementati se il Direction Flag (DF) vale 0;
– decrementati se il Direction Flag (DF) vale 1;
I registri SI e DI vengono incrementati (o decrementati)
– di 1 nel caso di operazioni su byte;
– di 2 nel caso di operazioni su word;

Il flag DF può essere settato e resettato tramite le istruzioni STD


e CLD, rispettivamente.
58 A.Broggi

Tutte le istruzioni di manipolazione di stringhe hanno tre forme:


+
operazioni su byte (ad esempio MOVSB) che non hanno ope-
randi;
+
operazioni su word (ad esempio MOVSW) che non hanno ope-
randi;
+
operazioni su byte o word (ad esempio MOVS) che hanno uno
o due operandi; vengono tradotte dall’assemblatore in una delle
precedenti due forme, a seconda del tipo degli operandi.

Esempio: nel seguente programma

<>=#@$P ` K P ]] `5X qN 7œ ;


<>=#@cR ` K P ]] ` X q
5 N 7œ ;

CD/cE < <>=q@ PId<>=#@AR

l’istruzione MOVS viene tradotta dall’assemblatore in MOVSB.


La CPU Intel 8086: Architettura e Programmazione Assembly 59

Prefissi di Ripetizione

OpCode Descrizione
Prefissi di Ripetizione
REP Repeat
REPE Repeat While Equal
REPNE Repeat While Not Equal
REPNZ Repeat While Not Zero
REPZ Repeat While Zero

Le istruzioni di manipolazione delle stringhe agiscono sul singolo


dato all’interno della stringa, ma sono costruite per essere utilizzate
in costrutti iterativi attraverso l’uso dei Prefissi di Ripetizione.

Questi, inseriti nel programma sorgente prima dello mnemonico


dell’istruzione, permettono di ripetere l’istruzione seguente fino a
che non si verifica una determinata condizione: esistono 2 Prefissi di
Ripetizione:
60 A.Broggi

+
REP o REPE o REPZ:
Se usate in combinazione con
– MOVS, LODS e STOS, causano la ripetizione dell’istruzio-
ne seguente per un numero di volte pari al contenuto inizia-
le di CX; ad ogni iterazione CX viene decrementato e l’i-
struzione viene ripetuta fin tanto che CX è diverso da 0; al
termine CX vale 0;
– CMPS e SCAS, il comportamento è uguale al caso prece-
dente, con l’unica differenza che il ciclo viene abbandonato
anche se lo Zero Flag (ZF) assume valore 0;
+
REPNE o REPNZ:
Se usate in combinazione con
– MOVS, LODS e STOS, causano la ripetizione dell’istruzio-
ne seguente per un numero di volte pari al contenuto inizia-
le di CX; ad ogni iterazione CX viene decrementato e l’i-
struzione viene ripetuta fin tanto che CX è diverso da 0; al
termine CX vale 0;
– CMPS e SCAS, il comportamento è uguale al caso prece-
dente, con l’unica differenza che il ciclo viene abbandonato
anche se lo Zero Flag (ZF) assume valore 1;
La CPU Intel 8086: Architettura e Programmazione Assembly 61

Istruzione per la Manipolazione


delle Interruzioni
OpCode Descrizione
Manipolazione di Interruzioni
INT Interrupt
INTO Interrupt on Overflow
IRET Interrupt Return

Permettono di gestire gli Interrupt software. La richiesta di un’in-


terruzione causa:
+
il salvataggio sullo stack dei registri IP e CS;
+
il salvataggio sullo stack del Flag Register;
+
l’esecuzione di una routine di servizio dell’Interrupt (ISR, Inter-
rupt Service Routine).

Un Interrupt è simile ad una chiamata a procedura; esistono tutta-


via delle differenze:
+
Mentre l’esecuzione di una procedura può essere attivata solo
via software, l’esecuzione di una ISR può essere attivata anche
via hardware;
+
Una ISR è sempre FAR, in quanto comporta comunque il cari-
camento del registro CS.
+
Un Interrupt causa il salvataggio nello stack anche del Flag Re-
gister.
62 A.Broggi

L’attivazione di una ISR è una procedura abbastanza complessa:

l’indirizzo della routine di servizio dell’Interrupt viene ottenuto da


una tabella allocata negli indirizzi bassi della memoria (nelle loca-
zioni 0000:0000h ¿ 0000:03FFh); ogni elemento di tale tabella, det-
to Interrupt Vector, contiene i 32 bit dell’indirizzo di partenza della
ISR relativa ad uno dei 256 differenti Interrupt riconosciuti.

Esempio:
La CPU Intel 8086: Architettura e Programmazione Assembly 63

Istruzione INT

Causa l’attivazione della routine di servizio relativa ad un certo


Interrupt. Ha il seguente formato:

INT interrupt-number

dove interrupt-number identifica l’Interrupt, cioè il numero d’ordine


dell’Interrupt Vector che si desidera attivare, all’interno della tabella
che contiene i 256 Interrupt Vector ammessi dal sistema.

L’indirizzo fisico dell’Interrupt viene ottenuto semplicemente mol-


tiplicando per 4 il parametro interrupt-number.

NB: come caso particolare si ha l’istruzione senza parametri


INTO, che equivale a:
+
una INT 4 quando l’Overflow Flag (OF) è settato;
+
una istruzione nulla, altrimenti.
64 A.Broggi

Le operazioni causate da una INT sono:


+
salvataggio nello stack del Flag Register
+
azzeramento dei flag TF (Trap Flag) e IF (Int. Enable/Disable)
+
salvataggio nello stack del registro CS
+
caricamento in CS della seconda word dell’Interrupt Vector
+
salvataggio nello stack del registro IP
+
caricamento in IP della prima word dell’Interrupt Vector
La CPU Intel 8086: Architettura e Programmazione Assembly 65

Istruzione IRET

È l’istruzione conclusiva di una ISR; causa il ritorno del sistema


nello stato precedente all’ultima INT e l’esecuzione delle istruzio-
ni ad essa successive nel programma interrotto. Non ha operandi e
provoca le seguenti operazioni:
+
preleva dallo stack il valore di IP;
+
preleva dallo stack il valore di CS;
+
preleva dallo stack il valore del Register Flag.
66 A.Broggi

Istruzioni
per il Controllo del Processore

OpCode Descrizione
Modifica dei flag
CLC Clear Carry Flag
CLD Clear Direction Flag
CLI Clear Interrupt-Enable Flag
CMC Complement Carry Flag
STC Set Carry Flag
STD Set Direction Flag
STI Set Interrupt Enable Flag
Sincronizzazione
ESC Escape
HLT Halt
LOCK Lock the Bus
WAIT Wait
Istruzione nulla
NOP No Operation

Servono per regolare il funzionamento del processore attraverso


comandi software.
La CPU Intel 8086: Architettura e Programmazione Assembly 67

Modifica dei Flag

Permettono di modificare alcuni Flag; sono:


+
STC, CLC e CMC:
rispettivamente servono per forzare ad 1 o a 0 il Carry Flag;
CMC complementa il valore del Carry Flag;
+
STD e CLD:
rispettivamente servono per forzare ad 1 o a 0 il Direction Flag;
+
STI e CLI:
rispettivamente servono per forzare ad 1 o a 0 l’Interrupt Flag;
68 A.Broggi

Istruzioni di Sincronizzazione

Permettono al processore 8086 di sincronizzarsi con dispositivi


esterni; sono:
+
HLT:
forza il processore nello stato idle, cioè il processore non esegue
nessuna istruzione fino a che non:
– riceve un Interrupt esterno;
– viene attivata la linea RESET.
+
WAIT:
forza il processore nello stato idle; ogni 5 colpi di clock viene
controllata la linea TEST: quando questa viene attivata, il pro-
cessore procede con l’esecuzione dell’istruzione successiva alla
WAIT;
+
ESC:
usata per inviare istruzioni al coprocessore matematico 8087;
+
LOCK:
è un prefisso che può precedere qualunque istruzione; si usa
quando si vuole che nessun altro dispositivo utilizzi il bus du-
rante l’esecuzione dell’istruzione prefissata. Viene utilizzata in
sistemi multiprocessore per istruzioni che facciano uso di risorse
critiche (memoria condivisa).
La CPU Intel 8086: Architettura e Programmazione Assembly 69

Istruzione nulla: NOP

Non esegue nessuna operazione, se non quella di far avanzare


l’Instruction Pointer (IP) all’istruzione successiva.

Sue possibili applicazioni sono:


+
occupare il posto di una istruzione cancellata quando si vuole
modificare il codice macchina senza doverlo ri-assemblare;
+
introdurre un periodo di attesa di durata nota prima dell’esecu-
zione dell’istruzione successiva.
70 A.Broggi

Modi di Indirizzamento

Il Modo di Indirizzamento di un’istruzione definisce il metodo da


utilizzare per determinare dove è memorizzato un particolare dato
(operando).
Gli operandi possono essere contenuti:
+
in registri;
+
nell’istruzione stessa;
+
in memoria;
+
su una porta di I/O.

I Modi di Indirizzamento possono essere raggruppati in 7 classi:


+
Register;
+
Immediate;
+
Direct;
+
Register Indirect;
+
Base Relative;
+
Direct Indexed;
+
Base Indexed.
La CPU Intel 8086: Architettura e Programmazione Assembly 71

Register Addressing

Nell’istruzione è specificato il registro da utilizzare come operan-


do.

Formato Assembly:

„ registro …

Esempio:
CD/cE ?0GJILK\G
72 A.Broggi

Immediate Addressing

Nell’istruzione stessa è indicato il dato da utilizzare come operan-


do.

Formato Assembly:

„ espressione …

Esempi:
CD/AE ?HGJIQP ]

CD/AE K , I 7 ~ž žP ¥ ;b P ]

La CPU Intel 8086: Architettura e Programmazione Assembly 73

Note:

+
L’operando può anche essere un simbolo definito mediante una
pseudo-istruzione EQU.

Esempio:
¦ V WFX
M PSRe~
'
C‡/AE 1 GI ¦

+
Il dato indicato nell’istruzione viene trasformato dall’assembla-
tore in formato binario su 8 o 16 bit, e scritto nel campo oppor-
tuno dell’istruzione macchina.
Si noti, come regola generale, che, se il dato è su 16 bit, gli 8
bit più significativi sono scritti nel secondo byte, mentre quelli
meno significativi nel primo.
74 A.Broggi

Direct Addressing

Nell’istruzione è specificato il nome di una variabile, corrispon-


dente all’Effective Address della parola di memoria da utilizzare co-
me operando. Alla variabile può essere sommata o sottratta un’e-
spressione.
L’indirizzo fisico è ottenuto sommando l’EA con il contenuto del
Data Segment DS moltiplicato per 16.

Formato Assembly:

„ variabile … À „ espressione …

Esempio:
CD/FE ?0GIL=«?AK _, V
CD/FE ?0GIL=«?AK _, V ˜ P©
La CPU Intel 8086: Architettura e Programmazione Assembly 75

Esempio di Direct Addressing


76 A.Broggi

Register Indirect Addressing

L’Effective Address dell’operando è contenuto in uno dei seguenti


registri:
+
Base;
+
Index Register (DI oppure SI);
+
Base Pointer (BP).

Viene detto Indirect perchè nell’istruzione è indicato dove trovare


l’indirizzo dell’operando.

Formato Assembly:

´„ registro …Áµ

Esempio:
CD/cE ?0GJIm K0G ‚
CD/cE ?0GJIm < Y ‚
La CPU Intel 8086: Architettura e Programmazione Assembly 77

Esempio di
Register Indirect Addressing
78 A.Broggi

Esempio

Codice per il trasferimento di un vettore in un altro usando il


Register Indirect Addressing.

CD/AE < Y I / x|x«< V = < / X @ 1 V r E V 1 =


CD/AE `3Y I / x|x«< V = `5V <wA = rE V 1 =
CD/AE 1 GJI E V 1 =Ar ,_V0ZAa =qg
W5XBY  CD/FE ?iGJI < Y ‚
CD/AE  `cY ‚ IL?HG
? `F` < Y I R
? `F` `3Y I R
, /s/AN W3XcY
La CPU Intel 8086: Architettura e Programmazione Assembly 79

Base Relative Addressing

L’Effective Address dell’operando è calcolato sommando il con-


tenuto di uno dei Base Register (BX o BP) ad un displacement rap-
presentato da una costante presente nell’istruzione stessa.

Formato Assembly:
Ÿ
´Â„ registro … „ displacement …{µ

Esempio:
CD/AE ?HGJIm K0G ˜ ~ ‚

Nota:
le 3 forme
CD/AE ?HGJIm K0G ˜ ~ ‚
CD/AE ?HGJIJ~v K0G ‚
CD/AE ?HGJIm K0G ‚ ˜ ~

sono equivalenti, ma è da preferire la prima.


80 A.Broggi

Esempio di Base Relative Addressing


La CPU Intel 8086: Architettura e Programmazione Assembly 81

Direct Indexed Addressing

L’Effective Address dell’operando è calcolato sommando il va-


lore di un offset, contenuto in una variabile, ad un displacement,
contenuto in uno degli Index Register (SI o DI).

Formato Assembly:

„ variabile … ´ SI µ
„ variabile … ´ DI µ

Esempio:
C‡/AE ?0GJIL=|?AK ,oV  `FY ‚
82 A.Broggi

Esempio di
Direct Indexed Addressing
La CPU Intel 8086: Architettura e Programmazione Assembly 83

Esempio

Codice per il trasferimento di un vettore in un altro usando il


Direct Indexed Addressing.

CD/AE < Y I ]
CD/AE 1 GJI E V 1 =Ar ,_V0ZAa =qg
W5XBY  CD/FE ?iGJI < / X @ 1 V rE V 1 = < Y ‚
CD/AE `5V <=Fr E V 1 =  < Y ‚ IL?iG
? `F` < Y I R
, /s/AN W3XcY
84 A.Broggi

Base Indexed Addressing

L’Effective Address dell’operando è calcolato come somma dei


seguenti termini:
+
contenuto di uno dei Base Register (BX o BP);
+
contenuto di uno degli Index Register (SI o DI);
+
un displacement contenuto nell’istruzione stessa.

Formato Assembly:
Ÿ
„ variabile … ´ BX µ ´ SI µ
Ÿ
„ variabile … ´ BX µ ´ DI µ
Ÿ
„ variabile … ´ BP µ ´ SI µ
Ÿ
„ variabile … ´ BPµ ´ DI µ

Esempio:
C‡/AE ?0GJIL?0@B@B?BÃLKhG ‚  `AY ‚
La CPU Intel 8086: Architettura e Programmazione Assembly 85

Esempio di Base Indexed Addressing


86 A.Broggi

Segment Register Impiegato

La seguente tabella riassume i vari modi di indirizzamento con il


Segment Register impiegato da ognuno.

Indirizzamento Formato SegReg


Register registro nessuno
Immediate dato nessuno
Direct variabile DS
Register Indirect [BX] DS
[BP] SS
[DI] DS
[SI] DS
Base Relative label [BX] DS
label [BP] SS
Direct Indexed label [DI] DS
label [SI] DS
Base Indexed label [BX] [SI] DS
label [BX] [DI] DS
label [BP] [SI] SS
label [BP] [DI] SS

NB: i segmenti utilizzati possono essere modificati mediante il


prefisso di Segment Override.
La CPU Intel 8086: Architettura e Programmazione Assembly 87

Tempo di esecuzione delle istruzioni

Il tempo richiesto per eseguire un’istruzione si ricava sommando:


+
il tempo di esecuzione vero e proprio (fornito dal costruttore per
ogni diverso impiego di ogni istruzione)
+
l’eventuale calcolo dell’Effective Address.

La seguente tabella mostra i tempi di calcolo dell’Effective Address:


Indirizzamento Clock Esempio
Direct 6 MOV AX, ADDR
Register Indirect 5 MOV AX, [BP]
Base Relative 9 MOV AX, ADDR[BP]
Direct Indexed
BP + DI, BX + SI 7 MOV AX, [BP+DI]
BP + SI, BX + DI 8 MOV AX, [BX+DI]
Base Indexed
BP+DI+Disp, BX+SI+Disp 11 MOV AX, ADDR[BP+DI]
BP+SI+Disp, BX+DI+Disp 12 MOV AX, ADDR[BP+SI]

Il prefisso di Segment Override aggiunge 2 colpi di clock ai tempi


specificati nella tabella.
88 A.Broggi

Esempio: Istruzione MOV

Operandi Clocks Bytes Esempio


byte(word)
reg, reg 2 2 MOV BX,CX
mem, acc 10 (14) 3 MOV MEM_DEST,AL
acc, mem 10 (14) 3 MOV AX,MEM_SOURCE
mem, reg 9 (13) + EA 2-4 MOV MEM_DEST,BX
reg, mem 8 (12) + EA 2-4 MOV BX,MEM_SOURCE
reg, imm 4 2-3 MOV BX,0F6CDh
mem, imm 10 (14) + EA 3-6 MOV MASK,0F6CDh
seg-reg, reg16 2 2 MOV DS,BX
seg-reg, mem16 8 (12) + EA 2-4 MOV DS,SEGMENT_VAL
reg16, seg-reg 2 2 MOV BP,SS
mem, seg-reg 9 (13) + EA 2-4 MOV CODE_VAR,CS

Esempio: Istruzione IDIV

Operandi Clocks Bytes Esempio


reg8 101-112 2 IDIV CL
reg16 165-184 2 IDIV DX
mem8 (107-118) + EA 2-4 IDIV BYTE[SI]
mem16 (175-194) + EA 2-4 IDIV [BX].WORD_ARRAY
La CPU Intel 8086: Architettura e Programmazione Assembly 89

Pseudo-Istruzioni

Le Pseudo-Istruzioni sono comandi per l’assemblatore. Non ven-


gono tradotte in istruzioni macchina, ma sono interpretate come ope-
razioni che l’assemblatore deve compiere al momento dell’assem-
blaggio.

Vi sono circa 60 Pseudo-Istruzioni, ma verranno sommariamente


analizzate solo quelle di uso comune, utilizzando come riferimento
un programma dimostrativo.
90 A.Broggi

LE FUNZIONI MS-DOS

Il Sistema Operativo MS-DOS offre al programmatore assembly


un insieme di funzioni che permettono di eseguire le più comuni ope-
razioni di gestione del sistema, permettendo al programmatore di
trascurare i dettagli relativi all’implementazione a basso livello delle
operazioni richieste. Ad esempio:
+
operazioni di I/O (da tastiera, schermo, stampante);
+
lettura e scrittura su disco;
+
mantenimento del file-system;
+
gestione della configurazione del sistema (data, ora, periferi-
che);
+
allocazione e deallocazione di aree di memoria;

Inoltre, per garantire la portabilità dei programmi su tutte le mac-


chine dotate di MS-DOS prescindendo dall’hardware usato, ogni co-
struttore di hardware fornisce uno strato di software di interfaccia
hw-sw. Questo è detto BIOS (Basic Input Output System) e permette
la gestione a basso livello di:
+
video (modalità grafiche, colori, palette, accensione pixels,... );
+
tastiera, mouse (codice tasti, stato degli shift,... );
+
stampante;
+
dischi (cilindri, tracce, motore,... );
+
porte seriali e parallele.
La CPU Intel 8086: Architettura e Programmazione Assembly 91

Visione Stratificata del Sistema DOS

Livelli superiori

Applicazioni Assembly

DOS

BIOS

Hardware
92 A.Broggi

Accesso alle funzioni DOS e BIOS

Le funzioni DOS sono richiamabili mediante l’istruzione INT


21h, e si distinguono tra loro dal valore presente nel registro AH
al momento della chiamata.

Quasi tutte le funzioni DOS azzerano il Carry Flag (CF) se l’o-


perazione si è conclusa correttamente, mentre lo forzano ad 1 se si
sono verificati degli errori.

L’insieme delle funzioni disponibili varia in funzione della ver-


sione del DOS usata; è auspicabile che l’insieme delle funzioni cor-
rispondente ad una determinata versione contenga gli insiemi delle
funzioni corrispondenti alle versioni precedenti.

Le funzioni BIOS sono richiamabili mediante l’invocazione di un


particolare Interrupt con l’istruzione INT; molte di esse possono for-
nire diversi servizi che si distinguono dal valore presente nel registro
AH al momento della chiamata.

Esempio:
C /FE
D ?3gI ]f¥ t x u.' ` / < p @ - 4Ħ5 .§ž - 4

Y[Z = R"P t › ' w V
p
  
CD/FE ?3gI ] ? t”< %bn—'u.& K Y/ < p› & Å1 - 
 
Y[Z = P ] t - Æ1\69b%p

La CPU Intel 8086: Architettura e Programmazione Assembly 93

Accesso diretto alla memoria video

L’accesso diretto alla memoria video è ovviamente sconsigliato


per problemi di compatibilità; ciononostante, talvolta è richiesto per
motivi di velocità.

Le principali caratteristiche delle diverse modalità video sono:


+
Modalità testo: inizia a B8000, e segue linearmente, carattere e
attributo;
+
Modalità grafica 320 Ç 200, 256 colori: inizia a A0000, e segue
linearmente, 8 bit/pixel;
+
Modalità grafica 640 Ç 480, 16 colori: inizia a A0000, e prosegue
su moduli differenti, 4 bit/pixel; le 4 mappe si accedono con
l’istruzione OUT.
+
Modalità superiori a 256 colori o ’truecolor’: iniziano a A0000,
e proseguono su moduli differenti.
94 A.Broggi

LA FAMIGLIA DI PROCESSORI 80X86

Verranno considerati i seguenti processori:


+
Il processore 8008
+
Il processore 8080
+
Il processore 8085
+
Il processore 8086
+
Il processore 8088
+
Il processore 80286
+
Il processore 80386
+
Il processore 80486
+
Il processore Pentium
+
La tecnologia MMX
La CPU Intel 8086: Architettura e Programmazione Assembly 95

Il processore 8008
+
Progettato del 1971 da Intel Corp.;
+
versione estesa del 4004 (a 4 bit), principalmente usato per i
primi videogiochi;
+
indirizzamento in memoria di 16k bytes;
+
48 istruzioni macchina.
96 A.Broggi

Il processore 8080
+
Introdotto nel 1973;
+
è il primo processore a 8 bit;
+
10 volte più veloce dell’8008;
+
indirizza 64k bytes invece di 16k;
+
utilizzato per il primo personal computer (MITS Altair 8800)
nel 1974.
La CPU Intel 8086: Architettura e Programmazione Assembly 97

Il processore 8085
+
Nato nel 1977;
+
65% più veloce dell’8080;
+
altre case hanno sviluppato processori compatibili con l’8085
(Zilog Z80);
+
l’ultimo processore a 8 bit, venduto in 700 milioni di copie.
98 A.Broggi

Il processore 8086
+
Nato nel 1978;
+
processore a 16 bit;
+
2.5 milioni di istruzioni per secondo (2.5 MIPS);
+
indirizza 1 M Byte di memoria;
+
per la prima volta un processore comprende un’unità di prefet-
ching;
+
include operazioni complesse come la moltiplicazione e la divi-
sione.
La CPU Intel 8086: Architettura e Programmazione Assembly 99

Il processore 8088
+
Nato 1 anno dopo l’8086;
+
l’8086 e l’8088 differiscono in quanto il primo lavora su 16 bit a
livello sia di struttura interna sia di connessioni esterne, mentre
il secondo è un processore esternamente ad 8 bit ed internamente
identico all’8086 (16 bit);
+
l’insieme delle istruzioni riconosciute dall’8086 coincide con
quello dell’8088, portando completa compatibilità;
+
l’8088 è stato affiancato all’8086 perchè rende possibile l’im-
piego di periferici ad 8 bit.
+
nel 1981 IBM include l’8088 nel proprio personal computer.
100 A.Broggi

Il processore 80286
+
Rappresenta l’evoluzione dell’8086, introdotto nel 1983;
+
indirizza 16 M byte di memoria;
+
l’instruction set è praticamente identico a quello dell’8086 a me-
no di poche istruzioni per l’utilizzo dei rimanenti 15 M byte di
memoria;
+
viene introdotta la modalità protetta;
+
4.0 MIPS a 8.0 MHz.
La CPU Intel 8086: Architettura e Programmazione Assembly 101

Il processore 80386
+
Viene introdotto nel 1986;
+
è un grosso passo in avanti rispetto all’80286;
+
è un processore a 32 bit (sia per il bus dei dati sia per l‘accesso
alla memoria);
+
indirizza 4 G byte di memoria;
+
nascono diverse versioni dell’80386: 386SL, 386DX, 386EX,
386SLC,...
+
include istruzioni per il memory management (che i processori
precedenti demandavano completamente al software);
+
è compatibile con i precedenti, quindi può eseguire il codice per
i processori a 16 bit.
102 A.Broggi

Il processore 80486
+
Nel 1989 viene introdotto l’80486;
+
non è molto differente dal precedente se non per l’inclusione
della parte matematica (80387) e di 8 k bytes di cache;
+
funziona a 50 MHz, e arriva a 50 MIPS (50% più veloce dell’80386);
+
anche in questo caso escono versioni diverse: 486SX, 486DX,
486DX2, 486DX4,...
La CPU Intel 8086: Architettura e Programmazione Assembly 103

Il processore Pentium
+
Nasce nel 1993;
+
non viene chiamato 80586 per problemi di copyright su numeri;
+
la prima versione funziona a 60 MHz, e produce 110 MIPS;
+
la cache viene aumentata da 8 a 16 k bytes;
+
il data bus viene portato a 64 bit;
+
la principale caratteristica è la comparsa di una doppia pipeline
per le operazioni su interi;
+
inoltre viene implementata una politica di branch prediction.
104 A.Broggi

La tecnologia MMX
+
Viene introdotta per la prima volta sul processore Pentium;
+
MMX (MultiMedia eXtension) serve per migliorare la gestione
di particolari tipi di dati;
+
con un piccolo aumento dell’area del processore, vengono im-
plementate numerose nuove funzioni (aritmetica a saturazione);
+
i registri MMX registri sono sovrapposti ai registri floating-point;
+
sfrutta modalità di elaborazione SIMD suddividendo i 64 bit in
pacchetti.
La CPU Intel 8086: Architettura e Programmazione Assembly 105

Modalità reale e protetta


+
Il modo di funzionamento del processore visto fin’ora è detto
Modalità reale;
+
Per accedere alla memoria ad indirizzi maggiori di 1 M byte
occorre un nuovo meccanismo, chiamato Modalità protetta.

In modalità protetta esiste ancora il concetto di offset, ma non più


quello di segmento: il registro di segmento contiene un selettore.

Il selettore è usato per selezionare un descrittore in una tablella di


descrittori.

Il descrittore precisa la zona di memoria: segmento, lunghezza, e


diritti di accesso. Quindi il registro di segmento è ancora usato per
selezionare un segmento, ma questa volta in maniera indiretta.

I programmi scritti per funzionare in modalità reale funzionano


ancora anche in modalità protetta, con l’accortezza di inserire il
valore corretto nel descrittore della zona di memoria utilizzata.

Ci sono due tabelle di 8192 descrittori l’una; la prima per de-


scrittori validi per tutti i programmi (Global descriptors), la seconda
per descrittori validi solo per particolari applicazioni (Local descrip-
tors).
106 A.Broggi

CREAZIONE DI UN PROGRAMMA
ASSEMBLY

Il processo di creazione di un programma Assembly passa attra-


verso le seguenti fasi:
+
scrittura, tramite un normale EDITOR, di uno o più file di ca-
ratteri ASCII con estensione .ASM contenenti il programma
sorgente.
+
assemblaggio, tramite un ASSEMBLATORE, dei singoli file sor-
gente, e generazione di altrettanti file oggetto, con estensione
.OBJ.
+
creazione del file eseguibile, con estensione .EXE, tramite un
LINKER.
+
verifica e correzione degli eventuali errori tramite un DEBUG-
GER.
La CPU Intel 8086: Architettura e Programmazione Assembly 107

Suddivisione in moduli differenti

Quando i programmi assumono dimensioni ragguardevoli, risulta


vantaggioso suddividerli in più moduli. I vantaggi che si ottengono
da questa suddivisione sono principalmente:
+
essi possono essere maneggiati con più facilità;
+
quando si modifica un solo modulo è possibile assemblare solo
quel modulo.

Le direttive utilizzate sono:


+
PUBLIC: comunica all’assemblatore di rendere disponibili ad
altri moduli le etichette ad essa associate;
+
EXTERN: viene utilizzata per rendere disponibili nel modulo
corrente le etichette dichiarate pubbliche in altri moduli;
+
GLOBAL: serve per sostituire entrambe le precedenti.

Esempio: file 1

N X K ,_Y 1 ?0@B@B?BÃ ah, / Kh? , ?3@B@q?BÃ  K0Ã = V


?3@B@B?qà ` K P ]>] ?0@B@B?Bà ` K P ]]

Esempio: file 2

V AG = V @ Z ?0@c@q?BÃ  K3ÃF= V a#, / h


K ? , ?0@B@B?BÃ  K5ÃA= V
CD/AE  ?q@c@B?Bà ‚ IL?0G C‡/cE  ?c@B@q?Bà ‚ IL?0G
108 A.Broggi

L’Assemblatore

L’Assemblatore trasforma i file di caratteri contenenti il program-


ma sorgente (.ASM) in altrettanti file oggetto (.OBJ) contenenti il
codice in linguaggio macchina.

Il processo di assemblaggio viene compiuto in due passi:


+
il primo passo definisce il valore dell’offset relativo ad ogni riga
ed ogni simbolo nel codice sorgente;
+
il secondo passo traduce le istruzioni Assembly in istruzioni
macchina e genera il file oggetto.
La CPU Intel 8086: Architettura e Programmazione Assembly 109

Il Linker

Il Linker combina i moduli oggetto e produce un unico file ese-


guibile (.EXE); in particolare:
+
unisce i moduli oggetto, risolvendo i riferimenti a simboli esterni;
+
ricerca i file di libreria contenenti le procedure esterne utilizzate
dai vari moduli;
+
produce un modulo rilocabile ed eseguibile.
Nota: il passo di Linking deve essere effettuato anche se il program-
ma è composto da un solo modulo oggetto.
110 A.Broggi

Il Debugger

Il Debugger è un ambiente di verifica e messa a punto dei pro-


grammi Assembly. Esso permette di:
+
visualizzare, ed eventualmente modificare, il contenuto dei regi-
stri e della memoria;
+
eseguire passo-passo un programma;
+
inserire delle breakpoint in un programma;
+
caricare in memoria file o settori di disco, e viceversa;
+
assemblare e disassemblare un programma.
La CPU Intel 8086: Architettura e Programmazione Assembly 111

Struttura e Documentazione
di un Programma Assembly

Tipicamente un programma Assembly è formato da:


+
il segmento contenente i dati (DATASEG):
contiene le pseudo-istruzioni per l’allocazione delle variabili e
le definizioni delle costanti; i commenti che lo corredano sono
relativi alla spiegazione dei simboli utilizzati;
+
il segmento contenente lo stack (STACKSEG):
è formato da una sola pseudo-istruzione per l’allocazione dello
spazio sufficiente per lo stack del programma; non necessita di
commenti aggiuntivi;
+
il segmento contenente il codice (CODESEG):
è la parte principale del file .ASM e necessita di commenti molto
chiari ed esaurienti; inoltre è consigliabile che tutti utilizzino
una strutturazione standardizzata delle procedure.

Al fine della documentazione delle procedure, esse sono suddivi-


sibili nelle seguenti classi:
+
Procedura principale (o MAIN)
+
Procedure di medio livello
+
Procedure di basso livello
– di interfaccia
– di calcolo
112 A.Broggi

Strutturazione delle procedure

Alcune regole per la standardizzazione della codifica delle proce-


dure sono:
+
Il corpo principale del programma (MAIN) deve essere corto, e
formato esclusivamente da chiamate a procedure; inoltre, deve
comparire come prima procedura all’interno del CODESEG. I
commenti devono servire per individuare lo scopo di ciascuna
chiamata. Le prime 3 righe devono essere sempre presenti per
inserire nello stack l’indirizzo corretto per ritornare al sistema
operativo.
+
Ogni altra procedura deve essere preceduta da un’indicazione
delle operazioni che esegue, dei parametri e delle variabili che
utilizza, dei registri e dei flag che modifica, e infine dei codici di
ritorno che riporta: esempio:
t ȓȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓÈ:È•È ˜
t N
% %4w6 -  ¹)&p£&n—'’9“Ä9“ -j  -  –4>Qˆ j %b’
b j  .9b†: - ]» ÊÉ%ÉÅË
t Ë
t N c ? @c? C V =#@ Y J)k j %Œ %p j j 'u.u - Œ ? , Ë
t E c ? @ Y ?cK YŽ,_Y J)k j .Œnf % 9Š -j  - Œˆ4 .
 jl- )' {9Š –> %)) - )
- u.' Ë
t ` <  Z / =q? U p j j &u%u -  P%I - ) j %wQÌ 9 - 4w .
% jl- )& Ë
tA@ V3aFY <w=q@ YÍX = Y,YbUU ?B= Y  ? , ILKMGI 1 GJId< Y Ë
t 1«/ `AY 1 Y¢`3Y @ Y = / @ Z /‘1 xH‹ ]Œ9“ y)p£ % - u  p:  j & -  -
ŽÄ9“
%
% .99b I Ë
t 1 xH‹P 9“ n"l pL9Š - bvˆ > t w>)& 
bÎ1 xH‹LPI 9“ -  Ë

t ?3g ‹ ]wJ j .Œ‰>Q -  Ë
t ?3g ‹P L9Š -j  - w yˆÌ)' - Ë
t ?3g ‹FR L
-  - “ . j & -  - Ë
t ȓȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓÈ:È•È ˜
La CPU Intel 8086: Architettura e Programmazione Assembly 113

+
Ogni procedura di medio livello deve essere corta e deve servirsi
di altre chiamate a procedura.
+
Le procedure di basso livello devono essere riunite nella parte
finale del codice (meglio se in un modulo differente).
+
Le chiamate agli Interrupt devono essere presenti solo nelle pro-
cedure di basso livello di interfaccia.
114 A.Broggi

APPENDICE A:
Programma di Esempio

= Y = ,_V È V 9b .
& - u –4>‡1 - )
%) -  V ) 


` < V3a < 0 V a C iV Z = N ?A@B? N X K ,oY 1 p ` ?B=q? p


N ? a YŽZ ? VMWAX ]%]

, x VMWFX ] ?

1 @ V\W X ] `

g3= VMWAX ]%É

= Y= / , / ` K p”15/ @c< / 4‡1 ? , 1q/ , ?A= / @ YÏV_,_V =#=q@ / ZBY 1 YÐ p
Y <w=#@ XFUÑY / ZBY ` K 1 @ }I gA=FIgA=FI}gc=FI}gA=FIgA= I 1 @ I pNi j % yˆ - 9 Ð p
1«/ `FY 1 V r =#?F<w= / ` K œ
K YŽZ r C V << ` K 1 @ I , x3I}gA=FIgA=FI p @ -  .9 w - u% K & -  -  Ð p
`5V 1 r C V << ` K 1 @ I , x3I}gc=FI}gA=FI p @ -  .9 .w - u%'6 ` f
 jQ- )&  Ð p
= V @ C YŽZAV ` K 1 @sI , x3I , x3IgA=FI p X 8pp - ) -  . - u%& œ  <  Z ‚ Ð p
` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

C ? YŽZ N @ $/ 1 x2?A@
N X <wg ` < t Y b9 bu%m4 - ) - 9
 - b < V CªN @ V
CD/cE ? GI ]]
0 t - )Q&6
'v4> %Q> -k j j •Ô

N X <wg ?HG t
La CPU Intel 8086: Architettura e Programmazione Assembly 115

1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? UÑY / ZBV


1 Y 1 , / r N @ YZ 1 Y N ? ,_V ‘  1 ? o, , N @ / CON =
1 ? ,o, , V =#= X @q?sr ` ?A= Y
Õ
1 ? ,o, < =q? CN ?sr `FV 1

1 ? ,o, < =q? CN ?sr K YŽZ

1 ? ,o, = V <w=Ar x YŽZ ? ,\V
T.ZAU 1 Y 1 , / r N @ YŽZ 1 Y N ? o , V
@ V = t @ ' - ) <  9Ž jl- /3 % - &nž
C ? YŽZ V_ZA` N

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t N_bz
 f4w - 4Qw'u. - )&u%u - u% t
t t
tA@ V3aFY <=#@ YÍX = YŽ,YbU_U ?c= Y  ?0GJI ` GJI ` < t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@


CD/cE ? GI ` < V3a
0 t Y 'u. - )&&u.u - u% 9• % j %v4 - 
CD/cE ` <ÑI}?cG t :  -j ' –)k• .> 9b ?0G 

CD/cE ?3gsI ]] t < %n^u%& K Y / < p < ÊE34 %vClz4 p

CD/cE ? , I] e t j z4w†: %9b © ]† R ¨ I
)'

Y[Z = P ] t 7 V  - 9“w‰[‰[
 %w –ÄCD/AE ?0GJIe ;

CD/cE ` JG I ] ewP ¨ t Yšj 
 z9 - “ - 7 ` g ;Ï Ê
)'6 - 7 `F, ;

1 ? ,o, < N3/ <w=q?sr 1 X @A< / @ V t CÖn— y)l
9b y %)&) - 9Ê9•
% %)' -

CD/cE ` GJI / x|x«< V = = Y = / , / t”<


%)' –) - Š9 ' - 7` < ` G ;
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ? t Ò
) - 9Š -j  - 

CD/cE ` GJI ]É]É t Yšj z9 - “ - 7 ` g ;Ï Ê


)'6 - 7 `F, ;

1 ? ,o, < 3
N / <w=q?sr 1 X @A< / @ V t CÖn— y)l
9b y %)&) - 9Ê9•
% %)' -
@ V = t @ ' - )) - bz
 .4w -
 -jk- w

Y[ZcYbUÑY ? ,oYUU ? 2
U Y / ZAV VoZA` N

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t Nz
 .4 -  %Ê9Š -j  -  ) j f99 - 'Œw&u% - )& t
t t
tA@ V3aFY <=#@ YÍX = YŽ,YbU_U ?c= Y  ` GJIL?3g t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

N @ / CON = N @ / 1 Z0V ?A@


116 A.Broggi

CD/cE ` GJI / x|x«< V = Y <=#@ X UÕY / ZcY ”t <


 %)& y) - Š9 b - 7 ` <  ` G ;
1 ? ,o, < =q? CN ?sr<w=#@ ŽY ZFa ?
 t Ò) - Š9  -j  - 
@ V = t @ '  - )) -   bz
 .4w -
 -jk- w

N @ / CON = V_Zc` N

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t N_bz
 f4w -  %Ê9“ -j  -  –>Ä j v׉ jQ- v& -  t
t t
t E ?B@ Y ?cK Y,Y J)l> j .Πp j j bu%u - v .)') - )
- u%>6 {1«/ `AY 1 V r=q?F<w= / t
t @ V3aFY <=#@ YÍX = YŽ,YbU_U ?c= Y  ?0GJILK , I 1 GJI ` G
A t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

<>=#? CON ?sr K YŽZ N @ / 1 Z0V ?A@


CD/cE ` GJI / x|x«< V = K YZ r C V <<Øt”<
% %)' ) - 9Š& - 7 ` <  ` G ;
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ? t Ò) - 9Š -j  - 
CD/cE `5, I  1#/ `FY 1 V r}=#?F<= /A‚ t 1 - 
- )Q
z4w
 {4" .)k - 9
CD/cE ` gI ] © t 1i -  4 %Q&9

1 Y 1 , / rK YZ ?B@ Y /J G / @ ? , I? , t ? u%u . - )k“ .9bb ? ,
<"g , `5, I ] P t”< ‰Š , &
% - < & 9 -
 
? ` 1 ? , I}? , t Y  ? , 9ŠQ y)D1 ?A@B@hÃ
1 ? ,o, <=q? CN ?sr ZAX C V @ / t <  -j  - ) -
Ž&‰[ - ' -  -
`5V 1 ` g t ` f
 j  - )l
b -  4 %)m

)
T.ZAU 1 Y 1 , / r}K YŽZ ?c@ Y / t”< ˆ %pL]» % - 8p - ) - n")' -
@ V = t @ ' - )) - bz
 .4w -
 -jk- w

<>=#? CON ?sr K YŽZ V_Zc` N

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t N_bz
 f4w -  %Ê9“ -j  -  –>Ä j v׉ jQ- ’4> f
 jl- )' t
t t
t E ?B@ Y ?cK Y,Y J)l> j .Πp j j bu%u - v .)') - )
- u%>6 {1«/ `AY 1 V r=q?F<w= / t
t @ V3aFY <=#@ YÍX = YŽ,YbU_U ?c= Y  ?0GJILK\GJI ` G
A t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

<>=#? CON ?sr `FV 1 N @ / 1 ZiV ?A@


CD/cE ` GJI / x|x«< V = `5V 1 r C V <<Ùt”<
 ) y) - 9[& - 7 ` <  ` G ;
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ? t Ò) - 9Š -j  - 
CD/cE ? , I  1q/ `AY 1 V r =#?F<w= /c‚ t 1 - 
- )Q
z4w
 –4> %)l - 9Ž
G / @ ?3gsI}?Ag t ? u%u % - )k“ % 9 ?0g
CD/cE K , I] ? t <  - )l4'n— 4w 47 P ] ` .
 jl- )' *;

Y[`AY E K , t ` n^ 9b& “ - — %
CD/cE ` GJI?cG t”< - )&n - •&9)& - Q ` G  %Ê4
1MCON ? , I] ? t 13m9Š - Õ
–) y
 .w' -  -zœ
 
La CPU Intel 8086: Architettura e Programmazione Assembly 117

T K `5XAV r 1 Y x|@ V t < yÎ


Žm9“ I 9 - )' -Œ- n - w
G / @ ?3gsI}?Ag t ? u%u % - )k“ % 9 ?0g
Y[`AY E K , t ` n^ 9b& “ - — %
CD/cE `5, I}?Ag t < - )n - )l•9b)& - Œ `5,   %Ê4>
1 ? ,o, <=q? CN ?sr ZAX C V @ / t <  -j  - ) y
 .w& -  - 9•y  .
 .99 - 
CD/cE ? , I `F, t ` f
&
`5XAV r 1 Y x|@ V  1 ? ,_, <>=q? CON ?sr ZAX C V @ / t <  -j  - ) y4" .
%&
CD/cE ? , I` g t X & - p
1 ? ,o, <=q? CN ?sr ZAX C V @ / t <  -j  - ) »& - p
@ V = t @ '  - )) - bz
 .4w -
 -jk- w

<>=#? CON ?sr `FV 1 V_ZA` N

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t N_bz
 f4w -  %Ê4  % j  -  9• y.

% p - )' -  % - u%& t
t t
tA@ 3 V aFY  < =#@ YÍX = ŽY ,YbU_U ?c= Y  ?0GJI ` G t
t 1«/ `FY 1 Y¢`3Y @ Y = / @ Z / t
t U .†‰) -  ‹ ] È[Ú 8p - )& - £b . - u%& t
t U .†‰) -  ‹ P È[Ú 9
m4 - )Q> -jkjk- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

= V <w=Ar x YŽZ ? ,_V N @ /$1 Z V ?c@


3
CD/cE ` GJI / x|x«< V = = V @ C YŽZcV t”<
% )&& –) - 9“' - 7 ` <  ` G ;
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ? t Ò) - 9Š -j  - 
1 ? ,o, ,ÕV =#= X @q?sr< Z t , . {4 -  - 9' . - 9Š %u - 


1MCON ? , I p8p t CÖz4w'‰Š
- ) x , ? a p U p
@ V = t @ ' - )) - bz
 .4w -
 -jk- w  

= V <w=Ar x YŽZ ? ,_V V_ZA` N

t¡ "                      >                           >                   žt
t¡  Nz
 .4 4Q - 99Œ)nž %)&)&’4k— .‰ -
%
 -  *t
t¡ "                      >                           >                   žt

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t Nz
 .4w -  .Ê9Š -j  -  yˆ j %v4 - ] - É t
t t
t N ?c@c? C V =#@ Y J)k j ’ p j j uu - Œ ? , t
t E ?B@ Y ?cK Y,Y J)l> j .v4> %)&) -  - & - º j j bu%u - vN ? a YŽZ ? t
t @ V3aFY <=#@ YÍX = YŽ,YbU_U ?c= Y  ?0GJI 1 GILK ,
A t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
118 A.Broggi

<>=#? CON ?sr ZBX C V @ / N @ $ / 1 Z3V ?A@


? F ` ` ? , I p}]—p t ,- - 9b –4 -
ŽQ - b'  pQp ]^p
CD/cE ?3gsI ] ? t < .n^u%& K Y / < p ›  Å1 - %p
 
CD/cE KMgI N ? a$YÂZ ? t N - & -Œ- b&n -
CD/cE 1 GJI ]]] P t <  ->j  - Ä9“)v
-  - b %b

Y[Z = P ]

@ V = t @ ' - )) - bz
 .4w -
 -jk- w

<>=#? CON ?sr ZBX C V @ / V_ZA` N

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t Nz
 .4w -  .Ò)  . 4 -  - 9 % - v4> .l - 9Žƒp < pJ†p Z p t
t “&b - 9“)'v4 - n^ .Ò) ( - ) j %v>’4 %m4"6 » - 9 t
t t
tA@ 3 V aFY <=#@ YÍX = YŽ,YbU_U ?c= Y  ?0G t
t 1«/ `FY 1 Y¢`3Y @ Y = / @ Z /J ? , )l
b4&
% ?5< 1 YÂY ) b t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

,V #= = X @q?sr < Z N @ / 1 ZiV ?A@


Z X A
3 / E ?$r ,_V =#= X @B?  C‡/cE ?0gI ]^¥ t”< .nž&u% ` / < p @ - 4¦h .§^ - 4Î1 - 
 
Y[Z = R"P t › ' w V
p
  
/ @ ? , I}R ] t 1inž %b  j &9
%)'

1MCON ? , I p8p t”< –)‘ - 9Žv> j wŒ pQp Z p 9b

T*U x YŽZcV r ,_V =#= X @q? t 4 - )&) - >
% .4w -
1MCON ? , I p}9p t < –>Ä pQp < p I  ) 
T.ZAU Z0X /AE ?$r ,oV =q= X @B? t  - )&
x ŽY ZAV r ,_V =#= X @q?  @ V = t @  - )) - >z
 .4 -
 -"jl- 

,V =#= X @q?sr < Z VZA` N

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t N_bz
 f4w -  %Ê9•z9 -  y)Q
9b t
t t
t N ?c@c? C V =#@ Y J) y
4w& -  4 %)) - z9u%& –4 )m
9 9Š6 j j 'u È t
t u -  y .)Q• 9bb ` G  ` g •& - I `5,
b)& -  t
t E ?B@ Y ?cK Y,Y J)l> j .v4> %)&) -  - & - º j j bu%u - vN ? a YŽZ ? t
tA@ V3aFY <=#@ YÍX = YŽ,YbU_U ?c= Y  ?3gILKMg t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

< N3/ <w=#?sr 1 X @c< / @ V N @ /$1 Z V A


3 ? @
CD/cE KMgI N ? a$ÂY Z ? t N - & - n*4 % - b&n - 
CD/cE ?3gsI ] R t < %n^u%& K Y / < p < Æ1M9

Y[Z = P ] t Nz9b&&8p

@ V = t @ ' - )) - bz
 .4w -
 -jk- w

La CPU Intel 8086: Architettura e Programmazione Assembly 119

< N3/ <w=#?sr 1 X @c< / @ V V_ZA` N

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t N_bz
 f4w -  %Ò)   –> - 9bŒ j j u%u - )ŒÄ1«/ `AY 1 V r =#?F<w= / t
t t
t N ?c@c? C V =#@ Y J)k j ’ p j j uu - ŒÄ1«/ `FY 1 V r =#?F<w= / t
t @ V3aFY <=#@ YÍX = YŽ,YbU_U ?c= Y  ?0G
A t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

,V =#= X @q?sr ` ?c= Y N @ /$1 Z3V A ? @


CD/cE ?3gsI ] P t < %n^u%& ` / < p @ - 4¦5 .§ž - 4Î1 - %p
 
Y[Z = R"P t CÖ j &u%u - )l
-  -  %b - )) - )>
- È

CD/cE  15/ `AY 1 V r=#?F<w= /c‚ I? , t u' Å1«/ `FY 1 V r}=q?F<w= /L
@ V = t @ ' - )) - bz
 .4w -
 -jk- w

,V =#= X @q?sr ` ?c= Y VZA` N

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t Nz
 .4 -  %Ê9Š -j  -   - 9Š'6 - t
t t
t N ?c@c? C V =#@ Y J)&p£&4&&u%u%’4> %)) - 9[' - (º j j uu - Œ ` < ` G t
t @ V3aFY <=#@ YÍX = YŽ,YbU_U ?c= Y  ?3gI ` G
A t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

<>=#? CON ?sr<w=#@ YŽZFa ? N @ / 1 Z3V ?A@


C /cE
D ?3gsI ]É t < %n^u%& ` / < p NH' < &p t ) -

Y[Z = R"P t 9[ -  pJw -  - 4 -v` <  ` G 

@ V = t @ ' - )) - bz
 .4w -
 -jk- w

<>=#? CON ?sr<w=#@ YŽZFa ? V_Zc` N

1 < V3a V ZB` <


o
VZA` C ? YŽZ
120 A.Broggi

APPENDICE B:
Esempio di Documentazione
dell’Istruzione AND

? Zc` , 
- ) ? ZA` x ) - z9‘/ ` Y =Á< U ? NÛ1
]  y  œ   ]

? Zc` 4> .9b& -  I 9b




, 
> 4> f9Ž& - b ™È 4> f9' -  ? ZA` 9“


? c Z `  %b‰Š j 9 -  È § È &Ê)>&


- ) ? ZA`   . -  &%b9Ê % - 49 - 4
9Š .9¢ y• f9b)'ʈ4 .9& - &8 = y% . - Õ49 $j - §× y!H49Ê%Ò§^ .9
 
? ZA` Y 9b6
' , &

` f9' -  < 


 @ .9)&
] ] ]
] P ]
P ] ]
P P P

? Zc` 9“ S9Ò -
'¹(‰¤ –“ .9b)'Ò• P ‰‡ ‰‡ 
bb f9b64wŒ&S9
   
‰‡ y % . - 649 -  P 


/0 % - 49 1 )&z


Ów9
M =  - 69‰[ .9 K §ž f9 V  -j )&
§^ 7•!h46;

“ % 9 % I •  9  e È R ? AZ ` ? , I ` ,


“ % 9 % I  jdj %4w -  ~ È e ȕ~ ? ZA` 1 GJI ] x|x

-

 j ) -  I  jdj %4w -  ~ È RSÈÂe ? ZA` ?0GJI ] P ]]]] P ]
“ % 9 % I j j § É>7 Pfe ; ˜ V ? P R(È:~ ? ZA` 1 GJI C ?F< ¦
j j b§ I “ .9bb . P € 7 R>~ ; ˜ V ? R R(ȕ~ ? ZA` E ? ,_XAV I}K ,
j j b§ I  j‘j .4 -  P ¥ž7 R ¨ ; ˜ V ? R e È:€ ? ZA` <>=#?A= X <8I ] P

La CPU Intel 8086: Architettura e Programmazione Assembly 121

APPENDICE C:
Instruction Set della CPU INTEL 8086

?3?c? ?3< 1 YŽY ? 4ÜÂ69 - ‰Ý % ? 44w'


?3? ` ?5< 1 YÂY ? 4>܎9Ê ‰[ ` n^ 9b&
?3? C ?5< 1 YÂY ? 4>܎9b - ‰[ %ÊCl)'&)§
?3?A< ?5< 1 YŽY ? 4>܎9b - ‰[ % < w -
(&
? ` 1 ? 44ˆ!«' 1 - §

? `F` ? 44&
? Zc` , &
- ) ? ZA`
1 ? ,o, 1 - ))mN8
% .4w
1 K › 1\n— %b K §z y• › 4
1 , 1 1o)& - Æ1 - § x ) - 
1 ,o` 1M)' -  ` &b f
' x ) - 
1 ,_Y 1M)' -  Y w %b È V  - )& x ) - 
1MC1 1M j )& j %wÆ1 - § x ) - 
1MCON 1M j  - 
1MCON < 1o j  -  < &Ä7 K §^ y% › 4;
1MCON <wK 1\ j  -  < b K §ž
1MCON < › 1\ j  -  < & › 4
1 ›{` 1Mnž %b › 4ˆ“ ` >6)& %!#4
` ?A? ` .
% jk- ) ? 4>܎9 - ‰Ý % ? 44w'&
` ?F< ` %
 jk- ) ? 4ÜÂ9b - ‰Ý % < w -
(
`5V 1 ` f
 j %
`3Y E ` &n—&4 I X 69b& .4
V < 1 V 9
- 
g , = g - )'
Y[`AY E Y w % % ` &nž 4w Id< ' f4
Y C XA, Y  . ¹Cl))&§ Id< ' .4
Y[Z Y w K §z – › 4
Y[Z 1 Y 
% j %
Y[Z = Y w w
Y[Z = / Y  .bw¹Ù/0n— %‰“)'!
Y@ V = Y  .bw @ b
T ? T  j  Y ‰ ? n—
T ? V T  j  Y ‰ ? n^ % VoÞ  - )
122 A.Broggi

T K T  j  Y ‰ K )!
T K V T  j  Y ‰ K .)'! % V_Þ  - )
T 1 T  j  Y ‰ª1 - §
T 1 G U T  j ĉÖ1 G @ %&9b . U %
T.V T  j  Y ‰ V_Þ  - )
Tfa T  j  Y ‰ a b -  %
Tfa$V T  j  Y ‰ a  - b .Ò% VoÞ  - )
T., T  j  Y ‰ , .99
T.,\V T  j  Y ‰ , %99Ê V_Þ  - )
T CªN T  j  X 
4'& - )&)&§
T.Z ? T  j  Y ‰ Z > ? nž
T.Z ? V T  j  Y ‰ Z  ? nž % V_Þ  - )
T.Z K T  j  Y ‰ Z  K %)!
T.Z K V T  j  Y ‰ Z  K .)&!  V_Þ  - )
T.Z 1 T  j  Y ‰ Z ×1 - §
T.ZAV T  j  Y ‰ Z " V_Þ  - )
T.ZFa T  j  Y ‰ Z  a  -  
T.ZFa$V T  j  Y ‰ Z > a b -  .Ò% V_Þ  - )
T.ZA, T  j  Y ‰ Z  , .99
T.ZA,_V T  j  Y ‰ Z /B , f9b9Ê  VÞ  - )
T.Z / T  j  Y ‰ Z ×/3nž .‰[)!
T.Z N T  j  Y ‰ Z vN - &§
T.Z < T  j  Y ‰ Z  < &
T.Z U T  j  Y ‰ Z  U .
T / T  j  Y ‰ª/3nž %‰[)&!
T N T  j  Y ‰¤N - &§
T N V T  j  Y ‰ÖN - § V nž .
T N5/ T  j  Y ‰ÖN - b&§/344
T < T  j  Y ‰ < 
T*U T  j  Y ‰ U .b
, ?AgAx ,  - 4 @ 9bb . ?0g ‰ j
,` < ,  - 4ÄN8w % X 9& ` <
,V ? ,  - 4 V ‰[‰[ f
'n— ? 44 .99
,V < ,  - 4ˆNw % X 9 V <
, /s15¦ , 
%Óß K 9

, / ` < ,  - 4 < b7 K §ž  › S4;
, / ` <wK ,  - 4 <  K §^
, / ` < › ,  - 4 < & › 4
, /s/AN , Ä Ù1\
, /s/AN V ,  › )' V_Þ  - )

, /s/AN ZAV ,  › )& Z  VoÞ  - )

, /s/AN Z U ,  › &) Z  U %

, /s/AN U ,  › )' U %

CD/FE Cln— Œ7 K §ž y% › 4;
La CPU Intel 8086: Architettura e Programmazione Assembly 123

CD/FE < Clnž < b7 K §z  › 4;


CD/FE <wK CQnž < '6 K §^
CD/FE < › Cln— < b › 4
C XA, Cl)&&)'§ I X 9b& .4
Z3V0a Z % - 
Z /AN Z ß/5 % - 
Z / = , 
- ) Z / =
/ @ , 
- )‡/ @
/ X = /0wÊ•’N8b
N\/FN N -»› 4ˆ‰ j  <  -


N\/FN x N x ) - z9ω j  <  -


N X <wg N9 › 4b <  -


N X <wgAx N_69 x ) - z9Òb <  -


@ 1 , @  -  y b 1 - § , ‰Ý
 
@ 1 @ @  -  y  1 - § @ & 
  
@ V N @  - 
@ V N V @ % -  › &)& VÞ  - )

@ V N ZAV @  -  › &)& Z  VÞ  - )

@ V N Z U @ % -  › ) Z  U .b

@ V N U @ . -  › ') U .

@ V = @ ˆ‰b j Nz
 f4w
@ / , @  -  , ‰Ý
@ / @ @  -  @ & 

<>?AgAx < b @ %&9b % ?3g —
<>? , < '‰[ ? & j 
, ‰Ý
 
<>?A@ < '‰Š ? & j 
@ & 
  
<>KhK < 6w -
Ê!«' K !

< 1 ?F< <
-  < &7 K §^ % › 4Õ;
< 1 ?F<wK <
-  <  K §z
< 1 ?F< › <
-  < b& › 4
<>g , < '‰[ , 
- ) , %‰Ý

<>gA@ < '‰Š , 
- ) @ ' 
 
<>= 1 < Æ1 - § x ) - 
<>= ` <  ` & .
& x ) - 
<>= Y <  Y  .bw V  - )' x ) - 
<>= / < < b < &7 K §^ y% › 4Õ;
<>= / <wK < > <  K §z
<>= / < › <  < b › 4
< X K < w -

= V <w= = %9b
› ? Y= ›¹- &
G 1 g a V 
-  @ 9bb .9

G , ?A= =  - 9b) - 
G / @ V —
%)&69b&nž Å/ @
124 A.Broggi

APPENDICE D:
Funzioni DOS (INT 21h)

]%] 7]z; = % j  -  N -j



] P 7P ; @ - 4Ħ5 .§^6 - 4Ø1 -  -
 % - 64 V

  
] R 7R ; 1 -  -
 Æ/3w
 
] e 7e ; ? w—&)& - §1 -  -
( % Y 
 
] ~ 7~ ; ? w—&)& - §1 -  -
( %Æ/3b6w
 
] ¨ 7¨ ; N&b .Æ1 -  -
( %Æ/3w
 
] € 7€ ; ` b .
Æ1\9) Å1 -  -
 % Y /
 
]f¥ 7Ý¥; ` b .
Æ1\9) Å1 -  -
 % Y wÊ!0" V

  
] © 7© ; 1\9b) {1 -  -
b . Y wÊ!«' > V

   
]%É 7Éz; N& < b

] ? 7 P ]z; K w‰[‰[ %b f4 Y w

] K 7 PP ; 1 f
Ó <  - 4 - 4 Y w <  - 9
 
]f1 7 P*R ; 1\)& -  Y  K ‰Ý‰[ . I  % Y nžӞ x 

 
] ` 7 Pfe ; `  9Ó @ .9 

] V 7 P.~ ; < %) %
 ` %‰ - )& ` n^

] x 7P ¨ ; /0 . x )& I X 9b& x 1 K 9

P ] 7 Pf€ ; 1\)&z9b x &)& I X 9b& x 1 K 9

P%P 7 P ¥; < - 
‰> x 9¹C - S
& x )' I !|& x 1 K 9
   
PSR 7 Pf© ; < - 
‰> Z —¹C - S
& x ') I !H' x 1 K 9
   
Pe 7 P Éz; ` %)' % x &)& I X 9& x 1 K 9

P~ 7 R ]z; < Þ  % - ) @ - 4 I X 9& x 1 K 9

P ¨ 7 R—P ; < Þ  % - ) › & I X 9b x 1 K 9

P€ 7 RR ; 1\ - b x &)& I z9b x 1 K 9

P ¥ 7 Re ; @ % -j x ') I z9 x 1 K 9

P© 7 R>~ ; @ .9b .n^ f4

P É 7R ¨ ; a Æ1\ .w `  9bÓ

P? 7 R€ ; <  ` 9bÓ =  - 9‰Š % ? 44 .9b9–7 ` =#? ;

PK 7 R ¥>; a % x2?c= Y w‰[ jk- &ˆ‰à1\6b %w ` nž

P 1 7 R ¥; a  xÑ?A= Y w‰Š jl- ̉ <  f
&‰[& .4 ` &nž

P ` 7 R Éz; @ .9 %nž .4

P V 7 e ]z; @ .9 .nž f4

Px 7 ewP ; @ .9 %n^ f4

R ] 7 ezR ; @ .9b .n^ f4

R"P 7 ee ; @ - 4w j @ - 4 I X 9b x 1 K 9

La CPU Intel 8086: Architettura e Programmazione Assembly 125

R%R 7 e~ ; @ - 4w j › b' I X 9b x 1 K 9



Re 7e ¨ ; a  x )' < u% I X 9b x 1 K 9

R ~ 7 e€ ; <  @ - 64w j È:@ f
4 x & %) 4 I X 9 x 1 K 9

R ¨ 7 e ¥; <  Y w %wÊE3 .


R€ 7 e© ; 1\ - b {N -j < % j %w

R ¥ 7 e Éz; @ - 4w j K )
%Ó @ - 4 I X 9 x 1 K 9

R© 7 ~ ]z; @ - 4w j K )
%Ó › ' I X 9& x 1 K 9

R É 7 ~P ; N - 9b x &)& . -j

R? 7 ~^R ; a  < §w9Ž j `5- 

RK 7 ~ze ; <  < §—9 j `5- 

R 1 7 ~~ ; a  < §w9 j =  j

R ` 7~ ¨ ; <  < §ž9b j =  j

R V 7 ~z€ ; < Ê% @ f9 ÊE V @ Y x\à < !h&S

 
Rx 7 ~ ¥; a  `  9bÓ =  - 9Ž‰“  ? 464wb .997 ` =q? ;

e ] 7 ~z© ; a  ` / < E3 %9 Z  j  %

e>P 7 ~ Éz; = . j & - b - 4 <  - § @ .9b4w .w

e.R 7 ¨ ]z; @ .9b .n^ f4

e%e 7¨ P ; a Ê% < %Æ1o) ȚK  - Ó <  - 69

e~ 7¨ R ; @ .9b .n^ f4

e ¨ 7¨ e ; a  Y w %b6wÊE3 %


e%€ 7¨ ~ ; a  `  9bÓ x  % <  -


e ¥ 7 ¨¨ ; @ .9b .n^ f4

e%© 7¨ € ; a Ê% < %Æ1\w§ È ` % .4w .w Y w‰“ jl- &

e É 7 ¨ ¥; 1\ - b ` & .
§Ù7&Cª¦ `FY @ ;

e%? 7¨ © ; @ j n^ `  .
(§Ù7 @ C `FY @ ;

e%K 7 ¨ É; 1 -  `  .
(§Ù7Ý1 g `AY @ ;
 
e 1 7 € ]z; 1\ -  - x )' v7Ý1 @ V ?B= ;

e ` 7 €wP ; /0 % - x ')

e V 7 €zR ; 1\)z9b - x &)& g - 64w)

e%x 7 €e ; @ - 4ˆ‰ j x )& y% ` .nž
 I X 9b& - g - 4)'

~ ] 7 €~ ; › ' y: x &)& –  ` n—&
% I X 9' - g - 64w)&

~P 7€ ¨ ; ` %)' % x &)& v7 XcZA,YŽZ ¦;

~fR 7 €€ ; CQn^ x &)& {N8w %{7 , < ViV ¦$;

~.e 7 € ¥; a Ê% < % x ') ? b&w .971 g C/ ` ;

~%~ ]] 7 €©>È ]z; Y /s1 = ,  a  ` %n—
 Y w‰[ jl- '

~%~ ] P 7 €©>ÈbP ; Y /s1 = ,  <  ` .n^
 Y w‰[ jk- 

~%~ ] R 7 €©>ȚR ; Y /s1 = ,  @ - 4ˆ‰ j 1 -  -
 % ` %n—&
%
 
~%~ ] e 7 €©>È:e ; Y /s1 = ,  › &b •×1 -  -
( % ` .nž

 
~%~ ] ~ 7 €©>ȕ~ ; Y /s1 = ,  @ - 4ˆ‰ j K )&z
%Ó ` .n^


~%~ ] ¨ 7 €©>È ¨ ; Y /s1 = ,  › &b • K )z
Ó ` %nž


~%~ ] € 7 €©>È:€ ; Y /s1 = ,  a  Y 6w <  - 9

~%~ ]z¥ 7 €©>È ¥; Y /s1 = ,  a Æ/5ww <  - 9

~%~ ] © 7 €©>È:© ; Y /s1 = ,  Y 9 ` .nž
 @ j n - )' œ

~%~ ]É 7 €©>È Éz; Y /s1 = ,  Y 9 , 
- ) ` %nž
% @ j b œ

126 A.Broggi

~%~ ] ? 7 €©>ÈbP ]z; Y / 1 = ,  Y 9 g - 64w)& @ j b œ



%~ ~ ] K 7 €©>ÈbPP ; Ys / 1 = , ‘1 -  < -  @ §1\w
  
%~ ~ ] ` 7 €©>ÈPfe ; Y /$1 = ,  a % .&
Y / 1 = , @ Þ  f9

%~ ~ ] V 7 €©>ÈP.~ ; Y / 1 = ,  a % , &
- ) ` nž

%~ ~ ] x 7 €©"ÈP ¨ ; Y / 1 = ,  <  , 
- ) ` 'n—

~ ¨ 7 € Éz; ` )&
- b - x &)& g - 64w) Œ7 ` X N0;

~.€ 7Ý¥>]z; x 
% g - 4w) ` )
- 'á7 x / @ 1 `FX N3;

~ ¥ 7Ý¥ P ; a Æ1\ .w `  %
§

~.© 7Ý¥ R ; ? ))
-  –Cl j §

~ É 7Ý¥ e ; x  . ? ))'z
-  .4Cl j b§

~.? 7Ý¥ ~ ; CQ4'‰[§ÌCl j § ? )&)&z
- 'á7 < V =qK , /$15¦$;

~.K 7Ý¥ ¨ ; ,  - 4 V ž .
%w - N_ -j 7 V G V 1h;

~ 1 7 ¥ € ; = % j & -  - N_z
.99y7 V G Y = ;

~ ` 7¥¥; a  @ bÙ1oz4 y‰ - < z
 f9b97 › ? Y = ;

~ V 7 ¥ © ; x 4 x 9¹C - S
& x ') v7 x YŽZA` x Y @c<w= ;
 
~.x 7Ý¥>Éz; x '64 Z —¹C - S
& x ') Œ7 x YZA` Z3V Gc= ;
 
¨ ] 7 © ]z; @ .9b .n^ f4

¨ P 7 ©wP ; @ .9b .n^ f4

¨ R 7 ©zR ; @ .9b .n^ f4

¨ e 7 ©e ; @ .9b .n^ f4

¨ ~ 7 ©~ ; a ÊE V @ Y x\Ã < 

¨%¨ 7© ¨ ; @ .9b .n^ f4

¨ € 7 ©€ ; @ % -j - x )'

¨ ¥ 7 © ¥; a Ê% < % - x &)& p}9 `5-  - 4 =  j

¨ É 7 © Éz; a  V ^ %64w .4 V b Y w‰“> jl- &

¨ ? 7É]z; 1\ -  X  Þ  x &)&

¨ K 7É P ; 1\ -  Z .! x ')

¨ 1 7&É R ; , z
Ó X )&z
Ó x &)& ?
%
 %99

¨ ` 7'É e ; @ .9 %nž .4

¨ V ]] 7&É ~È ]z; a %¹C -
 Z3->j
 
¨ V ] R 7&É ~ÈÂR ; < %¹N8'b . < 

¨ V ] e 7&É ~Țe ; a %¹Nbw % < 

¨ x ] R 7É ¨ ÈÂR ; a % @ .4&b f
' ,  9 V w§

¨ x ] e 7É ¨ Țe ; @ .4w& .
 ` %n^


¨ x ] ~ 7É ¨ È:~ ; 1 - 
% %) @ f4w& .


€ ] 7É € ; @ .9b .n^ f4

€>P 7É^¥; @ .9b .n^ f4

€.R 7É © ; a ¹N < N ? 44b .99

La CPU Intel 8086: Architettura e Programmazione Assembly 127

APPENDICE E:
Funzioni BIOS

Y[Z = ]%] 7]z; ` & nž4w –§Ì]



[Y Z = ] P 7P ; < &) <  .

[Y Z = ] R 7R ; Z  È C - 9bÓ - )& Y b .w–7 Z C Y ;

[Y Z = ] e 7e ; K b - ӗ&w

[Y Z = ] ~ 7~ ; /0n— b‰Š)&!

[Y Z = ] ¨ 7¨ ; N' <
 . %

[Y Z = ] © 7© ; < §—9 j =  j %

[Y Z = ]%É 7Éz; ¦5 .§^ - 4

[Y Z = P ] 7 Pf€ ; E3 4w % - 64 <
 % % < .n^
 %9

[Y Z = P%P 7 P ¥; @ - 4 VoÞ  j % È ,  9

[Y Z = PSR 7 Pf© ; @ %b¹Cl j § < 'u.

[Y Z = Pe 7 P Éz; `  9bÓ Y / < n—
 .9 IJx )&§ - 64 g - 4 ` &9bÓw9

[Y Z = P~ 7 R ]z; < % - ) Y / < .n^
 .97Ý13 j‘j LNbS9;

[Y Z = P ¨ 7 R—P ; 1 - 9b9  - 4 V ^ %64w .4 < %nž
 .9

[Y Z = P€ 7 RR ; ¦# %§ž - 4 Y / < %nž
 .9

[Y Z = P ¥ 7 Re ; N_&w % Y / < .n^
.9

[Y Z = P© 7 R>~ ; K|?F< Y 1 ,  - 4w . < .bnž


[Y Z = P É 7R ¨ ; K 9b -  ,  - 4w % < %nž
%

[Y Z = P? 7 R€ ; < §—9 j =  j . - 4Î1\)&z
Ó < n—&
 f9

[Y Z = PK 7 R ¥; ¦h %§^ - 4 K b - Ó

[Y Z = P 1 7 R© ; X 9 . =  j % = 


[Y Z = ~.? 7Ý¥ ~ ; X 9b . ? ) -  j

[Y Z = ¥ ] 7 PP*R ; @ - ) Ț=  j {1M)&z


128 A.Broggi

APPENDICE F:
Pseudo-Istruzioni
del MACRO ASSEMBLER

Ô , '  . - ) È 1 -  -
 .à/0 % - >

Ð , z
- &Ù1\w %Æ/0 % - 4
â V wb .99'Ù/0 % - 
ã < Õ9Ž'w ä/0 % - b
  Cl)')&
- &
˜ ? 44w&&Ä  X  - §ÌN_)&9
È < w -
&Ä% X  - b§ÌCl69
 < 
 x & %) 4 È ZA-j {/3 . - 
 ` n^ 9
 < % j .w È /Anž %4w ä/0 % - b
tt C -
%ß1\ jkj %w
™Ú , &b . - ) Ț= —Æ/3 % - 
‚ Y 64w Ä/0 % - >
‹ 1\ -  ? 9b)w < § j )
 P%©€ V  - )& © ] P.©€ Y 69
(9
 R"©€
V  - )' @ - )mCQ4 © ] R©€ Y 9
b9
 R"©€  V  - ) N f
( .4ÄClz4w © ] R©€ Y 9bbÕ
(&69
 R"© ¥ V  - )& © ] R>© ¥ Y 69
(9
 © ] ©€ V  - )& © ] ©€ Y 9bb6
'Õ9
© ] © ¥ V  - )& © ] © ¥ Y 9bb6
'Õ9
? Zc` K !# 9b , 
- ) ? ZA`
?5<< X C V ? 99bz
% -  < % j %wÊ!«& < % j %w @ %9 %

?3= ` ‰[ ? 9b)&w < % j w
K\ÃF= V ? )' < % j .wÊ% ? § K §z ? 44w .99
K\ÃF= V `5-  - = §ž ‰> P §^
1«/FCªC V0Z = V w %¹Cl)& È ,  {1\ jkj %
1«/FCªC/ Z ` %‰[& ä/0nž %) - 6& < . j %wS9
¡1 @ V x V  - )& {1Mbz99 Ț@ %‰[ % .
 ,  9'z9
` K ` ‰[ K §^
`5` ` ‰Š ` ) %!#4
`#W ` ‰[ W  - 4!#4
La CPU Intel 8086: Architettura e Programmazione Assembly 129

` = `  ‰Š& = . È §ž X &


`3› ` %‰[ › 4
`3› / @ ` `5-  - = §— y‰ ~ §z .9
` X N
5 ` )&
-  Å/5

% %6
 .9
V_, < V ? 99 j )' Y ‰ƒ1\Õ4w'& Z ¹Cl 
V_ZA` = % j & -  –Clz4w)
V_ZA`FY x = % j  -  {1\4'& - ) K )z
Ó
V_ZA` C = . j ' -  –C -
Œ% @ % -  K )&

V_ZA` N = % j  -  –Nz
 %4b ` ‰[&&&
V_ZA` < V 4 < . j %wÊ% < 6
b ` ‰[&&&
V\W V_Þ  - ) @ %) - b - )‡/3 % - 
V\WFX 1\ -  < § j )
 V @B@ x >
% V b
 V @B@ P x 
 V b¹4>vN - 99 P
 V @B@BR x 
 V b¹4>vN - 99 R
 V @B@qK V > Y ‰ < ' Y 9 K ) - 6Ó
 V @B@ `FV x V  Y ‰ Z3-j Y 9 ` ‰Š& .4
 V @B@ `AY x V b Y ‰ < '9 ` &‰Ý‰Š %
 V @B@ V V  Y ‰ x - ) 9b
 V @B@ YŽ` Z V b Y ‰ < bz9 ?  Y 4w .w&
- )
 V @B@ Z K V b Y ‰ < b Y 9 Z  K ) - Ó
 V @B@ ZA`FV x V b Y ‰ Z0-j Y 9 Z  ` ‰Š'6 %4
 V @B@ Z U V b Y ‰ = 
V E ViZ ? )'Ä › S4 K 4 - §
V G Y= C YÝjkj %4 -  C -
% V ž&
V GF=q@ Z ` ‰[ V ^ % - )
x2?A@ `5-  - = §— y‰ ,Õ-  %)Q ` &‰Ý‰Š % .w < % j . w
ahV a  -  % = -  V_Þ  - ) @ %) - & - )‡/3 % - 

a @ / X N ` ‰[ < . j .w a 
a = a  -   = -  @ %) -  - )‡/0 % - b

g Ya g @ % g  È /F4w % ©K &9

Yx Y & -  {1\4' - ) K )&z

Y x3P ? 99 j )& Y ‰¤N - 99 P
Y x«R ? 99 j )& Y ‰¤N - 99 R
Y x|K ? 9b9b j )& Y ‰ ?  j % Y 9 K ) - Ó
Y x `FV x ? 99 j ) Y ‰ Z3->j Y 9 ` ‰[ f4
Y x `AY x ? 99 j )& Y ‰ ?  j %9 ` &‰Ý‰Š %
Yx V ? 99 j ) Y ‰ x - ) 9b
Y x YŽ`FZ ? 99b j )& Y ‰ ? b j %wS9 ?  Y 4w %&
- )
Yx Z K ? 99b j 6)' Y ‰ ? b j .w Y 9 Z  K ) - Ó
Y x ZA`FV x ? 99b j )& Y ‰ Z3-j Y 9 Z > ` ‰[& f4
Y[Z 1 ,oXA`FV N_bz
 .99¹1\z4w ‰ j V ž . - ) x &)&
Y@ N ? 99 j )' ä/06
 y‰ Vo-
N -  -j  %

Y @ N31 ? 99 j ) Å/0
% »‰ V_-
1 -  -
 %
 
130 A.Broggi

, A ? K Vi, 1\ -  yE -  - )  ,6-  )


 , ? ,_, ,  9b ? ))mC -
 V w - 9'9
,V , .99 = - Ä% V_Þ  - ) @ %) - b - )‡/0 % - 

,V0ZFa =qg @  , %  ‰ Y  j

 , x 1#/ ZA` , 9 x - ) 9b {1\64w&b - ) 9
 ,8Y <w= @ .9b < >6
 È 134 , &9b&
, /s1 ? , 1\ -  < § j )l‰> X 9 ÄC -

, / › @  , ! È /A4w % ©yK &S9
, = , f99 = -  @ %) -  - )‡/0 . - b

C ? 1 @ / Y ' -  –C -
b ` ‰Š''&
C ?F< ¦ @  - K '¹C - 9bÓ
C V C/ @#à , z
-  9• % j %w - 9Ò) - 9Žà9“ % j %wÊz99)
CD/ ` Clz4w)&9
Z ? C V ? 99 Z3-j »:vCQ4)
Z3V Z  VoÞ  - ) @ ) - & - )‡/06  - 
Z3V ?c@ `5-  - = §^ y‰> ,-  %)Q < -j < % j %w
Z / = K &!#&9 Z / =
/ x|x«< V = /3‰Ý‰“9b ¹ ‰ V — .9b9&
/ @ K '!q&9 , 
- )‡/ @
/ @ a ? 99b& , z
- &Ù1\w 
â / X = ` &9) - § = ž¹4>& ? 99b j )§
N ? a$V ? )'ˆ% R ¨ €>È §z K Õ4 - b§
N ? a$V N -  ä1\wb)l‰ , 9&z9
N ?A@B? ? )&& P€"È §ž K 4 - §
N @ /s1 Y & -  N_bz
 f4w ` ‰Š&
N =q@ 1 -  = §ž –‰‡E -  - )&

N X K ,_Y 1 1M
-  % -  ? )') , &ӗ È ZA-j .4 < % j %9
N X K ,_Y 1 C - ӗ < § j ) ? n - ') - )& »: ? )&)mCQz4w)& .9
N X @ a$V ` %)  {C -
b ` ‰Š&&&
W3› / @ ` `5-  - = §^ y‰> © §^ f9
 @#? `AY G <  Y w @ - 4'
@ V 1#/ @ ` ` ‰Š' @ .
4 = §ž
@ V N = Y 6 -  @ % -  K )&z

 <ž? ,o, < 6b .99 ? )&)mC -
%b V — - 69b& , 9z9
< V0a @ % < % j w¹E - )
< V0a C ViZ = Y &b -  < % j %w ` %‰['&
 <žx 1q/ Zc` <  f99 , 9bb’(‰ x - )9b {1\4'& - ) 9
<>g , < ‰Š , ‰[

<>g / @B= < %9 ,6-  .) =  <>g / @B= = §ž
<>gA@ < '‰[ @  
 
< YbU2V @  K §^ .9 X 9b f4̧ßE - b - )
<>=#? 1h¦ ` ‰[ - <  -
Ó < . j .w
<>=#@ X 1 ` %‰[ < 
b6b = §ž
< X Kh=#= , <  f
'‰[§ , 9' < w)&
La CPU Intel 8086: Architettura e Programmazione Assembly 131

=«K3ÃF= V `5-  - = §^ y‰> P ]†§^ f9


 =hx 1#/ ZA` = )& x - ) 9b {1\64w&b - ) ,  9
=«g Y < 1\ -  ä/0 % - 4 - Æ1\6b %w , 
- 
= Y = ,_V <  .
'‰[§ , &9& = ')&
=Mà N V @  < u –‰ = §—
 =3à N V @ %Cmz4w - 64 <
% y‰ -  V w %99b
›ÒYŽ` =hg @  ›  4—  K 'S9

› / @ ` ? )&ˆ% RÈ §žb –64 - §
› / @ ` `5-  - = §— y‰ R §z .9
 GB? ,o, , 9¹C -
 V — - 9&9 = - ¹N_z4w
% {1\z4w

G 1 @ V x <  .9b9Æ1\z99 Ț@ ‰Š %b %
% , &9b&z9
 G ,oY <w= <  .99 < 
 È 154 , 9
G / @ K !# 9b , 
- ) G / @
132 A.Broggi

APPENDICE G:
Tracce per la Risoluzione
di Alcune Prove Scritte

In questa Appendice sono riportati alcuni segmenti di codice rela-


tivi a problemi assegnati come prove scritte per l’esame di Calcola-
tori Elettronici.

Tali risoluzioni sono da considerare solo a titolo di esempio, in


quanto nella maggioranza dei casi l’enfasi è stata posta sulla modu-
larità e quindi chiarezza del codice, piuttosto che sull’ottimizzazione
degli algoritmi utilizzati.
La CPU Intel 8086: Architettura e Programmazione Assembly 133

CALCOLATORI ELETTRONICI
Prova scritta
6 novembre 1989

Scrivere un programma assembler che visualizzi sullo schermo:


å in alto a destra, il contenuto di una parola di memoria a 16 bit, in formato esadecimale,

å sulla riga successiva il numero dei bit con valore 1 presenti nella parola considerata. Tale
numero deve essere espresso in forma decimale.

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .) € n^ j  P É © É

` < V3a < V0a C ViZ = N ?A@B? N X K ,oY 1 p ` ?B=q? p


, /s1 ? UÑY / ZcV `3› œ
` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
134 A.Broggi

C ? YŽZ N @ $/ 1 x2?A@
N X <wg ` < t Y 9bbu%m4 - ) - 9
 - b < V CªN @ V
CD/cE ?0GI ]] t - )Q&6
'v4> %Q> -jkj •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? UÑY / ZBV
1 ? ,o, N @ V < VHZ =q? Ñ U Y/ AZ V
CD/cE ` gI 
CD/cE `5, I '
1 ? ,o, < N3/ <w=q?sr 1 X A @ < / @ V t NH9&u.' –)Q
9 –9“ .
%4w
t n - )&Q .9 wQ ` g `5,
CD/cE ?0GI , /$1 ? UÑY / ZAV t 1 - &
- )kn - )' {4 - 9“ -j  - 
1 ? ,o, <=q? CN ?sr g V G t”<  -j  - ?iG ̉ jk- Œ 9 - 4w f
>
CD/cE ` gI 
CD/cE `5, I '
1 ? ,o, < N3/ <w=q?sr 1 X @A< / @ V t @ & - 9Š
.
 .99'n -
1 ? ,o, 1 ? , 1#/ , ?sr}K Y = t NH y)k j %v4>QÊ .9b %
t  ?iG  .)Q“ %&9b K\G 
CD/cE ?0GILKMG t 1 - &
- )kn - )&b {4 - 9Š -j  - 
1 ? ,o, <=q? CN ?sr `FV 1 t <  -j  - ?0G ׉ jl- v4> f
 jl- )'
@ V = t @ ' - ) <  9Ž jl- /3 % - &nž
C ? YŽZ V_ZA` N

1 ? , 1#/ , ?$r}K Y = N @ /s1 Z0V ?A@


CD/cE 1 GJIlP€ t 1iw - 
G / @ K\GJILKMG t ? u.u% % - )Q
w -  –4>Q'
1 Y 1 , /L <? , ? , IQP t @  -v- b - nž %9bŒ)D1 - b§
@ 1 , ?3g$IQP t  P€ 'à4" ?0G
? ` 1 KMGI ] t”< y)m1 - b§× p P%I 
 j .w - K\G
, / / N 1 Y1 , /
@ V =
1 ? , 1#/ , ?$r}K Y = V_ZA` N

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@



@ V =
Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV VoZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V ?A@



@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N
La CPU Intel 8086: Architettura e Programmazione Assembly 135

< N3/ <w=#?sr 1 X @c< / @ V N @ /$1 Z3V ?A@



@ V =
< N3/ <w=#?sr 1 X @c< / @ V V_ZA` N

<>=#? CON ?sr g V G N @ /$1 Z3V ?A@



@ V =
<>=#? CON ?sr g V G VoZB` N

<>=#? CON ?sr `FV 1 N @ / 1 ZiV ?A@



@ V =
<>=#? CON ?sr `FV 1 V_ZA` N

1 < V3a VoZB` <


VZA` C ? YŽZ
136 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
24 settembre 1990

Scrivere un programma assembler che accetti da tastiera un carattere e visualizzi sullo schermo:
å il carattere se stampabile,

å il codice ASCII corrispondente.

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .) R ~ 9• b j b P ÉÉ]

` < 3 V a < V0a C ViZ = N ?A@B? N X K ,oY 1 p ` ?B=q? p


` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
La CPU Intel 8086: Architettura e Programmazione Assembly 137

C ? YŽZ N @ $/ 1 x2?A@
N X <wg ` < tY 9bbu%m4 - ) - 9
 - b < V CªN @ V
CD/cE ?0GI ]] t - )Q&6
'v4> %Q> -k
j j •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? UÑY / ZBV
1 ? ,o, N @ V < VHZ =q? UÑY / ZAV
1 ? ,o, ,ÕViaaFY r 1 gA?A@ t ,   –>Î
-  -  . y Ò)ä y ? ,
1 ? ,o, <=q? CN ?sr 1 gc?A@ t”<  ->j  - )l
w %v4 ? ,
1 ? ,o, <=q? CN ?sr< N ? U2Y / t”<  ->j  - ’9Š - u%
1 ? ,o, <=q? CN ?sr `FV 1 t <  -j  - ? , 4> .
% jl- )
@ V = t@ ' - ) <  9Ž jl- /3 % - &nž
C ? YŽZ V_ZA` N

<>=#? CON ?sr `FV 1 N @ / 1 ZiV ?A@


G / @ ?3gsI}?Ag t ? u%u % - )k“ % 9 ?0g
CD/cE K , I] ? t <  - )l4'n— 4w 47 P ] ` .
 jl- )' *;

Y[`AY E K , t` n^ 9b& “ - — %
CD/cE ` GJI?cG t”< - )&n - •&9)& - Q ` G  %Ê4
1MCON ? , I] ? t 13m9Š - Õ
–) y
 .w' -  -zœ
 
T K `5XAV r 1 Y x|@ V t < yÎ
Žm9“ I 9 - )' -Œ- n - w
G / @ ?3gsI}?Ag t ? u%u % - )k“ % 9 ?0g
Y[`AY E K , t` n^ 9b& “ - — %
CD/cE `5, I}?Ag t < - )n - )l•9b)& - Œ `5,  %Ê4>
? `F` ? , I p ]—p t? 44'u.' - ) - - 9 –4 Q j % ?3< 1 YÂY
1 ? ,o, <=q? CN ?sr 1 c g ?A@ t”<  ->j  - ) y
 .w& -  - 9• y f
.99 - '
CD/cE ? , I `F, t ` f
&
`5XAV r 1 Y x|@ V  ? ` ` ? , I p ]^p t ? 44w&u% - ) - - 9 {4> Q j % ?3< 1 YÂY
?
1 ,o, 
< q
= ? CN ?sr 1 cg ?A@ t”<  ->j  - ) y4> f
&
CD/cE ? , I` g t X & - p
? `F` ? , I p ]—p t? 44'u.' - ) - - 9 –4 Q j % ?3< 1 YÂY
1 ? ,o, <=q? CN ?sr 1 c g ?A@ t”<  ->j  - ) » - p
@ V = t@ ' - )) - bz
 .4w -
 -jk- w

<>=#? CON ?sr `FV 1 V_ZA` N

<>=#? CON ?sr 1 gA?A@ N @ /s1 Z3V ?c@


N X <wg ?HG t”< - )n - ?0G
CD/cE ?3gsI ] V t”< . n^u K Y / < p› ' ä1 - %p
 
CD/cE K , I] t N - & -v- b&n -
Y[Z = P ]

No/FN ?0G t @  9& - 0
? G
@ V = t @ ' - )) -   bz
 .4w -
 -jk- w

138 A.Broggi

<>=#? CON ?sr 1 gA?A@ VoZA` N

,V3a$a Y r 1 gA?c@ N @ / 1 Z0V A ? @


C /cE
D ?3gsI ]^¥ t < %n^u%& ` / < p @ - 4¦5 .§ž - 4Î1 - 
 
Y[Z = R"P t › ' w V
p
  
@ V = t @ ' - )) -   bz
 .4w -
 -jk- w

,V3a$a Y r 1 gA?c@ V_Zc` N

<>=#? CON ?sr< N ? UÑY / N @ /s1 Z V ?c@


3
N X < w g H
? G t”< - )n - ?0G
CD/cE ? , I p p t 1 - 
-  ? ,  )l
b4&
% 4Öpp
1 ? ,o, <=q? CN ?sr 1 gc?A@ t”<  ->j  - ? ,
No/FN ?0G t @ 9& - 0? G
@ V =
<>=#? CON ?sr< N ? UÑY / VoZA` N

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@



@ V =
Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV VoZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V ?A@



@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N

1 < V3a V ZB` <


o
VZA` C ? YŽZ
La CPU Intel 8086: Architettura e Programmazione Assembly 139

CALCOLATORI ELETTRONICI
Prova scritta
22 ottobre 1990

Scrivere un programma in assembler che accetti da tastiera un numero positivo di 4 cifre in


codice binario e che visualizzi sullo schermo:
å Il numero stesso in codice binario.

å Il suo quadrato sempre in codice binario.

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .) R%R  P ÉÉ]

` < 3 V a < V0a C ViZ = N ?A@B? N X K ,oY 1 p ` ?B=q? p


` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
140 A.Broggi

C ? YŽZ N @ $/ 1 x2?A@
N X <wg ` < t Y b9 bu%m4 - ) - 9
 - b < V CªN @ V
CD/cE ?0GI ]] t - )Q&6
'v4> %Q> -jkj •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? Ñ U Y / ZBV
1 ? ,o, N @ V < VHZ =q? U Y / ZAV
Ñ
1 ? ,o, ,ÕViaaFY r ZAX C V @ / t Y )Q j %Œ) (Œn -  ? ,
1 ? ,o, <=q? CN ?sr K ŽY Z t <  -j  - )k
b .w’4 ? ,
C XA, ? , t 1 - )&
%) - ) Þ  - 4 - 
1 ? ,o, <=q? CN ?sr K ŽY Z t <  -j  - )k
b .w’4 ? ,
@ V = t @ ' - ) <  9Ž jl- /3 % - &nž
C ? YŽZ V_ZA` N

<>=#? CON ?sr K YŽZ N @ / 1 Z0V ?A@


CD/cE 1 GJI ] © t 1i - b –4 Q&9

1 Y 1 , / rK YZ ?B@ Y /J G / @ ?3gI?Ag t ? u%u . - )k“ . 9 ?0g
<"g , ? , I] P ”t < '‰Ý , 
 - < '9bb -
 
? ` 1 ?3gI?Ag t Y  ?0g 9•Q )Q1 ?A@B@qÃ
1 ? ,o, <=q? CN ?sr 1 Y x|@B? ”t <  ->j  - ) -
'‰[ - > -  -  0
? g
, / / N 1 Y 1 , / rK YZ B
? @ Y/ t Y  . - ‰& -
{1 G$‹ ]

@ V = t @ '  - )) - bz
 .4w -
 -jk- w

<>=#? CON ?sr K YŽZ V_Zc` N

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@



@ V =
Y[ZcYbUÑY ? o
, YUU ? U2Y / ZAV VoZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V ?A@



@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N

,V3a$a Y r ZAX C V @ / N @ /s1 Z3V ?c@



@ V =
,V3a$a Y r ZAX C V @ / VoZA` N
La CPU Intel 8086: Architettura e Programmazione Assembly 141

<>=#? CON ?sr 1 Y x«@B? N @ /s1 Z3V ?c@



@ V =
<>=#? CON ?sr 1 Y x«@B? VoZA` N

1 < V3a V ZB` <


o
VZA` C ? YŽZ
142 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
3 giugno 1991

Scrivere un programma in assembler che:


å Accetti da tastiera una sequenza di numeri (max 60) e la visualizzi sullo schermo.

å Accetti una sequenza di tre numeri e la visualizzi sullo schermo.

å Verifichi quante volte la sequenza dei tre numeri compare nella prima sequenza e stampi il
risultato.

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .) e &6 P ÉÉ P

` < 3 V a < 0 V a C ViZ = N ?A@B? N X K o , Y 1 p` B ? =q? p


V_Z = V @ VMWAX P e
C ?cGr ,\XcZFa g V\W X € ]
< V3W XcViZ U ? r P ` K C B ? Gr ,_XAZAa g h ` X Nq7 œ ; t < Þ  %u - 4"mC c
? Gr ,_XAZAa g  j %b
< V3W XcViZ U ? rR ` K e ` X NB7 œ ;
5 t < Þ % u - 4> e  j % b
,XAZFa gsr N @ Y C ?$r <w=q@ `3› œ t ,  %u.u - b jl- 9“b  -

` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p
La CPU Intel 8086: Architettura e Programmazione Assembly 143

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

C ? YŽZ N @ $/ 1 x2?A@
N X <wg ` < t Y 9bbu%m4 - ) - 9
 - b < V CªN @ V
CD/cE ?0GI ]] t - )Q&6
'v4> %Q> -jkj •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? UÑY / ZBV
1 ? ,o, N @ V < VHZ =q? UÑY / ZAV
1 ? ,o, ,ÕV =#= X @q?sr P t , .> –) -  jk- 9['6 -
1 ? ,o, ,ÕV #
= = X q
@ s
? 
r R t , .> –) - 9• .
4 - 9Š& -
1 ? ,o, 1«/ Z x|@ / Z = / t 13w‰[b - ) 4> {9[& – ¢

t )l•&9)& - v ?0G
1 ? o , , <=q? CN ?sr ZAX C V @ / t <  -j  - )Q
w bß4> ?iG
@ V = t @ ' - ) <  9Ž jl- /3 % - &nž
C ? YŽZ V_ZA` N

,V =#= X @q?srP N @ /$1 ZiV ?A@


CD/cE K GJI ]
\ t ? u%u.  - ) - )w .u%u -

1 Y 1 , /L 1 ? ,_, , V3asa V r 1 gA?c@
 t , % Ä
-  - b % –4 -  - 9' . -
t Ò)ä -  ? , 
1MCON ? , I V_Z = V @ t , ’
Žw‰“b -
Ž V_Z = V @
T*U x YŽZcV r ,_V =#= X @q? t 9“ y %p VZ = V @ : % j & - ) - )  -
CD/cE  < V5WAXAV0ZFU ?sr P ˜ K5G ‚ IL? , t CÖ j uu - )l
-  -  %
Y[Z 1 KMG t Y 6
 j .w - ) - )— %u.u -

1MCON KMGJI C ?cGsr ,_XAZFa g t 10w‰“b - L9• yÄ9“Q pJ - &w -
T.ZAU 1 Y1 , / t ) -äj$- Ì)w .uu - I • %' % -

x YŽZAV r ,_V =#= X @q?  CD/FE ,XAZFa s
g r @
N YC s
? r}<=q@ ILK\G
@ V =
,V =#= X @q?srP VZA` N

,V =#= X @q?sr R N @ /$1 ZiV ?A@


1 ? ,o, ,ÕViaa V r 1 gA?A@ t , . Ä
-  -  %  Ò)ä y ? ,
CD/cE  < V5WAXAV0ZFU ?srR ˜ >] ‚ LI ? , t CÖ j 'u.u - )Q
-  - b %b
1 ? ,o, ,ÕViaa V r 1 gA?A@ t , . Ä
-  -  %  Ò)ä y ? ,
CD/cE  < V5WAXAV0ZFU ?srR ˜ P ‚ L I ? , t CÖ j 'u.u - )Q
-  - b %b
1 ? ,o, ,ÕViaa V r 1 gA?A@ t , . Ä
-  -  %  Ò)ä y ? ,
CD/cE  < V5WAXAV0ZFU ?srR ˜ R ‚ L I ? , t CÖ j 'u.u - )Q
-  - b %b
@ V =
,V =#= X @q?sr R VZA` N
144 A.Broggi

1«/ Z x|@ / Z = / N @ /$1 ZiV ?A@


CD/cE ?0GI ] t Z  j %v4>Q•
 %u%
CD/cE 1 GJI ,6XcZFa gsr N @ Y C ?sr<w=#@ t Z  j .v4>m
-  -  .m4 -
Žw‰“
< X K 1 GJIdR t Z  j %v4m
w‰[bm4 - b9b .&b
CD/cE K\GJI / x|x«< V = < V5W XBV0Z U ?$r P
1 Y 1 , / r 1q/ Z x«@ / Z = / CD/AE ` GJI › / @ ` N =q@  < V3WFXAViZ U ?sr}R ‚
1MCON ` GsIm K0G ‚ t 1i‰[w -  j  R §ž .9
T.ZAU Z / Z r XAasX ? ,Y t”< - ) - 9“ Î9Šv> - )'
CD/cE ` gIm < V3WFXAViZ U ?sr}R ˜ R ‚
1MCON ` g$Im K0G ˜ R ‚ t 1iw‰Šw - )‘• %u.Œ§žb
T.ZAU Z / Z r XAasX ? ,Y t”< - ) - 9“ Î9Šv> - )'
Y[Z 1 ?0G t Y 
b j %w - )k j .v4>Q“
b %u.
Z / Z rA X a$X ? ,_Y  Y[Z 1 KMG t ? n - u - ) - 9•
- Õ9 –4> < V5WAXAV0Z U ?$rP
, / / N 1 Y 1 , / r 1q/ Z x|@ / Z = / t 1i - ‰& -
Å1 GF‹ ]

@ V =
1«/ Z |x @ / Z = / V_ZA` N

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@



@ V =
Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV VoZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V ?A@



@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N

<>=#? CON ?sr ZBX C V @ / N @ /$1 Z3V ?A@



@ V =
<>=#? CON ?sr ZBX C V @ / V_ZA` N

,V3a$a$V r 1 gA?B@ N @ /$1 Z0V ?A@



@ V =
,V3a$a$V r 1 gA?B@ V_ZA` N

1 < V3a V ZB` <


o
VZA` C ? YŽZ
La CPU Intel 8086: Architettura e Programmazione Assembly 145

CALCOLATORI ELETTRONICI
Prova scritta
17 luglio 1991

Scrivere un programma in assembler che:


å Accetti da tastiera una parola di 16 bit nella sua rappresentazione esadecimale.

å Visualizzi sullo schermo la rappresentazione esadecimale delle 16 configurazioni che si ot-


tengono facendo circolare il dato precedente in un registro di 16 posizioni richiuso su se
stesso.

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .) P ¥Å)—) P ÉÉ P

` < 3 V a < V0a C ViZ = N ?A@B? N X K ,oY 1 p ` ?B=q? p


` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p
146 A.Broggi

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

C ? YŽZ N @ /$1 x2?A@


N X <wg ` < t Y b9 bu%m4 - ) - 9
 - b < V CªN @ V
C /cE
D ?0GI ]] t - )Q&6
'v4> %Q> -jkj •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? UÑY / ZBV
1 ? ,o, N @ V < VHZ =q? UÑY / ZAV
?
1 ,o, ,ÕViaaFY r N ?A@ / , ? t , % y) -  - ) - ¢) -  – ?0G
CD/cE 1 GJIlP€ t 1iw - 
1 Y 1 , / r N @ Y Z 1 Y N ? ,_V LN X <wg 1 G t < - )'n - 1 G
1 ? ,o, <=q? CN ?sr g V G t”<  -j  - )k
 .wv4 ?0G
<"? , ? , I'P t < '‰[ - 9Šˆ4> ? ,

@ 1 , ?3g$IP t @  -  - 9Šˆ4> ?0g 7)‡1 - §
t “ %w -  %)Q>& j ß9“''‰Ž
? ` 1 ? , I ] t Y )‡1 - §Ì4> ?3g •& %w -  ? ,
No/FN 1 G t @ '9bb - 1 G
, / / N 1 Y 1 , / r N @ YŽZ 1 Y N ? ,_V
@ V = t @ ' - ) <  9Ž jl- /3 % - &nž
C ? YŽZ V_ZA` N

,V3a$a Y r N ?A@ / , ? N @ $
/ 1 Z3V B? @
1 ? ,o, , ViaaFY r#
Õ = ?F<w= / t ,   –4 -  - 9b  - ¢ y ? ,
N X <wg ? G
H t”< - )n - ?0G
1 ? ,o, ,ÕiV aaFY r#= ?F<w= / t ,  –4 -  - 9b  - ¢ y ? ,
No/FN KMG t N«  K ,  )‘ - 9Œ f
 %4 w
CD/cE 1 , IJ~
<"g , K , I 1 , ”t < 9b -  % ~ 'Ê8pL9•''‰Ž
t )Q
z4w
 {4" %)Q j † - 9
/ @ K , IL? , t N|  K , J4"6 
b4&
%
N X <wg KoG t”< - )n— y)l j Œ§ž Œ7 K , ;
1 ? ,o, ,ÕViaaFY r =#?F<w= / t ,  –4 -  - 9b  - ¢ y ? ,
N X <wg ?HG t”< - )n - ?0G
1 ? ,o, ,ÕViaaFY r =#?F<w= / t ,  –4 -  - 9b  - ¢ y ? ,
No/FN KMG t N«  K , )‘ - 9Œ f
 %4 w
CD/cE 1 , IJ~
<"g , K , I 1 , t”< 9b -  % ~ 'Ê8pL9•''‰Ž
t )Q
z4w
 {4" %)Q j † - 9
/ @ ? , ILK , t N|  ? , 4 {
Žz4w

No/FN KMG t @ 9 - KMG
CD/cE ?3gsILK , t N«  ?0G  ~
z4w

La CPU Intel 8086: Architettura e Programmazione Assembly 147

@ V =
,V3a$a Y r N ?A@ / , ? V_Zc` N

<>=#? CON ?sr g V G N @ /$1 Z3V ?A@


N X w < g ?HG t”< - )n - ?0G
CD/cE ? , IL?0g t N| . -  -  %¹9Š -j  -  ?3g
1 ? ,o, <=q? CN ?sr g V Gr ? , t”<  -j  - ? , Ì b9 -  4 .
 jk- &)
No/FN ?0G t @ 9& - ?0G
N X <wg ?HG t @ &9 - )n - ?HG
1 ? ,o, <=q? CN ?sr g V Gr ? , t”<  -j  - ? ,
?
1 ,o, <=q? C N
 s
? r =
V Z V
i @ t”< 6z9Ž - )l
b9b - )) - “ - •9 
%

No/FN ?0G t @ 9& - ?0G
@ V =
<>=#? CON ?sr g V G VoZB` N

<>=#? CON ?sr g V Gr? , N @ /$1 Z3V ?A@


N X w < g ?HG t”< - )n - ?0G
CD/cE 1 , I~ t N|b - '»¥ € ¨ ~ 4 ? ,  e.R—P ]
<"gA@ ? , I1 , t  %4’]» .k&Æ¥ € ¨ ~
1 ? ,o, <=q? CN ?sr ZAX C V @ / t <  -j  - )l j .bv ? ,
No/FN ?0G t @ 9& - ?0G
? ZA` ? , I ]]]] PPPP t C - b % 9“)&v>& e.R—P ]Œ4 ? ,
1 ? ,o, <=q? CN ?sr ZAX C V @ / t <  -j  - )l j .bv ? ,
@ V = t @ '  - )) - bz
 .4w -
 -jk- w

<>=#? CON ?sr g V Gr? , VoZc` N

<>=#? CON ?sr ZBX C V @ / N @ $ / 1 Z3V ?A@


N X <wg ?HG t”< - )n - ?0G
? `F` ? , I p ]—p t ? 44'u.' - ) - - 9 –4 Q j % ?3< 1 YÂY
1MCON ? , I p ɗp ˜ P t”<  p j & –4>mÉ I
T 1 1 Y x|@q?sr ` V 1 t 9 - )& -Œ- 1 Y x|@q?sr `FV 1
? `F` ? , I p ? p È p}Éwp ÈP t ? )' j % - '69 -  %Ê) ») ( .b
1 Y x|@B?sr `FV 1A C¤/cE ?0gI ] V t”< %bn—u K Y / < p › & Å1 - %p
 
CD/cE K , I] t N - & -v- b&n -
Y[Z = P ]

No/FN ?0G t @  9& - 0
? G
@ V = t @ ' - )) -   bz
 .4w -
 -jk- w

<>=#? CON ?sr ZBX C V @ / V_ZA` N
148 A.Broggi

,V3a$a Y r =#?F<w= / N @ /s1 Z0V ?A@


1 Y 1 , / r\
, V =q= X B
@ ?  CD/FE ?3g$I ]^¥ t < %nž&u.' ` / < p @ - 4ˆ¦h %§— - 4Ø1 - 
 
Y[Z = R"P t › ' w V
p
  
1MCON ? , I p}]wp t”<  p j ' –4>ƒp ]—p
T 1 1 Y 1 , / r ,oV =q= X @B? t - ))& - “&)& % y)Q
-  - b .
1MCON ? , I p}Éwp ˜ P t”<  pL
b j 6b .9b†: - p ]—pJ »p ɗp
T 1 x YŽZcV r ,oV =q= X @B? t - ))& - “ . j & - ) - ) (b -
1MCON ? , Ip? p t”<  p Ú p}ÉwpJ ™ p ? p
T 1 1 Y 1 , / r ,oV =q= X @B? t - ))& - “&)& % y)Q
-  - b .
1MCON ? , Ipx p˜ P t”<  p js- & 4>ƒp x p
T.Z 1 1 Y 1 , / r ,oV =q= X @c? t - )') - •&)& . )k
-  - b %
x YŽZAV r ,_V =#= X @q?  < X K ? , I p ]—p t = )' vp ]žp
1MCON ? , IQP ] t”< y p j & –y - )& - É
T 1 1 Y x|@q?sr ` V 1 Y C ? ,\V t • % j & - ) - )  -
< X K ? , I p ? p È p}Éwp ÈP t ? )' j %wQ)Œ>b -  %)Q - 
1 Y x|@B?sr `FV 1 Y C ? ,oV  @ V =
,V3a$a Y r =#?F<w= / V_ZA` N

<>=#? CON ?sr VHZ = V @ N @ /$1 Z0V ?A@



@ V =
<>=#? CON ?sr VHZ = V @ V_ZA` N

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@



@ V =
Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV VoZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V ?A@



@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N

1 < V3a V ZB` <


o
VZA` C ? YŽZ
La CPU Intel 8086: Architettura e Programmazione Assembly 149

CALCOLATORI ELETTRONICI
Prova scritta
29 luglio 1991

Scrivere un programma in assembler che:


å Accetti da tastiera numeri positivi e negativi di 4 cifre piu‘ segno.

å Stampi su schermo la lista di numeri inseriti in ordine crescente.

Il programma deve operare nel seguente modo:

1. Presentarsi.

2. Richiedere se si vuole:
å inserire un numero,
å stampare la lista ordinata dei numeri già inseriti,
å uscire dal programma.

3. Ritornare, se del caso, al punto 2.

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .) R Ɇ)—) P ÉÉ P

` < 3 V a < V0a C ViZ = N ?A@B? N X K ,oY 1 p ` ?B=q? p


C ?cGr ZAX C r E ? , / @ Y V\W X P ]]
,XAZFa gsr E ? , / @ V V\WFX ¥
V_Z = V @ V WAX
M P e
,YŽZAV x V0VH` V WFX
\ P ]
C V <<Ñr YŽZ < V @ Y C V0Z = / ` K V Z = V @$I ,ŽY ZAV x V0i
 V ` I pY 6
 9b %b y)k j % Ð p
150 A.Broggi

Y <w=#@ XFUÑY / ZBY ` K VZ = V @$I ,YŽZAV x V0Vi` I ,YŽZAV x V0Vi`


` K p N| j   P  .Ò9 .&b –n—Œn - ) I p
` K VoZ = V @ I ,6YŽZcV x V0Vi`
` K p R  %¹9Š -j  -  y) - )'9b - 4 %Q j %  I p
` K VoZ = V @ I ,6YŽZcV x V0Vi`
` K p e  %Ê9
%' {4 - )Q -j‘jl- 'p
,YŽZAV ?$r E X / =#? ` K V_Z = V @$I ,YŽZcV x ViV0` I p Ð p
E ? , / @ Y ` K C ?cGr ZAX C r E ? , / @ YÏ`5X Nq7bp œ*œ>œ*œ*œ p I VoZ = V @ I ,YZAV x ViVi` ;
Z3X C r E ? , / @ Y ` K œ
` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

C ? YŽZ N @ /$1 x2?A@


N X <wg ` < t Y 9bbu%m4 - ) - 9
 - b < V CªN @ V
C /cE
D ?0GI ]] t - )Q&6
'v4> %Q> -jkj •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? UÑY / ZBV
1 ? ,o, N @ V < VHZ =q? UÑY / ZAV
CD/cE ` GJI / x|x«< V = Y <w=#@ X UÑY / ZcY t”<  -j  - ) »}9Âu.'
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ?
1 Y 1 , / r N @ Y Z 1 Y N ? ,_V ‘1 ? ,o, ,ÕViaa Y r}< 1 VH, =#? t , . ) - 9•
%)& - 4 -  - 9 % -
t Ò )‘• 96) - Œ ? ,
1MCON ? , I pP p t”< )k - 9bv> %pQp P p I
T.ZAU Z / r YZ < V @ Y C V0Z = / t - )') - 9 - )' -
1 ? ,o, Y[Z < V @ Y C V0Z = / t N«bz
% .4w - 4"Q9b .b j .w
1 ? ,o, / @ `AYZ ? C ViZ = / t NHb
% .4w - 4>Q%4w& -j %
CD/cE ` GJI / x|x«< V = Y <w=#@ X UÑY / ZcY t”<  -j  - ) »}9Âu.'
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ?
T CON 1 Y 1 , / r N @ YŽZ 1 Y N ? ,\V
Z / r YŽZ < V @ Y C i
V Z = / 1MCON ? , I pR p t”< –)‘ - 9Žv>Ä pQp R p I
La CPU Intel 8086: Architettura e Programmazione Assembly 151

T.ZAU X < 1 Y =#? t - )&)& - 9b



1 ? ,o, <=q? CN ?sr ,Y <w=q?
CD/cE ` GJI / x|x«< V = Y <w=#@ X Ñ U Y / ZcY t”<  -j  - ) »}9Âu.'
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ?
T CON 1 Y 1 , / r N @ YŽZ 1 Y N ? ,\V t @  - )m
Ž
)&vb
%' - )
X < 1 Y =q?  @ V = t @ '  - ) < & 9b jk- /0 % - 'n—
C ? YŽZ V_ZA` N

,V3a$a Y r< 1 V0, =q? N @ $ / 1 Z0V ?A@


Z3X /AE ?$r ,_V =#= X @B?  C‡/cE ?0gI ] © t”< .nž&u% ` / < p @ - 4¦h .§^ - 4Î1 - 
 
Y[Z = "
R P t › ' w V
p
  
1MCON ? , IpP p t 1ib)) - )k -  >L9• y p
T 1 Z0X /AE ?sr ,_V =#= X c @ ? t
Ž j  .9b†: - p P pJ »p e p I - )&)& -
1MCON ? , Ipe p˜ P t 9
 I - )' j .wQ“' -
T.Z 1 Z3X /cE ?sr ,\V =q= X B@ ? t -yZiX /FE ?sr ,oV =q= X @c?
@ V =
,V3a$a Y r< 1 V0, =q? V_ZA` N

Y[Z < V @ Y C ViZ = / N @ /s1 Z V ?A@


0
CD/cE K , Im ZBX C r E ? , / @ Y ‚
1MCON K , I C ?cGr ZcX C r E ? , / @ Y t”< y)l j %b’4>Qn - )'Q p
T*U x YŽZcV r YŽZ < V @ Y C ViZ = / t :Œ b) n -  I b9
 9•&
CD/cE ` GJI / x|x«< V = C V <<Õr YŽZ < V @ Y C ViZ = /
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ?
CD/cE ? , I ,XAZAa g$r E ? , / @ V
C XA, K ,
? `F` ?iGJI / x|x«< V = E ? , / @ Y
CD/cE K\GJIL?0G t N«w -Œ- )Q j Œn - )& yn"
1 ? ,o, ,ÕViaaFY r}< V3a Z / t , % )k9“ .Œ ¢)† y ? ,
CD/cE  KiG ‚ IL? , t ,  j j &u.u -
CD/cE 1 GJI~ t Z  j %b’4Q
'‰Š
1 Y 1 , / r YŽZ < V @ Y CÒ Y[Z 1 K\G t ? ' - )kw - >
1 ? ,o, ,ÕViaaFY r 1 Y x|@B? t ,  –> -
'‰[ -  j %
-
CD/cE  KiG ‚ IL? , t CÖ j &u.u - ) -
Ž&‰[ -
, / / N 1 Y 1 , / r YŽZ < V @ Y C t 1iw& - ‰' -
{1 G$‹ ]

Y[Z 1 K\ÃF= V N =q@  ZqX C r E ? , / @ Y ‚ t ? & - )l j .’4"Qn - )&
x YŽZAV r YŽZ < V @ Y C VHZ = /J @ V =
[Y Z < V @ Y C ViZ = / V_ZA` N

,V3a$a Y r< 0
V a$Z / N @ / 1 Z3V ?A@
Z3X /AE$/ r < V3a Z /J CD/AE ?0gsI ] © t”< .n^u ` / < p @ - 4Ħ5 .§^6 - 4Ø1 - 
 
152 A.Broggi

Y[Z = R"P t › ' w V


p
  
1MCON ? , Ip˜ p t 10w)') - 9• y)Q
-  - b %  pQp ˜ p
T*U x YŽZcV r< V3a Z / t 9“ )ä %p“ . j & - 
1MCON ? , IpÈ p t 10w)') - 9“ )l
-  -   – pQp È p
T.ZAU Z0X /AE$/ r< V0a$Z / t 9Š ˆ)† p I •& 
x YŽZAV r}< V0a$Z /L N X <wg ?0G t < - )n - )l“ % 9 ?iG
CD/cE ?3gsI ] R t < %n^u%& ` / < p”1 -  -
 %à/3w%p
 
CD/cE `5, IL? , t 1 -  - b . 4 - 9[ -j  - b
Y[Z = R"P

No/FN ?0G t @ 9& - )Q
w 6w’4> ?iG
@ V =
,V3a$a Y r < 0
V a$Z / VoZA` N

,V3a$a Y r 1 Y |
x @B? N @ / 1 Z0V ?A@
Z3X /AE ?$r 1 Y x|@B?  C‡/AE ?igI ] © t”< % bn—u ` / < p @ - 4Ħ5 %§ž - 4Ø1 - 
 
Y[Z = R"P t › ' w V
p
  
1MCON ? , I p}]wp t 1ib)) - )k -  >L9• y p
T 1 Z X /AE ?sr 1 Y x|@B?
0 t
 j  f9b†: - p ]^pJ p ɞp I - )&)& -
1MCON ? , I p}Éwp ˜ P t 9
 I - )' j .wQ“' -
T.Z 1 Z3X /cE ?sr 1 Y x|@c? t -Z0X /cE ?sr 1 Y x«@B?
N X <wg ?HG t”< - )n - )k• .&9b ?0G
CD/cE ?3gsI ] R t < %n^u%& ` / < p”1 -  -
 %à/3w%p
 
CD/cE `5, IL? , t 1 -  - b . 4 - 9[ -j  - b
Y[Z = R"P

No/FN ?0G t @ 9& - )Q
w 6w’4> ?iG
@ V =
,V3a$a Y r 1 Y x|@B? V_Zc` N

/ @ `AYŽZ ? C VHZ = / N @ / 1 Z3V ?A@



@ V =
/ @ `AYŽZ ? C VHZ = / V_ZA` N

<>=#? CON ?sr ,Y <w=q? N @ s


/ 1 Z3V ?A@
CD/cE ` GJI / x|x«< V = , YŽZcV ?sr E X / #
 = ?
1 ? ,o, < =q? CN ?sr<w=#@
 YŽZFa ? t”<  - j  - > - )& -  - Õ
-
CD/cE ` GJI / x|x«< V = E ? , / @ Y
CD/cE ? , Im ZqX C r E ? , / @ Y‚
CD/cE K , I ,6XAZca g$r E ? , / @ V
C XA, K ,
CD/cE K\J
G I ` G
La CPU Intel 8086: Architettura e Programmazione Assembly 153

? F ` ` K GJI?0G
M t NH -Œ- )l• % j & {4" %)) - 9[ -
CD/cE 1 , Im K0G ‚ t < - )&n - )l
bw %v4  K0G ‚
CD/cE Ko à = V N =#@  K3G ‚ I p Ð p t”< . - ) - )k• % j & –> %¹) -
1 ? ,o, <=q? CN ?sr<w=#@ ŽY ZFa ? t z
 %4 - 4>m9Š -j  -
CD/cE  KiG ‚ I 1 , t @ '9bb - )l
Ž .wv4>  K3G ‚
@ V =
<>=#? CON ?sr ,Y <w=q? VoZA` N

<>=#? CON ?sr<w=#@ YŽZFa ? N @ / 1 Z3V A


? @
CD/cE ?3gsI ]É t < %n^u%& ` / < p NH' < &p

[Y Z = "
R P

@ V =
<>=#? O
C N ?sr<w=#@ YŽZFa ? V_Zc` N

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@


CD/cE ? GId< Via ` < V3a
0
CD/cE ` <ÑIL?0G
CD/cE  ZqX C r E ? , / @ Y ‚ I ] t Z  j %v4Qn - )&Q9 %'
@ V =
Y[ZcYbUÑY ? ,oYUU ? 2
U Y / ZAV VoZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V ?A@



@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N

1 < V3a VoZB` <


VZA` C ? YŽZ
154 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
16 settembre 1991

Scrivere un programma in assembler che:


å Accetti da tastiera parole (da 1 a 10 caratteri).

å Stampi su schermo la lista delle parole inserite in ordine di lunghezza.

Il programma deve operare nel seguente modo:

1. Presentarsi.

2. Richiedere se si vuole:
å inserire una parola.
å stampare la lista delle parole gia’ inserite.
å uscire dal programma.

Al termine dell’inserimento e della stampa il programma deve ripetere le operazioni previste


al punto 2.

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .) P€ 9• b j b P ÉÉ P

` < 3 V a < V0a C ViZ = N A ? @B? N X K ,oY 1 p` B ? =q? p


C ?cGr ZAX C r N ?c@ / ,_V V\W X P ]] t ` nž  99b  j '6b –4" R ¨ €
C ?cGr ,\XcZFa gsr N ?B@ / , ? VoW X SP R
,XAZFa gsr N ?A@ / , ? V\WFX P ]
V_Z = V @ V WAX
M P e
,YŽZAV x V0VH` V WFX
\ P ]
La CPU Intel 8086: Architettura e Programmazione Assembly 155

C V <<Ñr YŽZ < V @ Y C V0Z = / ` K VZ = V @$I ,YŽZAV x V0Vi` I p Y 69b %b y) -  - b) -  Ð p
Yw < =#@ XFUÑY / ZBY ` K V Z = V @$I ,YŽZAV x V0Vi` I ,YŽZAV x V0Vi`

` K p N| j   P  .Ò9 .&b – -  - ) - I p
` K VoZ = V @ I ,6YŽZcV x V0Vi`
` K p R  %¹9Š -j  -  y) - )'9b - 4 %)&)&  - )& I p
` K VoZ = V @ I ,6YŽZcV x V0Vi`
` K p e  %Ê9
%' {4 - )Q -j‘jl- 'p
,YŽZAV ?$r E X / =#? ` K V_Z = V @$I ,YŽZcV x ViV0` I p Ð p
N ?A@ / ,\V ` K C ?cG$r ZAX C r N ?A@ / ,oVæ`5X Nq7 ,XAZFa g$r N ?A@ / , ? `5X Nq7bpQp ; Iƒç
VZ = V @ I ,YŽZAV x V0V0` ;
,XAZFa g V0UU8V ` K C ?qGr ZAX C r N ?A@ / ,oVæ`5X Nq7p œ p ;
Z3X C r N A
? @ / ,oV ` K œ
` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

C ? YŽZ N @ $/ 1 x2?A@
N X <wg ` < t Y 9bbu%m4 - ) - 9
 - b < V CªN @ V
CD/cE ?0GI ]] t - )Q&6
'v4> %Q> -jkj •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? UÑY / ZBV
1 ? ,o, N @ V < VHZ =q? Ñ U Y/ AZ V
1 Y 1 , / r N @ Y Z 1 Y N ? ,_V ‘1 ? ,o, ,ÕViaa Y r}< 1 HV , #= ? t , . ) - 9•
%)& - 4 -  - 9 % -
t Ò )‘• 96) - Œ ? ,
1 CON
M ? , I pP p t”< )k - 9bv> %pQp P p I
T.ZAU Z / r YZ < V @ Y C V0Z = / t - )') - 9 - )' -
1 ? ,o, Y[Z < V @ Y C V0Z = / t N«bz
% .4w - 4"Q9b .b j .w
1 ? ,o, / @ `AYZ ? C ViZ = / t NHb
% .4w - 4>Q%4w& -j %
CD/cE ` GJI / x|x«< V = Y <w=#@ X UÑY / ZcY t”<  -j  - ) »}9Âu.'
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ?
T CON 1 Y 1 , / r N @ YŽZ 1 Y N ? ,\V
156 A.Broggi

Z / r YŽZ < V @ Y C ViZ = / 1MCON ? , I pR p t”< –)‘ - 9Žv>Ä pQp R p I


T.ZAU X < 1 Y =#? t - &) )& - 9b

1 ? ,o, <=q? CN ?sr ,Y <w=q?
CD/cE ` GJI / x|x«< V = Y <w=#@ X UÑY / ZcY t”<  -j  - ) »}9Âu.'
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ?
T CON 1 Y 1 , / r N @ YŽZ 1 Y N ? ,\V t @  - )m
Ž
)&vb
%' - )
X < 1 Y =q?  @ V = t@ ' - ) < &9b jk- /0 % - 'n—
C ? YŽZ V_ZA` N

,V3a$a Y r< 1 V0, =q? N @ $ / 1 Z0V ?A@


Z3X /AE ?$r ,_V =#= X @B?  C‡/cE ?0gI ] © t”< .nž&u% ` / < p @ - 4¦h .§^ - 4Î1 - 
 
Y[Z = R"P t › ' w V
p
  
1MCON ? , IpP p t 1ib)) - )k -  >L9• y p
T 1 Z0X /AE ?sr ,_V =#= X c @ ? t
Ž j  .9b†: - p P pJ »p e p I - )&)& -
1MCON ? , Ipe p˜ P t 9
 I - )' j .wQ“' -
T.Z 1 Z3X /cE ?sr ,\V =q= X B@ ? t -yZiX /FE ?sr ,oV =q= X @c?
@ V =
,V3a$a Y r< 1 V0, =q? V_ZA` N

Y[Z < V @ Y C ViZ = / N @ /s1 Z0V ?A@


CD/cE K , Im ZBX C r N ?c@ / ,_V ‚
1MCON K , I C ?cGr ZcX C r N ?A@ / ,oV t”< y)l j %b’4>Q - ) y %p
T*U x YŽZcV r YŽZ < V @ Y C ViZ = / t :Œ b) n -  I b9
 9•&
CD/cE ` GJI / x|x«< V = C V <<Õr YŽZ < V @ Y C ViZ = /
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ?
CD/cE ? , I C ?cGr ,_XAZFa gsr N ?A@ / , ?
C XA, K ,
? `F` ?iGJI / x|x«< V = N ?A@ / ,_V
CD/cE K\GJIL?0G t N«w -Œ- )) - b jk-  - >) - n" -
1 ? ,o, ,ÕViaaFY r N ?A@ / , ? t , % y -  - ) -
CD/cE K , I ZAX C r N ?A@ / ,_V ‚ t N«  K , )l j ’4"Q - )
G / @ KMgILK|g t ? u.u% % - ?3g j j 'u.u - ) - )w u.u -

CD/cE  / x|x«< V = ,ÕXBZFa g V5UU2V ˜ KMG ‚ I `5, t 4> )) -  - ) - 9b %b& -
Y[Z 1 K\ÃF= V N =q@  ZqX C r N ?B@ / ,_V ‚ t ? & - )l j .’4"Q - )
x YŽZAV r YŽZ < V @ Y C VHZ = /J @ V =
[Y Z < V @ Y C ViZ = / V_ZA` N

,V3a$a Y r N ?A@ / , ? N @ /$1 Z3V ?B@


CD/cE 1 GJI ,_XAZFa s g r N ?A@ / , ? t Y u% - )&&u%u - )Q
Ž -  
-  -   %b
Z3X /AE ?$r ,_V =#=  C‡/cE ?0gI ] © ”t < .bnž&u% ` / < p @ - 4Ħ5 .§^ - Ø 4 1 - 
 
Y[Z = R"P t › '   w V
p
  
La CPU Intel 8086: Architettura e Programmazione Assembly 157

1MCON ? , I V_Z = V @ t < y)k - 9bv pJ w % I


T*U x YŽZcV r ,_V =#= X @q? t • . j & - ) - )  -
1MCON ? , I pQp t 10w)') - )k -  L9Š –ˆ %p
T 1 Z0X /AE ?sr ,_V =#= t n - )&4w I •)' .  - )'bŒ - 9
N X <wg ?HG t”< - )n - )k• .&9b ?0G
CD/cE ?3gsI ] R t < %n^u%& ` / < p”1 -  -
 %à/3w%p
 
CD/cE `5, IL? , t 1 -  - b . 4 - 9[ -j  - b
Y[Z = R"P

No/FN ?0G t @ 9& - )Q
w 6w’4> i
? G
CD/cE  KiG ‚ IL? , t CÖ j &u.u - )‘ - 9Ž
Y[Z 1 KMG t ? & - )kw - 
, / / N Z3X /cE ?$r ,_V =#= t @ %&b . - ‰& -
{1 G$‹ ]

x YŽZAV r ,_V =#= X @q?  CD/FE ` GJI ,XAZFa gsr N ?A@ / , ? t 1 - )
) -  ` G ) - )w   .u%u - 4 %)&) -

< X K ` GJI 1 G t  - ) - 9b %b& -
@ V =
,V3a$a Y r N ?A@ / , ? V_Zc` N

/ @ `AYŽZ ? C VHZ = / N @ / 1 Z3V ?A@


CD/cE ? , Im ZqX C r N ?c@ / ,_V ‚
`5V 1 ? , t ` f
b j .w - ? ,
T*U x YŽZcV r / @ `AYZ ? C VHZ = / t < ? , b - P%I “ . j & - ) - z
 %4 -
CD/cE 1 , I C ?cGr ,\XBZFa gsr N ?c@ / , ?
C XA, 1 ,
CD/cE < Y I / x|x«< V = N ?A@ / ,\V t < Y w -Œ- )')•p&'u.& -  -  - )'
CD/cE `3Y Id< Y t 1i - 4 )Qw - 
? `F` `3Y IL?0G t `cY w -v- ))Šp&u%Œ)' jk-  - ) -
G / @ K\GJILKMG t 13> -  y - )&
1 Y 1 , / r/ @ `FYŽZ ? C¢ 1 ? ,o, 1H/ Z x|@ / Z = / t 10w‰Š - ) » - )& w - b {4 - < Y
t `3Y  < yn - v9•
-j  -  y“&b -
t 9Š %b - 4Œ)‘‰) - ß1 - b§
T.Z 1 Z / r< 1 ? C K Y / t < –> I 9 - ) -  - )Œ9•
-j 6'
1 ? ,o, < 1 ? C K Y/ t N|z
% %4w - 4>m9“
-j 'v - b)
Z / r< 1 ? C K Y / Y[Z 1 KMG t Y 
 j %w -
w - b  - )
? `F` < Y I C ?cGsr ,oXAZFa gsr N ?A@ / , ?
1MCON < Y I `3Y t”< )k
bw‰[wŒÄ p: % j  - 
T.ZAU 1 Y 1 , / r / @ `AYŽZ ? C t •'6 Q) - z
.4 -
x ŽY ZAV r / @ `AYZ ? C ViZ = /J @ V =
/ @ `AYŽZ ? C VHZ = / V_ZA` N

< 1 ? C K Y/ N @ /s1 Z3V ?c@


N X w < g < Y
N X <wg `3Y
158 A.Broggi

1 Y 1 , / r}< 1 ? C K Y /L C¤/cE ? , ILKoà = V N =#@  < Y ‚ t ,  –)kz99 j v


-  - b %b
1 CON
M ? , I V_Z = V @ t < - )l:  j & {4> )) -  - ) -
T*U < 1 ? C K Y / r ,_XAZAa g t : % j  - )Œ9•
-j &
CD/cE ?3gsILK\à = V N =q@  `cY ‚
CD/cE Koà = V N =#@  `cY ‚ IL? , t N«
% %4w6 - 4>m9“
->j '’ - b)&
CD/cE Koà = V N =#@  < Y ‚ IL?3g
Y[Z 1 `3Y t Y 6
 j % - )kw -  `3Y
Y[Z 1 < Y t Y 6
 j .w - )k -  < Y
T CON 1 Y 1 , / r< 1 ? C K Y / t @  Q .Ò - )'b’
-  -  %b
< 1 ? C K Y / r ,_XAZFa g  C¤/cE ? , Im / x|x«< V = ,6XAZFa g V5U8U2V ˜ KMG ‚ t NHb jQ- )— %u.u%u -

N X <wg KoG t /c - 9•
-j  - ) »)w %u.u%

CD/cE K , Im ZBX C r N ?c@ / ,_V ‚
G / @ KMgILK|g
CD/cE ?3gsIm / x|x«< V = ,XAZFa g V3UU8V ÈP ˜ K5G ‚
CD/cE  / x|x«< V = ,ÕXBZFa g V5UU2V ÈP ˜ K3G ‚ IL? ,
No/FN KMG
CD/cE  / x|x«< V = ,ÕXBZFa g V5UU2V ˜ KMG ‚ IL?3g
No/FN `5Y
No/FN < Y
@ V =
< 1 ? C K Y/ VoZA` N

1«/ Z x|@ / Z = / N @ /$1 ZiV ?A@


CD/cE ? , Im / x|x«< V = Õ , XcZFa g V5UU2V ˜ KMG ‚ t N«b jl- ) — . u%u%u -

N X <wg KoG
CD/cE K , Im ZBX C r N ?c@ / ,_V ‚
G / @ KMgILK|g
1MCON ? , Im / xHx«< V = ,A X ZFa g 0
V UU8V ÈP ˜ K5G ‚ ”t < .
4 - ) — . u%u -

No/FN KMG
@ V =
1«/ Z x|@ / Z = / V_ZA` N

<>=#? CON ?sr ,Y <w=q? N @ s


/ 1 Z3V ?A@
CD/cE ` GJI / x|x«< V = ,YŽZcV ?sr E X / =#?
1 ? ,o, < =q? CN ?sr<w=#@ YŽZFa ?
 t”<  -j  - > - )& -  - Õ
-
CD/cE ` GJI / x|x«< V = N ?A@ / ,oV
CD/cE ? , Im ZqX C r N ?c@ / ,_V ‚
CD/cE K , I C ?cGsr ,_XAZFa gsr N ?A@ / , ?
C XA, K ,
CD/cE K\JG I ` G
? `F` KMGJ I ?0G t NH -Œ- )l• % j & {4" %)) - 9[ -
CD/cE 1 , mI  K0G ‚ t < - )&n - )l
bw %v4  K0G ‚
La CPU Intel 8086: Architettura e Programmazione Assembly 159

CD/cE Koà = V N =#@  K3G ‚ I p Ð p t”< . - ) - )k• % j & –> %¹) -
1 ? ,o, < =q? CN ?sr <w=#@ ŽY ZFa ?
 t z
 %4 - 4>m9Š -j  -
CD/cE  KiG ‚ I 1 , t @ ' 9bb - )l
Ž .wv4>  K3G ‚
@ V =
<>=#? CON ?sr ,Y <w=q? VoZA` N

<>=#? CON ?sr<w=#@ YŽZFa ? N @ / 1 Z3V A


? @
CD/cE ?3gsI ]É t < %n^u%& ` / < p NH' < &p

[Y Z = R"P

@ V =
<>=#? O
C N ?sr<w=#@ YŽZFa ? V_Zc` N

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@


CD/cE ? GId< Via ` < V3a
0
CD/cE ` <ÑIL?0G
CD/cE  ZqX C r N ?B@ / o
, V ‚I ] t Z  j %v4l - )& –9b %'
@ V =
Y[ZcYbUÑY ? ,oYUU ? 2
U Y / ZAV VoZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V A


? @
CD/cE ` GJI / x|«x < V = Y <w=#@ X UÑY / ZcY t”<  -j  - ) »}9Âu.'
1 ? ,o, <=q? CN ?sr <w=#@ YŽZFa ?
@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N

1 < V3a V ZB` <


o
VZA` C ? YŽZ
160 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
21 ottobre 1991

Scrivere un programma in assembler che agisca da semplice guida telefonica:


å Accetti da tastiera il cognome di un utente telefonico (max 15 campi alfanumerici)

å Il numero di telefono (max 12 caratteri numerici).

Il programma deve operare nel seguente modo:

1. Presentarsi.

2. Richiedere se si vuole:
å inserire un nuovo utente.
å richiedere il numero di telefono di un utente.
å uscire dal programma.

Al termine dell’inserimento e della richiesta il programma deve ripetere le operazioni previ-


ste al punto 2.

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .) R"P  P ÉÉ P

` < 3 V a < V0a C ViZ = N ?A@B? N X K ,oY 1 p ` ?B=q? p


C ?cGr ZAX C r V0Z =#@c?c= V V\WAX P ]] t ` %nž – b99b . j  –4> R ¨ €
,XAZFa gsr X = ViZ = V V\WFX P ¨
,XAZFa gsr= Vi,oV x / Z / VMWAX PR
C ?cGr ,\XcZFa gsr V0Z =q@c?B=q? VMWAX ,ÕXcZFa gsr X = V0Z = V ˜ ,XAZAa g r = V0,_V x / Z / ˜ P
,XAZFa gsr V0Z =#@B?A=#? V\WAX ,XAZFa gsr X = V0Z = V ˜ ,6XcZFa gsr}= Vi,\V x / Z /
La CPU Intel 8086: Architettura e Programmazione Assembly 161

V_Z = V @ VMWAX Pe


,YŽZAV x V0VH` V\WFX P ]
Y[Z < V @ Y C r X = ViZ = V ` K V_Z = V @$I ,YŽZAV x VHV0` I p Y 9 %b y j –> %  Ð p
Y[Z < V @ Y C r}= Vi,oV x / Z / ` K V_Z = V @$I ,YŽZAV x ViVi` I p Y 9 %b  j %v4l• .)' %‰[ Ð p
C V <<Ñr@ Y 1 V @ 1 ? ` K V_Z = V @$I ,YŽZAV x VHV0` I p Y 9 %b " % 4 -
b %
- b  Ð p
Z / Z r =#@ /cE ?A= / ` K V_Z = V @$I ,YŽZAV x VHV0` I p Z  j “n -  Ð p
=«@ /AE ?A= / ` K VZ = V @$I ,YŽZAV x ViV0` I p Z  j .v4>l: ) ‰[w Ð p
Y <w=#@ XFUÑY / ZBY ` K VZ = V @$I ,YŽZAV x V0Vi` I ,YŽZAV x V0Vi`
` K p N| j   P  .Ò9 .&b –> %b I p
` K VoZ = V @ I ,6YŽZcV x V0Vi`
` K p R  %¹
 %
-  –>Ä> b I p
` K VoZ V =
@ I ,6YŽZcV x V0Vi`
` K p e  %Ê9
%' {4 - )Q -j‘jl- 'p
,YŽZAV ?$r E X / =#? ` K V_Z = V @$I ,YŽZcV x ViV0` I p Ð p
V_Z =#@B?A= V ` K C ?BGr ZBX C r V0Z =#@B?A= V3˜ Pç
`5X NB7 ,XAZFa gsr V0Z =#@B?A=#? `5X Nq7pQp”; I p Ð p ;
@ Y1 V @ 1 s ? r V0Z =#@c?c=#? ` K ,XAZFa gsr V0Z =#@B?A=#? `5X NB7bpQp ; I p Ð p
Z X C r0
3 V Z #= @B?A= V ` K œ
` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K  , Y 1 ¡p 15/ ` V p

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

C ? YŽZ N @ $/ 1 x2?A@
N X <wg ` < t Y 9bbu%m4 - ) - 9
 - b < V CªN @ V
CD/cE ?0GI ]] t - )Q&6
'v4> %Q> -jkj •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? UÑY / ZBV
1 ? ,o, N @ V < VHZ =q? Ñ U Y/ AZ V
1 Y 1 , / r N @ Y Z 1 Y N ? ,_V ‘1 ? ,o, ,ÕViaa Y r}< 1 HV , #= ? t , . ) - 9•
%)& - 4 -  - 9 % -
t Ò )‘• 96) - Œ ? ,
1MCON ? , I pP p t”< )k - 9bv> %pQp P p I
162 A.Broggi

T.ZAU Z / r YZ < V @ Y C V0Z = / t - )') - 9 - ')  -


1 ? ,o, Y[Z < V @ Y C V0Z = / t N«bz
% .4w - "4 Q9b .b j .w
CD/cE ` GJI / x|x«< V = Y <w=#@ X UÑY / ZcY t”<  -j  - ) »}9Âu.'
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ?
T CON 1 Y 1 , / r N @ YŽZ 1 Y N ? ,\V
Z / r YŽZ < V @ Y C i
V Z = / 1MCON ? , I pR p t”< –)‘ - 9Žv>Ä pQp R p I
T.ZAU X < 1 Y =#? t - &) )& - 9b

1 ? ,o, @ Y1 V @ 1 ?
CD/cE ` GJI / x|x«< V = Y <w=#@ X UÑY / ZcY t”<  -j  - ) »}9Âu.'
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ?
T CON 1 Y 1 , / r N @ YŽZ 1 Y N ? ,\V t @  - )m
Ž
)&vb
%' - )
<
X 1 Y = q ?  @ V = t@ ' - ) < & 9b jk- /0 % - 'n—
C ? ŽY Z V_ZA` N

,V3a$a Y r< 1 V0, =q? N @ $ / 1 Z0V ?A@


Z3X /AE ?$r ,_V =#= X @B?  C‡/cE ?0gI ] © t”< .nž&u% ` / < p @ - 4¦h .§^ - 4Î1 - 
 
Y[Z = R"P t › ' w V
p
  
1MCON ? , IpP p t 1ib)) - )k -  >L9• y p
T 1 Z0X /AE ?sr ,_V =#= X c @ ? t
Ž j  .9b†: - p P pJ »p e p I - )&)& -
1MCON ? , Ipe p˜ P t 9
 I - )' j .wQ“' -
T.Z 1 Z3X /cE ?sr ,\V =q= X B@ ? t -yZiX /FE ?sr ,oV =q= X @c?
@ V =
,V3a$a Y r< 1 V0, =q? V_ZA` N

Y[Z < V @ Y C ViZ = / N @ s


/ 1 Z0V ?A@
CD/cE K , Im ZBX C r V0Z =#@c?c= V ‚
1MCON K , I C ?cGr ZcX C r V0Z =#@B?A= V t”< )l j .’4"Q b -  – p
T*U x YŽZcV r YŽZ < V @ Y C ViZ = / t :Œ b) n -  I b9
 9•&
CD/cE ? , I C ?cGr ,_XAZFa gsr V0Z =#@B?A=#?
C XA, K ,
? `F` ?iGJI / x|x«< V = VZ =q@q?A= V
CD/cE K\GJIL0 ? G t N«w -Œ- )) - b jk-  - >) - n" -
N X <wg KoG t”< - )n - )‘w - b - )') - b -  -
CD/cE ` GJI / x|x«< V = Y[Z < V @ Y C r X = V0Z = V
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ?
1 ? ,o, ,ÕViaaFY r X = V0Z = V t , . > %w
No/FN KMG t @ 9 - )k -  - )&)•p£ .w
? `F` KMGJI ,_XAZFa gsr X = ViZ = V t ¢)ä‰ - w -  - )l: %)& ‰Š
CD/cE ` GJI / x|«x < V = Y[Z < V @ Y C r = Vi,oV x / Z /
1 ? ,o, <=q? CN ?sr <w=#@ YŽZFa ?
1 ? ,o, ,ÕViaaFY r= V0_ , V x / Z / t , . –)k j %v4l• .)' %‰[
Y[Z 1 K\ÃF= V N =q@  ZqX C r V0Z =q@c?B= V ‚ t ? & - )k j %v4>Q - )&
La CPU Intel 8086: Architettura e Programmazione Assembly 163

x YŽZAV r YŽZ < V @ Y C VHZ = /J @ V =


Y[Z < V @ Y C i V Z = / V_ZA` N

,V3a$a Y r X = V0Z = V N @ /$1 Z0V ?A@


CD/cE 1 GJI ,_XAZFa s g rX = 0
V Z = V t Y 'u. - )&&u.u - )l
w - b {
-  - b %
Z3X /AE ?$r ,_V =#=  C‡/cE ?0gI ] © t”< .bnž&u% ` / < p @ - 4Ħ5 .§^ - 4Ø1 - 
 
Y[Z = R"P t › ' w V
p
  
1MCON ? , I V_Z = V @ t < y)k - 9bv pJ w % I
T*U x YŽZcV r ,_V =#= X @q? t • . j & - ) - )  -
1MCON ? , I pQp t 10w)') - )k -  L9Š –ˆ %p
T 1 Z0X /AE s
? r ,_V #
= = t n - )&4w I •)' .  - )'bŒ - 9
N X <wg ?HG ”t < - )n - )k• .&9b ?0G
CD/cE ?3gsI ] R t < %n^u%& ` / < p”1 -  -
 %à/3w%p
 
CD/cE `5, IL? , t 1 -  - b . 4 - 9[ -j  - b
Y[Z = R"P

No/FN ?0G t @  9& - )Q
w 6w’4> ?iG
CD/cE  KiG ‚ IL? , t CÖ j &u.u - )‘ - 9Ž
Y[Z 1 KMG t ?   & - )kw - 
, / / N Z3X /cE ?$r ,_V =#= t @ %&b . - ‰& -
{1 G$‹ ]

x ŽY ZAV r ,_V #
= = X q
@ ?  @ V =
,V3a$a Y r X = V0Z = V V_ZA` N

,V3a$a Y r = V0,_V x / Z / N @ / 1 ZiV ?A@


CD/cE 1 GJI ,_XAZFa gsr= V0,\V x / Z / t Y u - )'u%u -
w - b –
-  -  %
Z3X /AE ?$r ,_V =#=qR  CD/AE ?3gI ] © t”< %n—&u%' ` / < p @ - 4ˆ¦# §— - 4Ä1 - 
 
Y[Z = R"P t › ' w V
p
  
1MCON ? , I V_Z = V @ t < y)k - 9bv pJ w % I
T*U x YŽZcV r ,_V =#= X @q?FR t :  j & - ) - ) b -
1MCON ? , I p}]wp t 1ib)) - )k -  >L9• yÄ p
T 1 Z0X /AE ?sr ,_V =#=BR t
Ž j  f9b†: - p ]žpJ yp É^p I
1MCON ? , I p}Éwp ˜ P t - ))> - “&)& % y - )'† - 9Ž
T.Z 1 Z3X /cE ?sr ,\V =q=qR
N X <wg ?HG t”< - )n - )k• .&9b ?0G
CD/cE ?3gsI ] R t < %n^u%& ` / < p”1 -  -
 %à/3w%p
 
CD/cE `5, IL? , t 1 -  - b . 4 - 9[ -j  - b
Y[Z = R"P

No/FN ?0G t @ 9& - )Q
w 6w’4> ?iG
CD/cE  KiG ‚ IL? , t CÖ j &u.u - )‘ - 9Ž
Y[Z 1 KMG t ? & - )kw - 
, / / N Z3X /cE ?$r ,_V =#=qR t @ %' % - ‰'6 -
{1 G$‹ ]

x YŽZAV r ,_V =#= X @q?FR  @ V =
,V3a$a Y r = V0,_V x / Z / VZA` N
164 A.Broggi

@ Y1 V @ 1 ? N @ / 1 Z3V ?A@
CD/cE ? , Im ZqX C r V0Z =#@c?c= V ‚ t <  pL9Š - v9 %'Œ .99
1MCON ? , I] t > %b I - ))& - 9 - ) -v- )l: % j 
T*U x YŽZcV r @ Y 1 V @ 1 ? t 4> .)') - •
 %
-
CD/cE ` GJI / x|x«< V = C V <<Õr @ Y 1 V @ 1 ?
1 ? ,o, <q = ? CN ?sr<w=#@ YŽZFa ? t”<  -j  -Œj .99 - v4>Q•
 %
-
CD/cE K\J G I / x|x«< V = @ Y 1 V @ 1 ?sr ViZ =q@B?c=q?
1 ,o, ? ,ÕVi a aFY r X = V0Z = V t , . > %w
CD/cE 1 GJJ I KMG
< X K 1 GJI / x|x«< V = @ Y 1 V @ 1 ?sr V0Z =#@B?A=#? t < y %pJ9“ - v> j wv9“)&
T*U x YŽZcV r @ Y 1 V @ 1 ? t V_Z = V @$I • % j  - ) - •
 .
- 
1 ,_`
CD/cE K , Im ZBX C r V0Z =#@c?c= V ‚
CD/cE `3Y I / | x x«< V = V_Z =q@B?c= V
1 Y1 , / r@ Y 1 V @ 1 ?  N X <wg 1 G t < - )n - ) - )w %uu - 4> )) - 9Š -

N X <wg `3Y
CD/cE < Y I / x|« x < V = @ Y 1 V @ 1 ?sr V0Z =q@c?B=q?
@ V N 1MCN <K t 10‰[w - ) y9Š'6 4Q§z .9

T.V 1H/ Z x|@ / Z = / r / ¦
No/FN `5Y t @ & 9& - w -  > w
No/FN 1 G t @ '9bb - ) %u.u - 9[ -

? `F` `3Y I C ?BGr ,oXAZAa g$r ViZ =q@B?A=#?
`5V 1 K , t ` f
 j .w -
w - b –
w‰Š
T.ZAU 1 Y 1 , / r}@ Y 1 V @ 1 ? t 10w& - ) - •
 %
- 9“ K , Ô ‹ ]
CD/cE ` GJI / x|x«< V = Z / Z r}=q@ /FE ?c= /
1 ,o, ? 
< =q? CN ?sr<w# = @ YŽZFa ? t”<  -j  - 9[' - p Z  = bn - p
T CON x YŽZcV r}@ Y 1 V @ 1 ? t = % j  - ) - •&
% %
-
1«/ Z x|@ / Z = / r /F¦d CD/FE ` GJI / x|x«< V = =H@ /AE ?A= /
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ? t”<  -j  - 9[' - p = n - p
No/FN ` G t N|6w - w&u.'Œ %w »:bn - 
No/FN 1 G
? `F` ` GJI ,oXAZca g$r X = V0Z = V t NHw -Œ- )m9Š6Œ j .Œ“ .)' %‰[

1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ? t Ò)Œ9Š -j  -
x YŽZAV r @ Y1 V @ 1 ?  @ V =
@ Y1 V @ 1 ? V_Zc` N

<>=#? CON ?sr<w=#@ YŽZFa ? N @ / 1 Z3V ?A@


C /cE
D ?3gsI ]É t < %n^u%& ` / < p NH' < &p

Y[Z = R"P

La CPU Intel 8086: Architettura e Programmazione Assembly 165

@ V =
<>=#? CON ?sr<w=#@ YŽZFa ? V_Zc` N

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@


CD/cE ?0GId< Via ` < V3a
CD/cE ` <ÑIL?0G
CD/cE V <ÑIL?0G
CD/cE  ZqX C r V0Z =q@c?B= V ‚ I ] t Z  j %v4>Q .wQ9b &
@ V =
? ?
Y[ZcYbUÑY ,oYUU U2Y / A
Z V VoZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V A


? @
CD/cE ` GJI / x|«x < V = Y <w=#@ X UÑY / ZcY t”<  -j  - ) »}9Âu.'
1 ? ,o, <=q? CN ?sr <w=#@ YŽZFa ?
@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N

1 < V3a V ZB` <


o
VZA` C ? YŽZ
166 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
25 novembre 1991

Scrivere un programma in assembler in grado di gestire un’agenda giornaliera. L’agenda deve


memorizzare gli impegni orari di una giornata di lavoro dalle ore 9.00 alle ore 17.00. Il programma
deve:
å Presentarsi visualizzando gli impegni nel formato seguente:
9.00 ..............
10.00 .............
11.00 .............
.............
17.00 .............

å Permettere l’inserimento di nuovi impegni e al termine la visualizzazione degli stessi.

å Permettere la cancellazione di tutti gli impegni.

å Permettere di uscire dal programma.

L’impegno orario e’ rappresentato da un stringa alfanumerica (max 50 caratteri).

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .) R ¨ nž j  P ÉÉ P

` < V3a < V0a C ViZ = N ?A@B? N X K ,oY 1 p ` ?B=q? p


,V0Z r Y CN 0V asZ / VoW X ¨ © t , 6 u%u - 4"Q - 9['6 -

,V0Z r}<=q@ Y ZFa ? V\W X ¨ ]
Z3X C r Y CªN i V asZBY V\WFX É
V_Z = V @ VMWAX Pe
La CPU Intel 8086: Architettura e Programmazione Assembly 167

,YŽZAV x V0VH` V\WFX P ]


? a V0Zc` ? ` K V_Z = V @$I ,YŽZAV x V0VH`
` K p ? a V0ZA` ? ahY / @ Z ? ,oYŽV @c? p
` K V Z = V @ I ,6YŽZcV x V0Vi`
o
Y CON V0a$ZcY ` K pAÉ>]]Ìp I ,V0Z r<w=#@ YŽZAa ? `5X NB7bp&&p}; I VZ = V @$I ,YŽZAV x ViV0`
` K p P ]w]]ˆp I ,V0Z r <w=q@ YŽZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YŽZAV x VHV0`
` K p P>P ]]ˆp I ,V0Z r <w=q@ YŽZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YŽZAV x VHV0`
` K p P.R ]]ˆp I ,V0Z r <w=q@ YŽZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YŽZAV x VHV0`
` K p P%e ]]ˆp I ,V0Z r <w=q@ YŽZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YŽZAV x VHV0`
` K p P~ ]]ˆp I ,V0Z r <w=q@ YŽZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YŽZAV x VHV0`
` K p P ¨ ]]ˆp I ,V0Z r <w=q@ YŽZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YŽZAV x VHV0`
` K p P%€ ]]ˆp I ,V0Z r <w=q@ YŽZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YŽZAV x VHV0`
` K p P ¥ž]]ˆp I ,V0Z r <w=q@ YŽZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YŽZAV x VHV0`
` K pÐ p t = % j & {9[' -
Y <w=#@ XFUÑY / ZBY ` K VZ = V @$I ,YŽZAV x V0Vi` I V_Z = V @ I VoZ = V @sI VZ = V @
` K p N| j  4 - pp ? p&p - pp Y pp %Ò9 %& t p
` K VoZ = V @ I ,6YŽZcV x V0Vi`
` K p pp T p'pJ %Ê
- 6
 %)&) - b t p I V0Z = V @$I ,YŽZAV x ViVi`
` K p pp¦LppJ> %¹9
b p I VoZ = V @ I ,6YŽZcV x V0Vi`
` K VoZ = V @ I p <
% )& -  Ð p
C V <<Ñr YŽZ < V @ Y C 0
V Z = / ` K VZ = V @$I ,YŽZAV x V0Vi`
` K p < b& - 4 - 9b %b  Ð p
` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

C ? YŽZ N @ /$1 x2?A@


N X <wg ` < t Y b9 bu%m4 - ) - 9
 - b < V CªN @ V
C /cE
D ? GI ]]
0 t - )Q&6
'v4> %Q> -k j j •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcbY U2Y ? ,YbU_U ? UÑY / ZBV
168 A.Broggi

1 ? ,o, N @ V < VHZ =q? UÑY / ZAV


1 Y 1 , / r N @ YZ 1 Y N ? ,_V ‘  1 ? o , , <=q? CªN ?sr E YŽ`FV ?A=#?
1 ? ,o, , ViaaFY r}< 1 VH, =#?
Õ t , . ) - 9“
 %)& - 4 -  - 9Ž % -
t Ò )‘• 96) - Œ ? ,
1MCON ? , I pT p t”< )d - 9v p Ú ‹ p T p I - ))> -
T.Z 1 Z / r YŽZ < V @ Y C VHZ = / t - )&)& - Î9ŠQ9b .b9

1 ? ,o, Y[Z < V @ Y C V0Z = / t N«bz
% .4w - 4"Q9b .b j .w
T N 1 Y 1 , / r N @ YŽZ 1 Y N ? ,_V
Z / r YŽZ < V @ Y C ViZ = / T.Z U X < 1 Y =#? t”< y)k - 9bbv ºmp ¦Jp I 9

1 ? ,o, 1 ? Z 1 VH,\, ? UÑY / ZAV
T CON 1 Y 1 , / r N @ YŽZ 1 Y N ? ,\V
X 1 Y< q
= ?  @ V = t @ ' - ) < &9b jk- /0 % - 'n—
C ? YŽZ V_ZA` N

,V3a$a Y r< 1 V0, =q? N @ $ / 1 Z0V ?A@


Z3X /AE ?$r ,_V =#= X @B?  1 ? ,_, ,6V0asa$Y r 1 A
g ?A@
? ZA` ? , I ] ` x t @ &b -Œ-yj$- 'Õ9b
)

1MCON ? , Ip? p t 1iw)) - )l -  >L9• y p
T 1 Z0X /AE ?sr ,_V =#= X @c? t
Ž j  .9b†: - p ? p yp ¦Jp I - )&)& -
1MCON ? , Ip, p t 9
 I - )&b j %l•' -
T.Z 1 Z3X /cE ?sr ,\V =q= X @B? t -yZiX /FE ?sr ,oV =q= X @c?
@ V =
,V3a$a Y r< 1 V0, =q? V_ZA` N

Y[Z < V @ Y C ViZ = / N @ /s1 Z0V ?A@


N X <wg ?HG t”< - )n - ?0G
C /cE
D ` GJI / x|x«< V = C V <<Õr YŽZ < V @ Y C ViZ = /
?
1 ,o, 
< =q? CN ?sr<w=#@ YŽZFa ? t”<  -j  -Œj .99 - Œ•&
 .9 - 9b . j 

No/FN ?0G t @ 9& - ?0G
CD/cE K\GJI / x|x«< V = Y CON V3a$ZcY t N|w - b - )') -Œ-  %4 -
< X K ? , I p? p t ? , ‹  j %v4> .)&) - 9“
% %)& -
CD/cE 1 , I ,ViZ r Y CªN ViasZ / t 1 , ‹ )w .u%u - 4Q

C XA, 1 ,
? `F` KMGJI?0G t K3G  -’- )&)•p£&u%v4> .)')•p j  %
? `F` KMGJI€ t K0G w -Œ- )) - u - 4"Q9b .b j .w
CD/cE 1 GJI ,6V0Z r <w=q@ YŽZAa ? t 10w -  –4> j$- ˆ
-  -  %
1 Y 1 , / r YŽZ < V @ Y CÒ 1 ? ,_, ,V0asa$Y r 1 gA?A@ t , . Ä
-  - b . y Ò)ä y ? ,
1MCON ? , I V_Z = V @ t < 9•l j V_Z = V @ I
T*U x YŽZcV r YŽZ < V @ Y C t 9•l“ . j & - )p¡9b .b j .w
CD/cE  KiG ‚ IL? , t CÖ j &u.u - )l
-  -  %
Y[Z 1 KMG t Y 6
 j .w - )‘w - 
, / / N 1 Y 1 , / r YŽZ < V @ Y C t 1iw& - ‰' -
{1 G$‹ ]

La CPU Intel 8086: Architettura e Programmazione Assembly 169

x YŽZAV r YŽZ < V @ Y Ò


C  @ V =
Y[Z < V @ Y C i V Z = / V_ZA` N

1 ? Z 1 V0,_, ? UÑY / ZcV N @ / 1 Z0V ?A@


CD/cE K\GJI / x|x«< V = Y CON V3a$ZcY t Y &u%Œub - 4 j j  -
CD/cE 1 GJI Z3X C r Y CON V0a$ZcY t 10 - b  j %v4Q j  %
1 Y 1 , / r 1 ? Z 1 VH,\,  ? ` ` KMGJIL€ t < 9b - w&u%v4Œ) »%
CD/cE ` GJI ,V0Z r <w=q@ YZca ? t 1iw - b –)w %u%u - 9“' -

1 Y 1 , / r 1 ? Z 1 r}R  CD/FE K\à = V N =q@  KiG ‚ I pp t 1 - Õ
%)) - Ä
-  -  %
Y[Z 1 KMG t Y 6
 j .w - )‘w - 
`5V 1 ` G t ` f
 j  -
Žw -  –9Š& -
T.ZAU 1 Y 1 , / r 1 ? Z 1 r}R t Y   - 9Š –“
& .9

? `F` KMGJIJR t ?  - )l> - 
, / / N 1 Y 1 , / r 1 ? Z 1 V0,_, t 1i& - ‰' -
Å1 G ‹ ]

@ V =
1 ? Z 1 V0,_, ? UÑY / ZcV VZA` N

<>=#? CON ?sr E Y`FV ?A=q? N @ / 1 ZiV ?A@


CD/cE ?0GI ].¥>]] t Y n^z
- )Öp¡10)' -  <
 . % < %nž
% >p

CD/cE 1 GJI ]%]]] t x & .9Ž - 4 -
- 6
 %)) -  ‘1 G ` G

CD/cE ` GJIQP© ¨ ] t 4w
- v) 
49Ò4 %)m
-  -  .b

CD/cE KMgI ¥ t ? &wv
-  - b %b
Y[Z = P ] t  - )& - 9ŠÌ ¢ˆ - 99 - 4"

CD/cE ?3gsI ] R t Y n—z
- )Öp < Æ1\9ÊN_9'&8p

CD/cE KMgI ]%] t N - & - nf 4w % - &n -

G / @ ` GJI ` G t ? u.u% % -Œ` G
Y[Z = P ]

CD/cE ` GJI / x|x«< V = ? a$V0ZA` ? t N|w -Œ- )&) - 9Š& -
1 ? ,o, <=q? CN ?sr<w=#@ ŽY ZFa ? t 4 %)&Q j  %Q ¢) - 9“ -j  -
CD/cE ` GJI / x|x«< V = Y <w=#@ X UÑY / ZcY
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ? t”<  -j  - ) »}9Âu%&
@ V =
<>=#? O
C N s
? r E Y`FV ?A=q? VZA` N

<>=#? CON ?sr<w=#@ YŽZFa ? N @ / 1 Z3V A


? @
CD/cE ?3gsI ]É t < %n^u%& ` / < p NH' < &p

[Y Z = R"P

@ V =
<>=#? O
C N ?sr<w=#@ YŽZFa ? V_Zc` N
170 A.Broggi

,V3a$a Y r 1 gA?c@ N @ / 1 Z0V A ? @


C /cE
D ?3gsI ] P t < %n^u%& ` / < p @ - 4¦5 .§ž - 4Î1 - %p
 
Y[Z = R"P t

@ V =
,V3a$a Y r 1 gA?c@ V_Zc` N

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@


CD/cE ? GId< Via
0 ` < V3a
CD/cE ` <ÑIL?0G
@ V =
? ?
Y[ZcYbUÑY ,oYUU U2Y / ZAV VoZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V ?A@



@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N

1 < V3a VoZB` <


VZA` C ? YŽZ
La CPU Intel 8086: Architettura e Programmazione Assembly 171

CALCOLATORI ELETTRONICI
Prova scritta
10 febbraio 1992

Scrivere un programma in assembler che effettui il prodotto di due matrici A e B e dia come
risultato la matrice C. Il programma deve:
å Accettare da tastiera le due matrici (gli elementi delle matrici A e B, di dimensione 2x2, sono
numeri positivi inferiori a 10).
å Presentare su video la matrice C risultato del prodotto.

Scrivere successivamente lo stesso programma nel caso di dimensione 3x3.

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .) P ]ä‰ % - ' P ÉÉ R

` < 3 V a < 0V a C ViZ = N ?A@B? N X K ,oY 1 p ` ?B=q? p


`3Y C r C ?A= V\WAX e t@ &9)v> .)m
- 9b e  e
C ?A=#@ Y 1 V r? ` K `3Y C r C A ? =   `3Y C r C ?B= `5X NB7 œ ;
C ?A=#@ Y 1 V rK ` K `3Y C r C A
? =   3
` Y C rC ?c= `5X NB7 œ ;
C ?A=#@ Y 1 V r1 ` K `3Y C r C ?c=   3 ` Y C rC ?A= `5X Nq7 œ ;
` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9
172 A.Broggi

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

C ? YŽZ N @ $ / 1 x2?A@
N X <wg ` < t Y 9bbu%m4 - ) - 9
 - b < V CªN @ V
CD/cE ?0GI ]] t - )Q&6
'v4> %Q> -jkj •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? UÑY / ZBV
1 ? ,o, N @ V < VHZ =q? UÑY / ZAV
CD/cE K\GJI / x|x«< V = C ?A=#@ Y 1 V r}?
1 ? ,o, ,ÕViaaFY r C ?c=q@ Y 1 V t , % ) -  jl-†js- 

CD/cE K\GJI / x|x«< V = C ?A=#@ Y 1 V r}K
1 ? ,o, ,ÕViaaFY r C ?c=q@ Y 1 V t , % ) - 9• .
4 -†j$- 

1 ? ,o, C‡/ , = Y N ,_Y 1 ? U2Y / ZAV t CÖ)')&
- ) y4 j$- 

CD/cE K\GJI / x|x«< V = C ?A=#@ Y 1 V r 1
1 ? ,o, <=q? CN ?sr C ?A=#@ Y 1 V t <  -j  - ) -äj$- &
% y• 96) -  
@ V = t @ ' - ) <  9Ž jl- /3 % - &nž
C ? YŽZ V_ZA` N

CD/ , = Y N ,_Y 1 ? UÑY / ZAV N @ /s1 Z3V ?A@


CD/cE < Y I / x|x«< V = C ?A=#@ Y 1 V r ?
CD/cE `3Y I / x|x«< V = C ?A=#@ Y 1 V r K
CD/cE K\GJI / x|x«< V = C ?A=#@ Y 1 V r 1
CD/cE 1 , I `3Y C r C ?A= t 10w -  •' yÄ1 ,

1 Y 1 , / &r P  C¤/cE 1 gsI `3Y C r C ?c= t 1iw -  –
) Ä1 g
1 Y 1 , / }r R  C¤/cE ` gsI `3Y C r C ?c= t 1i -  4 %)') -†j )')&
- u
N X <wg < Y
N X <wg `3Y
G / @ `5, I `5, t ? u.u% % - )k• 9)& - bv - u - )& – `5,
1 Y 1 , / re  C¤/cE ? , Im < Y ‚ t 1 - &
- ) j %v4 ?
C XA, Koà = V N =#@  `cY ‚ t CÖ)'&)'
-  %Ò )' j %w’4> K
? `F` `5, IL? , t”<  jkjl- )k•&9)& - v - bu% - )&
Y[Z 1 < Y t Y 6
 j .w - w -  j$- 
 ?
? `F` `3Y I `3Y C r C ?c= t Y Õ
 j  -  -  js- 
 K
`5V 1 ` g t ` f
 j  - )l
b -  4 %)m

)
T.ZAU 1 Y 1 , / r}e t 4 j )'&)&
- u.'6
No/FN `5Y
La CPU Intel 8086: Architettura e Programmazione Assembly 173

No/FN < Y
Y[Z 1 `3Y t?   'Õ9Ž - > -  j$- 
K
CD/cE ` <  K3G ‚ I 5
` , t CÖ j bu%u - )‘• 9)w - 
Y[Z 1 KMG t Y 6
 j .w - w - b j$- 
 Å1
`5V 1 1 g t ` .
%b j % -
bw -  –
)'
T.ZAU 1 Y 1 , / rR
? `F` < Y I `3Y C r C A ? = t?  9Ž - > 6w -  js- b 
?
< X K `3Y I `3Y C r C ?A= t ?  &9b -  -   $j -  &
% K
, / / N 1 Y 1 , / r&P
@ V =
C / , = YN _
D , Y 1 ? UÑY / ZAV VoZA` N

,V3a$a Y r C ?A=#@ Y 1 V N @ / 1 Z3V ?A@


CD/cE 1 GJI `5Y C r C ?A=c  `AY C r C ?c= t Z  j .v4>Q b - 
1 Y 1 , / r\
, V =q= X @B?  1 ? ,\, ,6V3asa V r ZAX C V @ / t , % y)l> j .Œ ¢)† y ? ,
CD/cE  KiG ‚ IL? , t CÖ j &u.u - ) - )  -
Y[Z 1 KMG t Y 6
 j .w - )‘w - 
, / / N 1 Y 1 , / r ,\V =q= X @B? t 10 - ‰& -
Å1 GF‹ ]

@ V =
,V3a$a Y r C ?A=#@ Y 1 V V_ZA` N

<>=#? CON ?sr C ?A=#@ Y 1 V N @ /$1 ZiV ?A@


CD/cE 1 GJI `5Y C r C ?A=c  A` Y C r C ?c= t Z  j .v4>Q b - 
1 Y 1 , / r}<=q? CªN ?  CD/FE ? , Im K3G ‚ t , % y)k j %
1 ? ,o, <=q? CN ?sr ZAX C V @ / t <  -j  - )Q
w bß4> ? ,
Y[Z 1 KMG t Y 6
 j .w - )‘w - 
, / / N 1 Y 1 , / r}<=q? CªN ? t 10w - ‰& -
Å1 G$‹ ]

@ V =
<>=#? O C N s ? r C ?A=#@ Y 1 V VZA` N

,V3a$a$V r ZAX C V @ / N @ / 1 Z3V ?A@


Z3X /AE ?$r ,_V =#= X B
@ ?  C‡/cE ?0gI ]^¥ t”< .nž&u% ` / < p @ - 4¦h .§^ - 4Î1 - 
 
Y[Z = R"P t › ' w V
p
  
1MCON ? , I p}]wp t”< )k - 9bv> j bv %p ™ p ]žp
T 1 Z0X /AE ?sr ,_V =#= X c @ ? t )  y - )&† - 9
1MCON ? , I p}Éwp ˜ P t”< )k - 9bŒ %p Ú p ɞpJ y) 
T.Z 1 Z3X /cE ?sr ,\V =q= X B @ ? t > - )'
x YŽZAV r ,_V =#= X @q?  < X K ? , I p ]—p t < > - ) - - 9 4> .Q j .bQ ?5< 1 YŽY
@ V =
,V3a$a$V r ZAX C V @ / V_Zc` N
174 A.Broggi

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@


CD/cE ? GId< Via
0 ` < V3a
CD/cE ` <ÑIL?0G
@ V =
Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV VoZA` N

<>=#? CON ?sr ZBX C V @ / N @ /$1 Z3V ?A@



@ V =
<>=#? CON ?sr ZBX C V @ / V_ZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V ?A@



@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N

1 < V3a VoZB` <


VZA` C ? YŽZ
La CPU Intel 8086: Architettura e Programmazione Assembly 175

CALCOLATORI ELETTRONICI
Prova scritta
18 febbraio 1992

Scrivere un programma assembler che calcoli i primi 400 valori della sequenza
generata con la seguente legge:
xi è 1 éŒê axi ë b ê mod256
dove a e b sono numeri compresi fra 0 e 255.
Il programma deve:
å Acquisire i valori di a e b;

å Visualizzare la sequenza su 20 righe di 20 numeri con il seguente formato:

bbb1bb25b145bb30b100bbb0 ì&ìì

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .) P© ‰ % - ' P ÉÉ R

` < V3a < V0a C ViZ = N A ? @B? N X K ,oY 1 p ` ?B=q? p


Z3X C r Y = V @B? UÑY / ZBY VMWFX ~ ]]
G ] VoW X ]
? ` K œ
K ` K œ
C ?F< 1 g V B
@ ? ` K œ
` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9
176 A.Broggi

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

C ? YŽZ N @ /$1 x2?A@


N X <wg ` < t Y 9bbu%m4 - ) - 9
 - b < V CªN @ V
C /cE
D ?0GI ]] t - )Q&6
'v4> %Q> -jkj •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? UÑY / ZBV
1 ? ,o, N @ V < VHZ =q? UÑY / ZAV
1 ? ,o, ,ÕViaaFY r ZAX C V @ / t , % y j %Œ Ò)ä y ? ,
CD/cE  ? ‚ IL? , t ,  j j 'u.u -  ?
1 ? ,o, ,ÕViaaFY r ZAX C V @ / t , % y j %Œ Ò)ä y ? ,
CD/cE  K ‚ IL? , t ,  j j bu%u -  K
CD/cE ? , IJG ] t Y u% - )&u%u - G ]† ? ,
CD/cE 1 GJI Z3X C r Y = V @q? U2Y / ZcY t 13> - 
1 Y 1 , / r N @ Y Z 1 Y N ? ,_V LN X <wg 1 G t < - )'n - 1 G
N X <wg ?HG
1 ? ,o, <=q? CN ?sr ?cG t <  -j  - )l j .bv ? ,
No/FN ?0G
C XA, Koà = V N =#@  ? ‚ tA?0G ‹  ? ‚  >? ,
? `F` ? , ILK\ÃF= V N =q@  K ‚ tL? , ‹ 7ƒ7 ? ‚  >? , ; ˜  K ‚‡; j z4 R ¨ €
No/FN 1 G t @ '9bb - 1 G
, / / N 1 Y 1 , / r N @ YŽZ 1 Y N ? ,_V
@ V = t @ ' - ) <  9Ž jl- /3 % - &nž
C ? ŽY Z V_ZA` N

<>=#? CON ?sr ?qG N @ /$1 Z3V ?A@


1 ? ,o, <=q? CN ?sr K Y ? Z 1#/ t <  -j  - )k j ’ 
-  - b %  - 

G / @ ?3gsI}?Ag t ? u%u % - )k“ % 9 0 ? g
CD/cE  C ?F< 1 g V @c? ‚ I ] t ? uu. % - ) -äjs- 9b
. -

CD/cE 1 , IQP ]]
1 ? ,o, <=q? CN ?sr 1 ?c@c?A=h=
CD/cE 1 , IQP ]
1 ? ,o, <=q? CN ?sr 1 ?c@c?A=h=
CD/cE  C ?F< 1 g V @c? ‚ I&P
1 ? ,o, <=q? CN ?sr ZAX C V @ /
@ V = t @ '   - )) - bz
 .4w -
 -jk- w

<>=#? CON ?sr ?qG V_ZA` N
La CPU Intel 8086: Architettura e Programmazione Assembly 177

<>=#? CON ?sr 1 ?A@c?B=q= N @ / 1 Z V A


0 ? @
N X <wg ?HG
Y[`AY E 1 ,
/ @  C ?F< 1 g V B @ ? ‚ IL? , tZ 
  -    . - ? , %pL4"n^ %9v4 - ] I
t )- C F ? < 1 g V @q? "4 n— w - p w]>p
1 ? ,o, <=q? CN ?sr ZAX C V @ / t <  -j  - ? ,
A
C XA, 1 ,
CD/cE K , IL? ,
No/FN ?0G
< X K ? , ILK ,
@ V =
<>=#? CON ?sr 1 ?A@c?B=q= V_ZA` N

<>=#? CON ?sr ZBX C V @ / N @ /$1 Z3V ?A@


N X <wg ?HG ”t < - )n - ?0G
C /cE
D K , IL? , ”t < ? , ¢) - C ?c< 1 g V @B? 9•’] I
/ @ K , I  C ?F< 1 g V @c? ‚ t 9Š -j  - ˆ - 
%v b4 9b
 
T.ZAU <"=q? CON ?sr ZcX C
1 ? ,o, <=q? CN ?sr K Y ? Z 1#/
T N x YŽZcV r <w=q? CON ?
<>=#? CON ?sr ZBX CÒ ? ` ` ? , I p}]wp t ,_- - 9b –4 -
Q - b&  pQp ]—p
1 ? ,o, <=q? CN ?sr 1 gc?A@ ”t <  ->j  - )l
-  -   – ? ,
x YŽZAV r}<=q? CN ?  NM/FN ?0G t @  9& - ?0G
@ V =
<>=#? CON ?sr ZBX C V @ / V_ZA` N

<>=#? CON ?sr K Y ? Z 1h/ N @ /s1 Z0V A


? @
N X <wg ?HG t”< - )n - ?0G
CD/cE ? , I plp t 1 - 
-  ? , )l
b4&
% 4Öpp
1 ? ,o, <=q?  C N ?sr 1 gc?A@ t”<  ->j  - )l
-  -   – ? ,
No/FN ?0G t @ 9& - 0? G
@ V =
<>=#? CON ?sr K Y ? Z 1h/ V_ZA` N

<>=#? CON ?sr 1 gA?A@ N @ /s1 Z3V ?c@


N X <wg 1 G t”< - )'n - 1 G
C /cE
D ?3gsI ] V t”< .n^u K Y / < p ›  ' ä1 - %p
 
CD/cE K , I] t N - & -v- b&n -
CD/cE 1 GJI ]]] P t <  ->j  - Ä9“)v
-  - b %b

178 A.Broggi

Y[Z = P ]

No/FN 1 G t @ ' 9bb - 1 G
@ V = t @ ' - )) -   bz
 .4w -
 -jk- w

<>=#? CON ?sr 1 gA?A@ VoZA` N

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@


CD/cE ? GId< Via
0 ` < V3a
CD/cE ` <ÑIL?0G
@ V =
Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV VoZA` N

,V3a$a Y r ZAX C V @ / N @ /s1 Z3V ?c@



@ V =
,V3a$a Y r ZAX C V @ / VoZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V ?A@



@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N

1 < V3a VoZB` <


VZA` C ? YŽZ
La CPU Intel 8086: Architettura e Programmazione Assembly 179

CALCOLATORI ELETTRONICI
Prova scritta
7 aprile 1992

Scrivere un programma in assembler che, dato un numero compreso fra 0 e 99, calcoli tutte le
potenze dello stesso fino a raggiungere il numero massimo contenuto in 32 bit. Il programma
deve:
å Accettare da tastiera il numero.

å Presentare su video la serie di potenze significative.

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .)D¥ - ') P ÉÉ R

` < 3 V a < V0a C ViZ = N A? @B? N X K ,oY 1 p ` ?B=q? p


Z3X C V @ / `5› œ
` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
180 A.Broggi

C ? YŽZ N @ $/ 1 x2?A@
N X <wg ` < t Y 9bbu%m4 - ) - 9
 - b < V CªN @ V
CD/cE ?0GI ]] t - )Q&6
'v4> %Q> -jkj •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? UÑY / ZBV
1 ? ,o, N @ V < VHZ =q? Ñ U Y/ AZ V
1 ? ,o, ,ÕViaaFY r ZAX C V @ / t , % y)k j .Œ ¢) j j bu%u -
t  .)Q“ %&9b ?iG 
CD/cE Z3X C V @ / IL?iG t CÖ j &u%u - )k j %
CD/cE ` GJI ] t ? u%u%  - ) -  - b - ) - 4" . e%R '
t ` G  ?BG  Ê) -äj ))&
- u 
1 Y 1 , / r N @ Y Z 1 Y N ? ,_V ‘1 ? o , , <=q? CªN ?sr ZAX C V @ / t <  -j  - )k j .Œ ` G  ?cG 
1 ? ,o, C‡/ , = Y N ,_Y 1 ? U2Y / ZAV t V 9b %  ZqX C V @ /c‚   ` G  ?cG È[Ú ` G  ?BG
t “&b - 4wŒ) U %b x ) -  - 4 P
t 9Š {4> .n^ • %' . - b 
T*U 1 Y 1 , / r N @ YZ 1 Y N ? ,oV
@ V = t @ ' - ) <  9Ž jl- /3 % - &nž
C ? ŽY Z V_ZA` N

CD/ , = Y N ,_Y 1 ? UÑY / ZAV N @ s


/ 1 Z3V A
? @
N X <wg ? G
H t”< - )n -  P€ '¹4> ?0G 9“))& <  -

C /cE
D ? GI ` G
0 t CÖ)'&)&
-  P€ ¹'pL9“&'‰Š È
C XA, Z0X C V @ / t
- bn—Q> %Ò) Z3X C V @ / È[Ú ` G  ?BG
G 1 g a `  G I 1 G t N« )‘•9b)' - vÎ1 G  ?cG
G 1 g a K\GJLI ?0G t N| )l“9)' - ŒÄ1 G  K3G
No/FN ?0G t @ 9& -  P€ ' j %v9“&&‰Â
C XA, Z0X C V @ / t Ò) j )')&
-  % Z3X C V @ / I   È
t  .4wŒ)k• 9)& - bv ` G  ?cG
t Y )Q“9)' - †‰' - ) - 64w - pJÑ
? `F` ` GJILKMG t ` G  ?BG ˜
t 1 G  K5G ‹
tíÈȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ
t 1 G  ` G  ?cG
? ` 1 1 GJI ] t < Å1 G pJ> - ) - u % I  )
t U %b x ) -  - 4ˆŒ .Ò• %' % - b
@ V =
CD/ , = Y N ,_Y 1 ? UÑY / ZAV VoZA` N
La CPU Intel 8086: Architettura e Programmazione Assembly 181

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@


CD/cE ? GId< Via
0 ` < V3a
CD/cE ` <ÑIL?0G
@ V =
Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV VoZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V ?A@



@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N

,V3a$a Y r ZAX C V @ / N @ /s1 Z3V ?c@



@ V =
,V3a$a Y r ZAX C V @ / VoZA` N

<>=#? CON ?sr ZBX C V @ / N @ /$1 Z3V ?A@



@ V =
<>=#? CON ?sr ZBX C V @ / V_ZA` N

1 < V3a V ZB` <


o
VZA` C ? YŽZ
182 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
1 giugno 1992

Scrivere un programma assembler che accetti un numero decimale in base 10 con il seguente
formato: zz,zzz e ne calcoli la trasformazione in base 2 con il formato xxxxx,xxxxx. La trasfor-
mazione è ovviamente approssimata.
Il programma deve stampare come output:
å La trasformazione in base 2 xxxxx,xxxxx.

å La ritrasformazione in base 10 esatta del numero in base 2 calcolato al punto precedente.


La CPU Intel 8086: Architettura e Programmazione Assembly 183

CALCOLATORI ELETTRONICI
Prova scritta
17 luglio 1992

Scrivere un programma in assembler che, dato un numero compreso fra 0 e 999, lo scompomga
nei suoi fattori primi. Il programma deve:
å Accettare da tastiera il numero.

å Presentare su video la serie dei suoi fattori primi con la relativa molteplicità.

Esempio: 150 = 2 3 5(2)

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .) P ¥Å)—) P ÉÉ R

` < 3 V a < V0a C ViZ = N ?A@B? N X K ,oY 1 p ` B ? =q? p


C ?cGr ZAX C r}x|?A=q= / @ Y VMWAX P ¥
` ?A= Y ` ›
3 C ?qGr ZcX C }r x|?A=#= / @ YÍ5 ` X NB7 œ ;
` < V3a V ZA` <
_

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p
184 A.Broggi

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

C ? YŽZ N @ /$1 x2?A@


N X <wg ` < tY 9bbu%m4 - ) - 9
 - b < V CªN @ V
C /cE
D ?0GI ]] t - )Q&6
'v4> %Q> -k
j j •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? UÑY / ZBV
1 ? ,o, N @ V < VHZ =q? UÑY / ZAV
1 ? ,o, ,ÕViaaFY r ZAX C V @ / t , %  y)k j .Œ ¢)† y ?0G
1 ? ,o, < 1q/ACON5/ ZBY t <
% j  ?iG
1 ? ,o, <=q? CN ?sr / X = N X = t”<  -j  - )l•9b)& - 
@ V = t@ ' - ) <  9Ž jl- /3 % - &nž
C ? YŽZ V_ZA` N

< 1#/ CON5/ ZcY N @ / 1 ZiV ?A@ t ,  j '  ] ™ ?0G ™ € ¨¨ e ¨


CD/cE K\GJI / x|x«< V = ` A ? = Y t N|6w -v- )')•p&&u%&vub - 4 - 
Z3X /AE ?$r< 1 ? Z < Y / ZcV  C¤/cE 1 GIdR t N«b j †‰ -  4 -
Žw)') - 
1 Y 1 , / r}< 1q/ACON5/ ZqY  G / @ ` GJI ` G t ? u%u%  - ) -  - b - ) - 4" .)m4>n^ 4w .4w
N X <wg ?HG t”< - )n - )k j 
`3Y E 1 G t ` n^ 4w  .Ò)d‰ - bb
1MCON ` GsI ] ”t < y) - 4"n—&9' –Ä4 - • .9bŒ)&) I
T.ZAU N @ / << Y CÏ/ r | x ?A=#= t n -
ŽÄ)‘z99b j †‰ - >
CD/cE  KiG ‚ I 1 G t CÖ j uu - )‘‰ - 
? `F` KMGJIJR t ?  - )l> - 
No/FN ` G t = )' {4 - ))'’9“ -
%Óߐ4 - Œ
t &8pL9•'6‰Š
- n^
1MCON ?0GJIQP t @ . % - ) - 
% .4w - 9Š)&’9“
T.ZAU Z0X /AE ?$r < 1 ? Z < Y / ZcV tA?0G pL4'n— %9’4 - P
T CON x YŽZcV r < 1q/FCªN3/ < YbU
N @ / << Y CÍ/ r}x|?A=h=  N\/AN ?0G t @ 9' - )k4&nž 4w %64w
Y[Z 1 1 G t NHbn -
)kbz99b j Œ‰ - 
T CON 1 Y 1 , / r< 1#/ CON3/ ZcY t @ %' . - ) - bz
 .4w -
x YŽZAV r}< 1q/ACON5/ < YU  C‡/AE › / @ ` N =q@  K3G ‚ I ] t CÖ j bu%u -  js- Ӟ %Ò %Ò}4—  È
t ‰&
-  ) - ‰' {4> m4 - 
@ V =
< 1#/ CON5/ ZcY VZA` N

,V3a$a Y r ZAX C V @ / N @ /s1 Z3V ?c@


 t , .> – j .bv ¢)Œ>6 y ?iG
La CPU Intel 8086: Architettura e Programmazione Assembly 185

@ V =
,V3a$a Y r ZAX C V @ / VoZA` N

<>=#? CON ?sr / X = N X = N @ / 1 Z0V ?A@


CD/cE K\GJI / x|x«< V = ` ?A= Yb˜ R×t N«w - b - )) - u> - 4 -  ˜ R
CD/cE ` GJIm KiGcÈÂR ‚ t , % y)k j Œ‰ - 
Z3X /AE ?$r C/ , = V N ,  CD/cE 1 gIQP t NH - 4 P ) -äj )' %)&
' - p
1 Y 1 , / r ,\V =q= X @B?  CD/FE ?0GsIm K3G ‚ t , % y)k‰ - b
? `F` KMGJIJR t N«w -Œ- )Qz99 j †‰ - b
1MCON ?0GJI ` G t , v
‰[w -
ŽÄ)‘ .
 f4w w 
T.ZAU Z0X /AE$/ r |
x A
? #
= = t 9“ –4>&nž .9 I n -v- 9“ -j  - 
Y[Z 1 1 g t <  - ) I 
J) -Åj )' %)&
 - p
T CON 1 Y 1 , / r ,_V =#= X @B? t Ò“ %&  - ) - z
 .4 -
Z3X /AE$/ r}x|?A=q=  1 ? ,_, <>=#? CªN ?$r x|?A=#= / @ V t <  -j  - Qp ` G 7Â1 g ;»p
CD/cE ` GJIL?iG t N| –)kn^v‰ - b  ` G
1MCON ` GsI ] t”< y p - )l• % j  –4> %m4 -  I
T.ZAU Z0X /AE ?$r C/ , = V N , t • %' . - ) - bz
 .4 -
@ V = t - )& j .wQ 9

<>=#? CON ?sr / X = N X = V_ZA` N

<>=#? CON ?sr x|?B=q= / @ V N @ /$1 Z3V ?A@ t ` G


b>b % y)k j %v4 - 9“ -j  - 
 t j .w {1 g ) -äj ) %)'
' - p
@ V =
<>=#? CON ?sr x|?B=q= / @ V VoZB` N

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@


CD/cE ? 0 
G Id< Via ` < V3a
CD/cE ` <ÑIL?0G
@ V =
Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV VoZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V ?A@



@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N

1 < V3a V ZB` <


o
VZA` C ? YŽZ
186 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
17 settembre 1992

Scrivere un programma in assembler che esegua la trasformazione fra numeri in basi diverse. In
particolare il programma deve:

1. Accettare da tastiera un numero K che rappresenti la base della numerazione del primo
numero.

2. Accettare da tastiera un numero N nella base prima indicata.

3. Accettare da tastiera un numero L che rappresenti la base di numerazione nella quale occorre
trasformare il numero N.

Il programma deve fornire il numero specificato ai punti 1) e 2) nella base indicata in 3). Sono da
considerare i seguenti limiti:

1. 2 î K ï L î 20.

2. Il valore del numero rappresentato da N(baseK) deve essere minore di 65536 (decimale) =
216 ; in caso contrario il programma deve segnalare errore.

3. I numeri da usare per K ed L sono:

2ð 2 ïbììì 9 ð 9 ï 10 ð A ïìì&ì 20 ð Kì

4. Gli stessi simboli devono essere usati per rappresentare i numeri.


Esempio: 23B (base C) = 335 (base A).

E’ facoltativo estendere la condizione 2 fino a 232


La CPU Intel 8086: Architettura e Programmazione Assembly 187

Traccia per la risoluzione

= Y = ,\V È N_bn - <


% - 4> .) P ¥ä9• b j b P ÉÉ R

` < V3a < 0 V a C ViZ = N ?A@B? N X K ,oY 1 p ` ?B=q? p


V_Z = V @ VMWAX P e
,YŽZAV x V0VH` V\WFX P ]
Z3X C V @ / `5› œ
V @B@ / @ V ` K VoZ = V @ I ,YŽZAV x ViVi` I ,YŽZcV x ViV0`
` K p Y )Q j %Œ9 %b&v p'p js- & –4> P€ & Ð p
Y[Z < V @Fr K5?F< V ` K VZ = V @ I ,YŽZAV x V0VH` I ,YŽZcV x ViV0`
` K p Y 69b %b ) - - 9 > Ð p
Y[Z < V @Fr ZAX C V @ / ` K VoZ = V @sI ,YZBV x V0Vi` I ,YŽZAV x V0VH`
` K p Y 69b %b )‘ j % Ð p
C V <<Ñr / X = N X = ` K V_Z = V @sI ,YŽZAV x ViV0` I ,YŽZAV x V0VH`
` K p Y )Q j %v
bnž .&v pp Ð p
` < V3a V_ZA` <

<>=#? 1h¦ C < V3a C ViZ = N A ? @q? <"=q? 5 1 ¦ p <—=#? 51 ¦‘p t Eq % - )&)&z
-  -  - ub - 4
` K €~ `5X NBb7 p PfRe~ ¨ € ¥ © p ; t j j   b -  .Ò) <  -
%Ó6J
<>=#? 1h¦ C V_Zc` < t :wb € ~ž >© §^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15¦ C
1 < V3a < V3a C V0Z = N ?AB @ ? N X K ,Y 1 ¡p 15/ ` V p

t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt
t 1\vb
& - ) 4 %)Q -jkjl- t
t ȊȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȕȕȕȓȕÈ:ȓȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕÈ:ȓȕȕȓÈ:ȕȓȕȓÈ:ȕȓȕȕȕȕÈt

C ? YŽZ N @ /$1 x2?A@


N X <wg ` < t Y b9 bu%m4 - ) - 9
 - b < V CªN @ V
C /cE
D ?0GI ]] t - )Q&6
'v4> %Q> -jkj •Ô

N X <wg ?HG t
1 ? ,o, Y[ZcYbU2Y ? ,YbU_U ? Ñ U Y / ZBV
1 ? ,o, N @ V < VHZ =q? U Y / ZAV
Ñ
1 ? ,o, ,ÕViaaFY rKh?F< V t , .  - 9b t  y•9b)'%J ? , ?3g
1 ? ,o, ,ÕViaaFY r ZAX C V @ / t , % y)k j .Œ %)&) - - 9b
188 A.Broggi

t 9Š6 %
&‰[
-  - 4 - ? , ¢)†  ?0G
<>=#? CªN ?sr V @B@ / @ V
T 1 t”< ڍP€ '¹9Š -j  -   4ˆ 9
%
C /cE
D  ZqX C V @ /c‚ IL?HG t CÖ j bu%u%Œ)k j %
1 ? ,o,
,ÕViaaFY rKh?F< V t , . ) - - 9b y Ò)†  ? ,
1 ? ,o,
<=q? CN ?sr ZAX C V @ / t <  -j  -  ZBX C V @ /B‚m .)') - - 9b 4w
-  -
x YŽZcV
T CON t  ? , 4 b9

<>=#? CON s
? rV c
@ @ / @ V  C‡/cE ` GI / x|x«< V = V @B@ / @ V t CÖ %99 - v4>Q 
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ? t”<  -j  - ) j .99 - '
x YŽZAV  @ V = t @ ' - ) <  9Ž jl- /3 % - &nž
C ? YŽZ V_ZA` N

,V3a$a Y r Kh?A< V N @ / 1 Z0V ?A@


CD/cE ` GJI / x|x«< V = Y[Z < V @$rK#?F< V
1 ? ,o, <=q? CN ?sr<w=#@ YŽZFa ? t”<  -j  -Œj .99 - v4>Q9 . j .w
CD/cE 1 , I p ¦Jp ˜ P t ,  j ' –9“8L
-  -   –Ì) b -
Z3X /AE$/ r 1 ?B@c?A=h=  1 ? ,_, ,V0asa$Y r 1 ?A@q?A=q= t , %m
-  - b %b {
ŽÄ) j &
1MCON ? , I V_Z = V @ t < y %pJ9“ - Œ j w V_Z = V @
T*U Z0X /AE / r 1 ?A@B?A=#= t ) Q - )&’
-  - b .
1MCON ? , I pR p t”< ) - - 9 y4w
-  - p ™ R
T 1 Z0X /AE / r 1 ?A@B?c=q= t ) Q - )&b’
-  -  .b
1 ? ,o, <=q? CN ?sr 1 ?c@c?A=h= t”<  -j  - )Q
-  - b . y) 
@ V =
,V3a$a Y r Kh?A< V VZA` N

,V3a$a Y r 1 ?A@B?A=#= N @ /s1 Z3V ?A@


1 Y 1 , / r\
, V =q= X @B?  CD/FE ?3g$I ] © t < %nž&u.' ` / < p @ - 4ˆ¦h %§— - 4Ø1 - 
 
Y[Z = R"P t › ' w V
p
  
1MCON ? , I p ɗp ˜ P t”< )k - 9bŒ %p ™ ‹ p ɞp I - ))' -
T 1 Z / r 1#/ Z E V @A< Y / ZAV t 9 - )' - ) -
Žn— %9  js- &
 9
)&
? ZA` ? , I ] ` x t 13n^ .b y j$- 9b
%)&

Z / r 1#/ Z E V @c< Y / ZBV  1MCON ? , I V_Z = V @ t < 9•Q j VoZ = V @ I
T*U x YŽZcV r ,_V =#= X @q? t • . j & - ) - )  -
1MCON ? , I p}]wp t”<  p j ' –4>ƒp ]—p
T 1 1 Y 1 , / r ,oV =q= X @B? t - ))& - “&)& % y)Q
-  - b .
1MCON ? , I 1 , t , v
‰[w -
)‘) j 
T.Z 1 1 Y 1 , / r ,oV =q= X @c? t z9΀1 ,
1MCON ? , I p}Éwp ˜ P t”<  pL
b j 6b .9b†: - p ]—pJ »p ɗp
T 1 x YŽZcV r ,oV =q= X @B? t - ))& - “ . j & - ) - ) (b -
1MCON ? , Ip? p t”<  p Ú p}ÉwpJ ™ p ? p
T 1 1 Y 1 , / r ,oV =q= X @B? t - ))& - “&)& % y)Q
-  - b .
1MCON ? , I 1 , t , v
‰[w -
)‘) j 
T.Z 1 1 Y 1 , / r ,oV =q= X @c? t z9΀1 ,
La CPU Intel 8086: Architettura e Programmazione Assembly 189

1MCON ? , I1 , t”< – p js- & 4‡1 ,


T.Z 1 1 Y 1 , / r ,oV =q= X @c? t - )') - •&)& . )k
-  - b %
x YŽZAV r ,_V =#= X @q?  CD/FE ?3gIL? , t N«  ?ig )l•9b)& - Œ׉ jl-
< X K ?3gsI p ]žp t   ?5< 1 YÂY td< b - †p ]—p
1MCON ?3gIQP ] t < y %p j & yy - ) - É
T 1 1 Y x|@q?sr ` V 1 Y C ? ,\V t • % j & - ) - )  -
< X K ?3gsI p ? p È pÉwp ÈbP t ? )&b  j bQ)†b -  .)Q - 
1 Y x|@B?sr `FV 1 Y C ? ,oV  @ V =
,V3a$a Y r 1 ?A@B?A=#= VoZA` N

<>=#? CON ?sr 1 ?A@c?B=q= N @ / 1 Z0V ?A@


N X <wg ?HG ”t < - )n - )l
bw b’4 ?HG
C /cE
D ?3gsI ] R t”< . nž&u% ` / < p¡1 -  -
( %à/5wp

CD/cE `5, IL? , t Y 64w
- )Q
-  -  % –4 - 9“ -j  - 
Y[Z = R"P t”<  -j  -

No/FN ?0G t @ 9& - ?0G
@ V =
<>=#? CON ?sr 1 ?A@c?B=q= V_ZA` N

,V3a$a Y r ZAX C V @ / N @ s / 1 Z3V ?c@


N X <wg ? G
H t”< - )n - )l
bw b’4 ?HG
C /cE
D ` GJI / x|x«< V = Y[Z < V @$r ZAX C V @ /
1 ? ,o, <q = ? CN ?sr<w=#@ YŽZFa ? t”<  -j  -Œj .99 - v4>Q9 . j .w
No/FN ?0G t @ 9& - ?0G
CD/cE 1 J G IJ?0G t ,  j & –9“8L
-  -  .b Ì) b -
t  ? , ¢n - )' –4> %)) - - 9b – ?3g
G / @ K\GJILKMG t ? u.u% % - )l•9b)& - v - u. - )&
1 Y 1 , / r ZAX C V @ /J ?
1 ,\, r
,6V0asa Y 1 A
? B
@ A
? #
= = t , % yÄ
-  -  %b {4 -  - 9Ž& . -
1 ? ,o, <=q? CN ?sr 1 ?c@c?A=h= t”<  -j  - )Q
-  - b . y) 
1MCON ? , I V_Z = V @ t < y %pJ9“ - Œ j w V_Z = V @sI • . j ' -
T*U x YŽZcV r ZAX C V @ / t ) - )  - b4 9
–9“ %u - 1 - b§Ñ
G 1 g a ?iGJILKMG t”<
-j  - ?0G KMG > %¹) -Åj )''6)'
- u
CD/cE K , IL?0g t < - )n - ) -  - b - ) - 4 %)Q•&9)& - 
C XA, 1 g t ?qG ‹ 1 g  "? ,
CD/cE ` GJIL?iG t”< - )&n - )‘• 96) - Œ - u - )' – ` G
CD/cE ? , ILK , t 1 - &
- ) -  - b - ) - 4> .)Q•&9)& - 
C XA, 1 g t ?qG ‹ 1 g  "?Ag
? `F` ` gIL? , t N| – ` G )k•&9)& - Œ‰' - )
T 1 x YŽZcV r ZAX C V @ / t < js- ' –4> P€ & I : . j & -
1MCON ?3gIQP t < ?0g pL4>n^ .9bv4 - u % I 4> n—
1MC1 t 9
& –
ˆ)D1 - § - 4 P
T 1 x YŽZcV r ZAX C V @ / t < js- ' –4> P€ & I : . j & -
190 A.Broggi

? `F` `5, ILKMg t <  jkjk- K|g - )Q“9%J - bu% - )& ` G 


? ` 1 ` gI ] t    -  - 64wŒ)D1 - §
CD/cE K\GJI ` G t N« –)k•9b)' - v K\G
T.Z 1 1 Y 1 , / r ZcX C V @ / t 10%nž .‰[)! I 9
 –4 - )&) - •
 &
x YŽZAV r ZAX C V @ /L CD/FE ?iGJIJKMG t NH y ?iG )k• 9)& - b
@ V =
,V3a$a Y r ZAX C V @ / VoZA` N

<>=#? CON ?sr ZBX C V @ / N @ $ / 1 Z3V ?A@


N X <wg ?HG t”< - )n - )l
bw b’4 ?HG
CD/cE ` GJI / x|x«< V = C V <<Õr / X = N X =
1 ? ,o, <=q? CN ?sr<w=#@ ŽY ZFa ? t”<  -j  -Œj .99 - v4>Q%w
N /FN
o ?0G t @ 9& - ?0G

@ V =
<>=#? O
C N ?sr ZBX C V @ / V_ZA` N

<>=#? CON ?sr<w=#@ YŽZFa ? N @ / 1 Z3V A


? @
CD/cE ?3gsI ]É t < %n^u%& ` / < p NH' < &p

[Y Z = R"P

@ V =
<>=#? O
C N ?sr<w=#@ YŽZFa ? V_Zc` N

Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV N @ /s1 Z3V ?A@


CD/cE ? GId< Via
0 ` < V3a
CD/cE ` <ÑIL?0G
@ V =
Y[ZcYbUÑY ? ,oYUU ? U2Y / ZAV VoZA` N

N @ V < ViZ =q? U2Y / ZAV N @ /$1 Z0V ?A@



@ V =
N @ V < ViZ =q? U2Y / ZAV V_ZA` N

1 < V3a V ZB` <


o
VZA` C ? YŽZ
La CPU Intel 8086: Architettura e Programmazione Assembly 191

CALCOLATORI ELETTRONICI
Prova scritta
19 novembre 1992

Scrivere un programma in assembler che, dato un numero compreso fra 0 e 64000, ne calcoli la
radice quadrata e la radice cubica con approssimazione all’intero inferiore. Il programma deve:
å Accettare da tastiera il numero.

å Presentare su video:

– la radice quadrata e il quadrato approssimato.


– la radice cubica e il cubo approssimato.

Esempio:
numero: 1612
radice quadrata: 40 1600
radice cubica: 11 1331

CALCOLATORI ELETTRONICI
Prova scritta
8 febbraio 1993

Scrivere un programma in assembler che:


å Accetti da tastiera 10 numeri compresi tra -9999 e 9999.

å Li ordini in modo crescente.

å Li visualizzi sullo schermo.

In una prima fase realizzare il programma indicato considerando solo numeri positivi.
192 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
6 aprile 1993/1

Scrivere un programma in assembler che muova di una posizione un cursore (qualsiasi) sullo scher-
mo nelle quattro direzioni (nord, sud, est, ovest) utilizzando come comandi quattro caratteri diversi
definiti a priori.
Il programma deve inoltre:
å partire con il cursore circa al centro dello schermo,

å quando il carattere raggiumge uno dei bordi impedire che esca dallo schermo.

Nel loop principale del programma e’ opportuno inserire un ritardo; considerare la posizione
piu’ opportuna nel loop per il ritardo stesso.
In una prima fase realizzare il programma indicato non considerando controlli sui bordi dello
schermo.

CALCOLATORI ELETTRONICI
Prova scritta
6 aprile 1993/2

Scrivere un programma in assembler che muova automaticamente un cursore (qualsiasi) sullo


schermo in una delle quattro direzioni (nord, sud, est, ovest). Utilizzare quattro tasti qualsiasi
per fare cambiare la direzione di spostamento del cursore.
Il programma deve inoltre:
å partire con il cursore circa al centro dello schermo,

å considerare lo schermo una struttura toroidale.

Nel loop principale del programma e’ opportuno inserire un ritardo; considerare la posizione
piu’ opportuna nel loop per il ritardo stesso.
In una prima fase realizzare il programma indicato non considerando controlli sui bordi dello
schermo.
La CPU Intel 8086: Architettura e Programmazione Assembly 193

CALCOLATORI ELETTRONICI
Prova scritta
1 giugno 1993/1

Scrivere un programma in assembler che accetti in ingresso una frase con un massimo di 500
caratteri e che di questa calcoli:
å il numero di parole (si considerano separatori: lo spazio, i segni di punteggiatura, gli apo-
strofi).
å la lunghezza massima e la lunghezza minima delle parole.

å la lunghezza media delle parole (questo valore deve essere calcolato con una cifra decimale
significativa).

CALCOLATORI ELETTRONICI
Prova scritta
21 luglio 1993/1

Scrivere un programma in assembler che accetti in ingresso una frase con un massimo di 500
caratteri e che successivamente:
å chieda all’utilizzatore di indicare un carattere o una sequenza di caratteri (max 4 caratteri).

å risponda indicando tutte le parole nelle quali compare il carattere o la sequenza di caratteri
precedentemente indicata.
å si considerino separatori fra parole gli spazi e i segni di punteggiatura: punto, virgola, due
punti e punto e virgola.
194 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
15 settembre 1993

Scrivere un programma in assembler che:


å Accetti in ingresso un numero a una cifra.

å Visualizzi il numero sullo schermo con un’altezza di circa 5 cm in una schematizzazione a 7


segmenti.

Ripetere il secondo punto considerando:


å Numeri a 2 cifre.

å Numeri con un numero di cifre qualsiasi compreso fra 1 e 4.

CALCOLATORI ELETTRONICI
Prova scritta
5 ottobre 1993

Scrivere un programma in assembler che:

1. Accetti da tastiera una stringa contenente al massimo 80 caratteri.

2. Accetti da tastiera una stringa contenente al massimo 4 caratteri.

3. Determini e visualizzi il numero di ricorrenze della seconda stringa nella prima stringa.

In una seconda fase si consideri la seconda stringa formata di esattamente 4 caratteri, e si de-
termino i numeri di ricorrenze parziali formate da solo 3 caratteri e 2 caratteri nell’ordine stabilito
dalla seconda stringa (matching approssimati a 3 o 2 caratteri).
La CPU Intel 8086: Architettura e Programmazione Assembly 195

CALCOLATORI ELETTRONICI
Prova scritta
3 novembre 1993

Scrivere un programma in assembler che:

1. Accetti da tastiera una stringa contenente 8 caratteri ASCII.

2. Visualizzi tale stringa in formato esadecimale.

3. Aggiunga un bit di parità ad ogni carattere della stringa ASCII, in modo che ogni carattere
sia rappresentato da 9 bit e con un numero pari di 1.

4. Stampi la stringa di bit risultante (72 bit = 8 caratteri da 9 bit) in formato esadecimale.

CALCOLATORI ELETTRONICI
Prova scritta
11 gennaio 1994

Scrivere un programma in assembler che consenta di gestire un’agenda giornaliera di impegni. La


giornata è suddivisa in ore dalle 8.00 alle 20.00. Il programma deve consentire di:
å Visualizzare gli impegni sotto forma di tabella. Ad ogni ora viene associata una riga con due
campi per specificare l’ora e il tipo di impegno.
å Modificare e/o inserire nuovi impegni per ogni singola ora della ora giornata.
196 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
7 febbraio 1994

Scrivere un programma in assembler che accetti in ingresso un numero di n cifre (con n fino ad un
massimo di 10) che di questo calcoli:
å tutte le possibili permutazioni.

å i numeri cosi’ ottenuti devono poi essere visualizzati contemporaneamente sullo schermo.

Scrivere il programma in modo che funzioni fino a n=5.

Al fine di raggiungere la sufficienza è accettabile la versione del programma per n=4.


La CPU Intel 8086: Architettura e Programmazione Assembly 197

CALCOLATORI ELETTRONICI
Prova scritta
28 febbraio 1994

Scrivere un programma in assembler che accetti in ingresso una sequenza di 16 cifre esadecimali.
A partire dai caratteri di ingresso:
å formare la sequenza di 8 byte generata dal codice inserito.

å stampare la sequenza di 0 e di 1 cosi’ ottenuta.

å data la stringa prima ottenuta visualizzarne una codifica run length.

Per codifica run length si intende:


å Il primo bit della sequenza entra direttamente nella codifica.

å Segue la lunghezza espressa in decimale del numero di volte che il primo bit è presente nella
stringa.
å Segue la lunghezza espressa in decimale del numero di volte che il complemento compare
nella stringa e cosi’ via.

Esempio:
Sequenza ASCII: FFFF.0000.1010.0000
Sequenza di bit: 1111111111111111.0000000000000000.0001000000010000.0000000000000000
Codifica: 1 16 19 1 7 1 20
198 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
13 giugno 1994/1

Scrivere un programma in assembler che:


å Accetti in ingresso un numero intero positivo K (K ñ 10000).

å Calcoli la scomposizione in fattori primi del numero.

CALCOLATORI ELETTRONICI
Prova scritta
13 giugno 1994/2

Scrivere un programma in assembler che:


å Accetti in ingresso un numero intero positivo K (K ñ 50000).

å Accetti un secondo numero positivo n (n ñ 200),

å Verifichi se K e’ divisibile per n:

– Se e’ divisibile stampa il risultato.


– Se non e’ divisibile stampa il primo numero superiore e il primo numero inferiore
(rispetto a n) che divide K in modo esatto. (Limitarsi ai numeri compresi fra 1 e 200)
La CPU Intel 8086: Architettura e Programmazione Assembly 199

CALCOLATORI ELETTRONICI
Prova scritta
18 luglio 1994/1

Scrivere un programma in assembler che:


å Accetti in ingresso 10 parole (max 10 caratteri A...Z).

å Stampi le parole inserite in ordine alfabetico crescente.

In una seconda fase si considerino le parole formate utilizzando tutti i caratteri alfanumerici (A ...
Z, 0 ... 9). I numeri seguono le lettere nell’ordinamento.

CALCOLATORI ELETTRONICI
Prova scritta
18 luglio 1994/2

Scrivere un programma in assembler che:


å Accetti in ingresso 10 numeri nel seguente formato nnnnEkk con il seguente significato
nnnn ò 10kk .
å Stampi i numeri inseriti in ordine crescente.

In una seconda fase si consideri la possibilità che il numero possa assumere i seguenti formati:
n ì nnnEkk oppure nn ì nnEkk oppure nnn ì nEkk.
200 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
5 settembre 1994/1

Scrivere un programma in assembler che:


å Accetti in ingresso un numero di 4 cifre.

å Stampi tutti i numeri (di 4 cifre) diversi tra loro che è possibile formare con le cifre del primo
numero. (I numeri vanno stampati in modo che compaiano in una sola schermata).
å Stampi i numeri in ordine crescente (questo punto può essere svolto in una fase successiva).

CALCOLATORI ELETTRONICI
Prova scritta
5 settembre 1994/2

Scrivere un programma in assembler che:


å Accetti in ingresso un numero di 5 cifre.

å Stampi tutti i numeri (di 2 cifre) diversi tra loro che è possibile formare con le cifre del primo
numero. (I numeri vanno stampati in modo che compaiano in una sola schermata).
å Stampi i numeri in ordine crescente (questo punto può essere svolto in una fase successiva).
La CPU Intel 8086: Architettura e Programmazione Assembly 201

CALCOLATORI ELETTRONICI
Prova scritta
28 Ottobre 1994

Scrivere un programma in Assembly che:

1. Accetti in ingresso una stringa di massimo 70 caratteri;


La stringa può essere formata solo dai seguenti caratteri: 0,1,2,...,9 e A,B,C,...,Z (numeri e
lettere); non possono esserci due caratteri 0,1,2,...,9 adiacenti; la stringa non può terminare
con un numero.

2. Conti le ricorrenze dei caratteri A,B,C,...,Z nella stringa; se un carattere viene preceduto da
un numero n, si consideri come se tale carattere fosse ripetuto n volte consecutive.

3. Stampi il carattere (o i caratteri) ripetuto(i) più frequentemente.

In un primo tempo assumere che la stringa in ingresso soddisfi alle richieste del punto 1. Suc-
cessivamente introdurre il controllo della corretta sintassi e generare errore se le specifiche del
punto 1. non sono soddisfatte.

Al termine, ripetere il ciclo con una seconda stringa, ma evidenziare il carattere (o i caratteri)
che hanno variato maggiormente la loro frequenza nelle due stringhe.

Esempio:
Sequenza in ingresso: ab4abbbm
Output: a
202 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
23 Gennaio 1995

Scrivere un programma in Assembly che:

1. Accetti in ingresso una stringa di massimo 70 caratteri;


La stringa può essere formata solo dai seguenti caratteri: A,B,S,D, 2,...,9; non possono
esserci due numeri adiacenti; la stringa non può terminare con un numero.

2. Cancelli lo schermo, e stampi un cursore (carattere a scelta) al centro dello schermo stesso;

3. Scandisca la stringa e sposti il cursore senza cancellare la posizione precedente secondo le


seguenti regole:
å Il carattere ’A’ sposta in Alto il cursore di una posizione;
å Il carattere ’B’ sposta in Basso il cursore di una posizione;
å Il carattere ’S’ sposta a Sinistra il cursore di una posizione;
å Il carattere ’D’ sposta a Destra il cursore di una posizione;
å Un numero agisce da prefisso di ripetizione per il carattere seguente.

In un primo tempo assumere che la stringa in ingresso soddisfi a tutte richieste e che il cur-
sore non esca mai dallo schermo. Successivamente introdurre il controllo della corretta sintassi e
generare errore se le specifiche non sono soddisfatte.
Esempio:
Sequenza in ingresso: as4a2sbbbs
Il cursore si deve muovere: asaaaassbbbs e deve generare un disegno del tipo:
G3GAG
G G
G G
G3G G
G3G
/
La CPU Intel 8086: Architettura e Programmazione Assembly 203

CALCOLATORI ELETTRONICI
Prova scritta
12 Aprile 1995

Scrivere un programma in Assembly che:

1. Accetti in ingresso una stringa di massimo 80 caratteri;


La stringa può essere formata solo dai seguenti caratteri: 0,1,2,...,9,+,–,= e deve rispettare le
seguenti specifiche:
å non possono comparire più di 3 numeri adiacenti;
å i simboli +, –, = non possono essere adiacenti;
å il simbolo = deve comparire una sola volta e al termine della stringa;

Tale stringa forma così una espressione algebrica da valutare.

2. cancelli lo schermo, e stampi la stringa inserita;

3. stampi il risultato della espressione algebrica, assumendo che tutti i risultati parziali possano
essere memorizzati in una parola da 16 bit.

In un primo tempo assumere che la stringa in ingresso soddisfi le specifiche sopra elencate.
Successivamente introdurre il controllo della corretta sintassi e generare errore se le specifiche non
sono soddisfatte.

Esempio:
Stringa in ingresso: 4+93–3–0+08=
Uscita: 4+93–3–0+08= 102
204 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
16 Giugno 1995

Scrivere un programma in Assembly che:

1. Accetti in ingresso una stringa di massimo 70 caratteri;


La stringa può essere formata solo dai seguenti caratteri: numeri, lettere da ’A’ ad ’F’, e i
seguenti simboli: ’+’, ’*’, ’ˆ ’. La stringa deve terminare con il segno ’=’.

2. calcoli il risultato della espressione logica assumendo che il simbolo ’+’ indichi l’operazione
di OR, il simbolo ’*’ quella di AND, e il simbolo ’ˆ ’ quella di EXOR.

3. stampi la stringa inserita e il risultato.

In un primo tempo assumere che la stringa in ingresso abbia il seguente formato:

XXXXOXXXXOXXXX=

dove X indica una cifra esadecimale (range ’0’-’F’) e O indica una operazione logica (range: ’+’,
’*’, ’ˆ ’). Successivamente considerare la stringa formata sempre dalla concatenazione di due
operazioni logiche, ma i cui operandi non siano limitati a 4 cifre.
Esempio:

Sequenza in ingresso: 1234+5678+9ABC=


Uscita: 1234+5678+9ABC=DEFC
La CPU Intel 8086: Architettura e Programmazione Assembly 205

CALCOLATORI ELETTRONICI
Prova scritta
25 Settembre 1995

Scrivere un programma in Assembly che:

1. Accetti in ingresso una stringa di massimo 60 cifre decimali;

2. Accetti in ingresso una seconda stringa di 4 cifre decimali;

3. Calcoli la funzione di correlazione tra le due stringhe, definita come: per ogni posizione
della seconda stringa rispetto alla prima calcolare il numero di caratteri coincidenti.

4. stampi la stringa ottenuta (la cui lunghezza deve essere uguale a quella della stringa in
ingresso).

In un primo tempo assumere che la seconda stringa sia formata da 4 caratteri; in seguito
estendere il programma al caso in cui la seconda stringa abbia lunghezza variabile (tra 2 e 9
caratteri).
Esempio:

Prima stringa in ingresso: 123412431434


Seconda stringa in ingresso: 1234
Uscita: 400121103000
206 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
29 Novembre 1995

Scrivere un programma in Assembly che:


%ž jkj  --
1. Accetti in ingresso due date (giorno/mese/anno) nel formato: , dove l’intervallo di
variabilità è:
% ] P e ]
varia da a
j j ] P PSR
varia da a
-%- ¨ ] É É
varia da a
Assumere che i dati inseriti soddisfino le specifiche elencate sopra.

2. calcoli e stampi il numero di giorni intercorsi tra le due date.

Assumere che la seconda data sia posteriore alla prima, che tutti i mesi siano formati da 30
giorni, che un anno sia formato da 30*12=360 giorni, e che non vi siano anni bisestili.

Successivamente considerare l’effettiva lunghezza dei mesi, e gli anni formati da 365 giorni.

Esempio:

N jl- 4 -  -  ] PŒPSR É ~


< f
4 - 4 -  -  PeÌP ]ŒÉ ¨

a l• - 9
9• e>P*R
La CPU Intel 8086: Architettura e Programmazione Assembly 207

CALCOLATORI ELETTRONICI
Prova scritta
19 Gennaio 1996

Scrivere un programma in Assembly che:


 jkj }99
1. Accetti in ingresso due orari (ore/minuti/secondi) nel formato:  , dove l’intervallo
di variabilità per i minuti e i secondi è:
j j ]%] ¨ É
varia da a
9“9 ]] ¨ É
varia da a

2. calcoli e stampi il numero di secondi intercorsi tra i due orari.

Determinare inoltre l’intervallo di variabilià delle ore ( ) in modo che tutti i calcoli possano
essere effettuati utilizzando operazioni su 16 bit.
Assumere che il secondo orario sia posteriore al primo.

Successivamente considerare anche il caso in cui il primo orario sia posteriore al secondo (cioè
si riferisca al giorno precedente).

Esempio:

N j v  -  P ]w R ž


] e ]
< f
4wŒ% - b Pe  R ¨  ] ¨

< f
4wl• - 9
9“ P%P ]^¥ ¨
208 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
19 Gennaio 1996

Scrivere un programma in Assembly che continui ciclicamente a stampare i numeri da 0 a 100


fintanto che non vengono premute opportune sequenze di tasti. In un primo tempo considerare
l’unica sequenza di tasti possibile: "STOP" che termina il programma.
Successivamente considerare anche la sequenza "PAUSA" che ferma il ciclo fintanto che non
viene premuto un tasto qualsiasi.

Al fine di controllare lo stato della tastiera utilizzare i servizi Interrupt numero 16h (servizi 0 e
1).
La CPU Intel 8086: Architettura e Programmazione Assembly 209

CALCOLATORI ELETTRONICI
Prova scritta
27 Febbraio 1996

Scrivere un programma in Assembly che, introducendo un giorno e un mese dell’anno in corso


(1996), determini il corrispondente giorno della settimana. Si ricorda che il 1 Gennaio 1996 è stato
un lunedi.

Estendere in seguito il programma al calcolo del giorno della settimana di un qualunque giorno
nel decennio 1990/1999. Si ricorda che il 1 Gennaio 1990 è stato un lunedi e che gli anni 1992 e
1996 sono anni bisestili.
Utilizzare un formato a piacere per l’introduzione dei dati e per la visualizzazione del risultato.

Esempio per il primo caso:

a  R ¥
Cl f9b  R

Y )Q%'’4" %)) - 9Š  jl-  - º  C - b .4w

Esempio per il secondo caso:

a  R ¥
Cl f9b  R
?  P ÉÉ ©

Y )Q%'’4" %)) - 9Š  jl-  - º  E3  %4


210 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
25 giugno 1996

Scrivere un programma in Assembly che accetti in ingresso una stringa di massimo 20 caratteri
e che continui ciclicamente a stamparla, facendola ruotare sullo schermo (matrice 80 ó 25).
Più precisamente la stringa deve essere stampata sullo schermo prima alla posizione (0, 0), poi
alla (0, 1), poi alla (0, 2) fintanto che non si raggiunge la posizione (0, 80 – ñ lunghezza_della_stringa ô );
nella successiva stampa della stringa tutti i caratteri devono essere stampati consecutivamente,
eccetto l’ultimo, che deve essere stampato sotto il penultimo.
õ öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö[õ
_
÷møSù*ú ÷
÷ ÷
÷ ÷
÷ ÷
õ_öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö[õ

õ_öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö[õ
÷ ø(ù*ú ÷
÷ ÷
÷ ÷
÷ ÷
õ_öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö[õ

õ_öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö[õ
÷ øSù"ú ÷
÷ ÷
÷ ÷
÷ ÷
õ_öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö[õ
ûûû
õ_öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö[õ
÷ øSù%÷
÷ úš÷
÷ ÷
÷ ÷
õ_öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö[õ

õ_öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö[õ
÷ ø÷
÷ ù.÷
÷ úš÷
÷ ÷
õ_öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö[õ

Il programma deve terminare dopo un giro completo della stringa.


La CPU Intel 8086: Architettura e Programmazione Assembly 211

Successivamente considerare la possibilità di uscire dal programma con la pressione del tasto
‘SPAZIO’ anche se la stringa non ha terminato il ciclo; al fine di controllare lo stato della tastiera
utilizzare l’Interrupt numero 16h (servizi 0 e 1).
Successivamente consentire al programma di eseguire più di un ciclo: al termine di ogni ciclo
la stringa verrà raddoppiata.
õ öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö[õ
_
÷møSù*úøSù*ú ÷
÷ ÷
÷ ÷
÷ ÷
õ_öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö[õ

Esempio di risoluzione

ü øSý“þ ÿ 
ú

 ü ü  
ü ý:ø •þø ü ù 
ü ý:ø( ú
 ü ù 
 ý  ü  
 ý •þ  ø ü ù !#"#$%'&)( *+&)Õÿ% ,
ü øSý“þ ! (Mÿ

- þø ÿ.! Åÿ/%0213”ÿ/%0214


( 5 6 66 (7 98 ;:
#
- þø !#(\ÿ

%oÿ*ÿ7  (Mÿ=< ü øý•þ?>”ÿfÿ=< - þ  @


ø >)02ÿA< úB
ü þ}ú 

ú
ü }þ ú  ÿ.! C!%#D%E!7#5GFH*09)0/"(D
I øSþ  - J
L ú K'ø
M
 ø M >_ø M
-N Oƒ ü 
-N 
 O ø M
úŽø  þ  þý
I
P ú M >Q 6SRT õ T6SRT
 ú 

- < I
P ü M >VU ú

  ü XW
I
P ù >YU ý•ø •Zþ  ø W O ü  B
 
I
P ù  >VU  ü B ý•ø ú
[W
I
P  ?þ > 6
ZB

- < I
P ø  >  Jý “þ  @ ø U þW

 
úŽø - “þ ý•ú ø  O
212 A.Broggi

úŽø   þ  ú& úB

 ü
þ ú  þ
ú I4-  þ\>]U  ýJ ZBW
^  _`ZB

-
I
P U üB ý•ø “þZ ø W >ù O
I
P U üB ý•ø ú
W 
> ù 
I
P ü M >VU ú

 üXW
úŽø  þ  ú& úB

 ü
I
P U ú

ü@aW > ü M
úŽø • þý•ø ü


 


-  ú 

-
 ý
I øSþ  B* ü -

•þ£ý:ø ü
- 
ú  ø
-N O ú M
I
‡ P ú M > b 6 666
úÂþ}ú
@<

úŽþú 

  -
-
- úM
ü
•þ£ý:ø
B
  * ü -

þ  úc&”ú

 ü - J
ú  ø
ø üfüÖüO >VU üB ý•ø “þZ ø W
ø üfüÖü  >VU ü ý:ø(ú
[W
ú I4- ü  >#Q 6
^ _`
 ø  
ü  ú ü 

þ  ú ü O
I
PdU  ü  ý:ø •þ ø W > 
I
PdU  ü  ý:ø( ú
[W > 6
^ I4- Kþ 

 ø  @<
ú I4- ü O > T
^ _`
T ø  
ü  ú ü 

ü  ú ü O

I
PdU  ü  ý:ø •þ ø W > 6
I
PdU  ü  ý:ø( ú
[W > 6 efefO
^ I4- Kþ 

T ø  @<
ú I4- ü  > 6egefO
^ _`
Sb(ø  
þ  ú ü 
ü  ú ü O

I
PdU  ü  ý:ø •þ ø W > 6egefO
I
PdU  ü  ý:ø( ú
[W > 6
^ I4- Kþ 

Sb(ø  @<
ú I4- ü O > 6egefO
^ _ Kþ 
þ  ú ü 
þ  ú ü O
I
PdU  ü  ý:ø •þ ø W > 6
La CPU Intel 8086: Architettura e Programmazione Assembly 213

I
PdU ü ý:ø(ú
[ W > 


Kþ <   ý
þ úc&”ú

 üh
 B*ü -

- •þ  ý•ú O ø - J
ú  ø
-N O ù M
-N O ø M
I
PDù O > 6
I
‡ P ø O > T
þ ý 6O
-
- ø M
-N O ø M
I
‡ P ø O > 6 O
I
D P ù > 6
þ ý 6O
-
- ø M
-
- ù M
 ý
- • þ  ý•ú O ø *  ü -

þ  þ£ý - J
ú    ø
I
P ø M > ü øý“þ
I
P ü >oø M
I
P U ú

@ ü aW > 6
I
P üU B ý•ø“ þZ ø W > 6
I
P U üB ý•ø ú
 W > 
 ý
þ  þ£ý B*
 ü -

ú
ü þ}ú  !#(\ÿ
!#( I øSþ 
214 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
16 luglio 1996

Scrivere un programma in Assembly che


å accetti in ingresso una stringa di massimo 50 caratteri;

å accetti in ingresso una seconda stringa numerica formata dallo stesso numero di caratteri
della precedente.
å cancelli lo schermo e stampi la prima stringa in alto a sinistra (posizione 0,0).

Il programma deve poi spostare ogni lettera della stringa appena stampata in basso di un numero
di posizioni dato dal numero della seconda stringa associato alla lettera della prima stringa.
Esempio:
N jl- 9['6 -  ?0K 1 `FV
< f
4 - 9“b& -  PSR—P.~e

/0w. ?3K 1 `FV


? 1
K
V
`

Successivamente il programma deve entrare in un ciclo in cui le lettere della prima stringa
rimbalzano tra le due posizioni indicate precedentemente.
In un primo tempo supporre che i dati inseriti soddisfino alle specifiche; in un secondo tempo
effettuare il controllo degli errori.
La CPU Intel 8086: Architettura e Programmazione Assembly 215

CALCOLATORI ELETTRONICI
Prova scritta
10 Settembre 1996

Scrivere un programma in Assembly che


å accetti in ingresso una stringa di 10 caratteri formata esclusivamente dai caratteri ’A’, ’B’,
’S’, ’D’;
å stampi la stringa al centro dello schermo;
å entri in un ciclo in cui ad ogni iterazione vengono mossi tutti i caratteri della stringa nel
seguente modo:

– i caratteri ’A’ vengono spostati di una posizione verso l’Alto;


– i caratteri ’B’ vengono spostati di una posizione verso il Basso;
– i caratteri ’S’ vengono spostati di una posizione verso Sinistra;
– i caratteri ’D’ vengono spostati di una posizione verso Destra;

Qualora la posizione in cui un carattere deve essere mosso risulti occupata, il carattere
rimarrà fermo. In più, quando un carattere raggiunge il bordo dello schermo, si ferma.
å il ciclo termina quando tutti i caratteri sono fermi.

Esempio:
ûûûûûûûûûûûûûûûûûûûûûûûûû
ûûûûûûûûûûûûûûûûûûûûûûûûû
ûûûûûûûû % 58ÿ (% %\ÿ ûûûûûûûûûû
ûûûûûûûûûûûûûûûûûûûûûûûûû
ûûûûûûûûûûûûûûûûûûûûûûûûû

ûûûûûûûûûûûûûûûûûûûûûûûûû
ûûûûûûûû % ûûû % % ûûûûûûûûûûû
ûûûûûûûûû ÿ ûû (\ÿ ûûûûûûûûûûû
ûûûûûûûûû 5 ûûûûûûûûûûûûûûû
ûûûûûûûûûûûûûûûûûûûûûûûûû

ûûûûûûûû % ûûû % % ûûûûûûûûûûû


ûûûûûûûûûûûûûûûûûûûûûûûûû
ûûûûûûûû ÿ ûûû (\ÿ ûûûûûûûûûûû
ûûûûûûûûûûûûûûûûûûûûûûûûû
ûûûûûûûûû 5 ûûûûûûûûûûûûûûû

ûûûûûûûû % ûûû % % ûûûûûûûûûûû


ûûûûûûûûûûûûûûûûûûûûûûûûû
ûûûûûûû ÿ ûûûû (\ÿ ûûûûûûûûûûû
ûûûûûûûûûûûûûûûûûûûûûûûûû
ûûûûûûûûû 5 ûûûûûûûûûûûûûûû
216 A.Broggi

ûûûûûûûû % ûûû % % ûûûûûûûûûûû


ûûûûûûûûûûûûûûûûûûûûûûûûû
ûûûûûû ÿ ûûûûû (\ÿ ûûûûûûûûûûû
ûûûûûûûûûûûûûûûûûûûûûûûûû
ûûûûûûûûû 5 ûûûûûûûûûûûûûûû

7  ý“þ I Q ø þý  :ø _ þ
 <
ûûûûûûûû % ûûû % % ûûûûûûûûûûû
ûûûûûûûûûûûûûûûûûûûûûûûûû
ÿ û ûûûûHûûûûû (Mÿ ûûûûûûûûûûû
ûûûûûûûûûûûûûûûûûûûûûûûûû
ûûûûûûûûû 5 ûûûûûûûûûûûûûûû
La CPU Intel 8086: Architettura e Programmazione Assembly 217

CALCOLATORI ELETTRONICI
Prova scritta
1 Ottobre 1996

Scrivere un programma in Assembly che:


i accetti in ingresso una stringa composta da almeno 10 caratteri e massimo 70; la stringa deve contenere 2 lettere
maiuscole mentre le rimanenti devono essere minuscole.
i entri in un ciclo la cui funzione è di stampare la stringa inserita con le seguenti modifiche:

– le due lettere maiuscole si spostano all’interno della stringa di una posizione;


– nel caso la posizione successiva sia già occupata dall’altra lettera maiuscola o se si è arrivati al termine
della stringa, la lettera modificherà la propria direzione.
i ad ogni iterazione il programma deve acquisire un carattere da tastiera: nel caso in cui il tasto sia "SPAZIO", il
programma termina, altrimenti viene rieseguito il ciclo.

Successivamente introdurre il controllo su;;a correttezza del formato della stringa inserita dall’utente.

Esempio:

ø52ú ü K? O þ ^aj 


øS= ù 0 ü KkSlþ ^aj 
øSù"Bú (  Kk O * ^aj 
øSù"ú ü mKk O þon j 
øSù"ú ü ;e  O þ ^ 1 
øSù"ú ü  K? O þ ^aj F
øSù"ú ü  Kk lþ ^ 1 
øSù"ú ü  Kk O *an j 
øSù"ú ü  Kk lþ ^ 1 
øSù"ú ü  K? O þ ^aj F
øSù"ú ü ;e  O þ ^ 1 
øSù"ú ü mKk O oþ n j 
øSù"Bú (  Kk O * ^aj 
øS=ù 0 ü  KkSlþ ^aj 
218 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
19 Novembre 1996

Scrivere un programma in Assembly formato da un ciclo principale in cui un carattere viene mosso di una posi-
zione per ogni iterazione. Il carattere partirà dall’angolo alto a sinistra dello schermo e si muoverà verso destra; una
volta arrivato al bordo destro, scenderà di una posizione e continuerà a muoversi verso sinistra. Una volta arrivato
al bordo sinistro, scenderà di una posizione e riprenderà secondo l’andamento descritto precedentemente. Quando il
carattere raggiunge l’utlima posizione dello schermo (angolo in basso a destra), riprenderà dalla posizione iniziale.

Inserire all’interno del ciclo due procedure che permettano all’utente di variare la velocità di movimento del
carattere attraverso la pressione di due diversi tasti. Attenzione: il carattere DEVE muoversi di una posizione ad ogni
iterazione, indipendentemente dalla pressione dei tasti sopra menzionati!

Al fine di controllare lo stato della tastiera si consiglia di utilizzare l’Interrupt numero 16h (servizi 0 e 1).

Successivamente introdurre altre due procedure che permettano all’utente di


i riportare il carattere alla posizione iniziale.
i fermare il movimento del carattere fino alla pressione di un altro tasto;
CALCOLATORI ELETTRONICI
Prova scritta
28 Gennaio 1997

Scrivere un programma in Assembly che


i accetti in ingresso una stringa di massimo 80 caratteri;
i pulisca lo schermo;
i stampi la stringa inserita lettera per lettera a partire dal centro dello schermo spostandosi ad ogni carattere di
una posizione verso destra; ogni volta che viene stampata la lettera ’b’, la stampa della stringa prosegue verso
il basso dello schermo; ogni volta che viene stampata la lettera ’a’, la stampa della stringa prosegue verso l’alto
dello schermo; ogni volta che viene stampata la lettera ’d’, la stampa della stringa prosegue verso la destra
dello schermo; ogni volta che viene stampata la lettera ’s’, la stampa della stringa prosegue verso la sinistra
dello schermo.

Successivamente:
i introdurre il controllo che la stampa non esca dallo spazio dello schermo; in tal caso segnalare errore.
i modificare il programma in modo che venga stampato un asterisco nel caso in cui la posizione corrente sia già
occupata da un altro carattere.

* @ •þ  N  ø  ý •þ   ø@< O N ^ Sø þ j


 N  ^ O N “ùK N Oü -  -@-

ù N O ^  N 
K

N j
O þ
 O N ^ø
ü -  - -
220 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
28 Febbraio 1997

Scrivere un programma in Assembly che:


i accetti in ingresso una stringa composta da massimo 70 caratteri; la stringa può contenere solo lettere maiuscole
e minuscole;
i entri in un ciclo in cui ad ogni iterazioine venga stampata una nuova stringa ottenuta dalla precedente elimi-
nando le lettere (anche multiple) con codice ASCII minore.
i il ciclo termini quando la stringa risulta vuota.

Successivamente modificare il programma in modo che ad ogni iterazione vengano stampate due stringhe: la
prima secondo quanto scritto sopra, mentre la seconda contenente le lettere eliminate dalla prima.

Esempio:

* @ •þ  N  ø  ý •þ   ø@< ege % e úB% %# egege !%0!K


þý  : ø _ þ
p < egege úB egege !20!K % %#% %
þý  : ø _ þ
`T < egege  egege !mK % %#% %oú;0

þý  : ø _ þ
 b< egege  egege K %#% % %oú;02!
þý  : ø _ þ
rq <  %#% % o % ú;02! egegegegefe K
þý  : ø _ þ
`s < % % %#_ % út02!! egefegegege Ku
La CPU Intel 8086: Architettura e Programmazione Assembly 221

CALCOLATORI ELETTRONICI
Prova scritta
2 Aprile 1997

Scrivere un programma in Assembly che:


i accetti in ingresso una stringa di massimo 70 caratteri composta da lettere maiuscole, minuscole e spazi; lo
spazio, che puø‘ anche comparire più volte consecutivamente, è carattere separatore tra parole diverse;
i accetti in ingresso una lettera maiuscola;
i stampi tutte le parole della prima stringa che contengono la lettera di cintrollo specificata dalla seconda immis-
sione su righe diverse consecutivamente, in modo da allineare sulla stessa colonna (centrata nello schermo) la
lettera di controllo.

Nel caso si avessero più ricorrenzze della lettera di controllo in una stessa parola, tale parole viene considerata e
stampata più volte.
Successivamente eliminare l’inserimento della lettera di controllo e creare 5 colonne, una per ogni vocale.

Esempio:

* @ • þ  N  ø  ý •þ   ø@<90
I4- þ£ýJ
ü þ40Ñø  úB
 øýJ
 •þ   Šý ýJ 
 þúŽþ
* @ • þ  N  ø Z  “ý ý  •@
ø <,
R
0
Y I - þ£ýJ

0Ñø  ú
 Sø ý
 •þ
Z ýŠýJ 
 }þ úÂþ
Z ý“ý J
 þ}úÂþ

* @ •þ  N  ø  ý •þ   ø@<90


I4- þ£ýJ
ü þ40Ñø  úB
 øýJ
 •þ   Šý ýJ 
 þúŽþ
R R R R
0Ñø  ú
 øýJ
 •þ Z ý“ý J
 þ}úÂþ 0
I4- þý
0
I4- þý

 
0 ø ú
øSý
“þ
Ñ  ýŠýJ 
 þúŽþ ü þ 0
I4- þý

0Ñø  ú
 øSý
 •þ 0Ñø  ú
 øSý
“þ
 ýŠJý 
 þúŽþ30Ñø  ú
 øýJ
 •þ
Z ý“ý J
 þ}úÂþ Z ý“ý J
 þ}úÂþ
222 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
7 Luglio 1997

Scrivere un programma in Assembly che:


i accetti in ingresso 10 numeri n , i v 1 wZww 10, compresi tra 0 e 1000;
i
i rappresenti i numeri inseriti sotto forma di istogramma (a tal fine si scelga un modo per la loro approssimazio-
ne).

In un primo tempo assumere che il range di variabilità dell’istogramma sia tra 0 e 1000; successivamente deter-
minare il range di variabilità utilizzando il valore massimo assunto dai dieci numeri, cioè tra 0 e max(ni).

Esempio:

* @ •þ p6p N@I  “þ\< ;66 > T66 >Db 6 6 > 6 6 > s s > xq s > scqS6 > T b 6 > 6 > T66

y#y y
y#y y
y#y y
y#y y
y#y y
y y#y y#y y
y y#y y#y y9y#y y
y y#yzy y#y y y yzy y y y y y

y y#yzy y#y y y yzy y y y y y

y y#y9y y#yzy#y y9y#y yzy#y y y#y yzy#y y y y y
#
y y#y9y y#yzy#y y9y#y yzy#y y9y#y y9y#y y{y y y y y y
#
La CPU Intel 8086: Architettura e Programmazione Assembly 223

CALCOLATORI ELETTRONICI
Prova scritta
10 Settembre 1997

Scrivere un programma in Assembly che:


i accetti in ingresso 2 stringhe alfanumeriche (che comprendono solo le lettere dell’alfabeto maiuscole e minu-
scole, e i numeri) senza spazi e con almeno un carattere in comune;
i stampi la prima stringa sullo schermo in direzione orizzontale da sinistra a destra;
i stampi la seconda stringa verticalmente dall’alto al basso in modo che le due stringhe si incrocino in corrispon-
denza del primo carattere che hanno in comune, che verrà sostituito da un asterisco.

In un primo tempo assumere che i dati in ingresso siano conformi alle specifiche. Successivamente introdurre il
controllo sugli errori di inserimento.

Esempio:

m •þ I ø  ý •þ   ø< %  ù  J

ÿ  ú
"ü ø  Jý “þ  ø< % Fg"

" N ý -N ý<

%  ù R 


%
F
"
224 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
12 Settembre 1997

Scrivere un programma in Assembly che permetta di inserire una stringa di lettere minuscole, maiuscole e numeri,
di massimo 40 caratteri. Si supponga che la stringa contenga almeno 2 vocali. La prima e l’ultima vocale dividono la
stringa in 3 parti.
Il programma deve pulire lo schermo e stampare la stringa iniziale in posizione centrale. Successivamente deve
stampare su righe successive le tre stringhe in modo che la seconda stringa (la parte centrale della stringa iniziale)
rimanga nella posizione originale, mentre le prima e la terza si spostino di un carattere verso sinistra e verso destra
rispettivamente fino a raggiungere il bordo dello schermo. Quando entrambe le stringhe mobili hanno raggiunto il
bordo dello schermo il programma termina.
Successivamente
i introdurre i controlli sulla corretteza della stringa in ingresso e
i fare in modo che l’insieme delle lettere che dividono la stringa iniziale sia definibile da utente.

Esempio:

* @ • þ r ø  ý •þ   ø@< _ M ú P%ù@b øSù*ú ü  kK  O þ ^aj  I 


 | ýŠý   -  ü þZP%þ ü  @
* @ • þ r  ü
ø <†ø þ Kk
N
õ_öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö&ö&ö[õ
÷ ù b øSù*ú ü  Kk O þ ^aj  I 
_ M ú P%@ ÷
÷ _ M ú P%@ù bQø(ù*ú ü  Kk O þ ^aj  I  ÷
÷ _ M Bú P%@ ù b ø(ù*ú ü  Kk O þ ^aj  I  ÷
÷ _ M ú P%@ ù b ø(ù*ú ü  Kk O þ ^aj  I  ÷
÷ _ M ú P%@ ù b ø(ù*ú ü  Kk O þ ^aj  I  ÷
÷ _ M Bú P} ù b ü 
ø(ù*ú Kk þ  O ^aj  I  ÷
÷ _ M ú P%@ ù b ü 
ø(ù*ú Kk þ  O ^aj  I  ÷
_
÷ M ú P%@ù b ü
ø(ù*ú Kk þ  O ^aj  I  ÷
õ_öö&öö&ööö&öö&ööö&öö&ööö&öö'öö&ö&ö&öö'ööö'öö&ö&ö[õ
La CPU Intel 8086: Architettura e Programmazione Assembly 225

CALCOLATORI ELETTRONICI
Prova scritta
2 Dicembre 1997

Scrivere un programma in Assembly che permetta di inserire una stringa formata solo da lettere maiuscole e
minuscole e che la visualizzi sullo schermo. Il programma deve poi entrare in un ciclo da cui può uscire solo alla
pressione del tasto ’Spazio’. All’interno del ciclo viene controllata la tastiera; ogni volta che viene premuto il tasto
corrispondente ad una lettera, dalla stringa iniziale vengono eliminate tutte le ricorrenze (maiuscole e minuscole) della
lettera digitata; la nuova stringa viene sovrascritta alla precedente (alle stesse coordinate della precedente), eliminando
gli eventuali caratteri rimasti dalla stringa precedente.
Successivamente modificare il programma in modo che la pressione di tasti corrispondenti a lettere minuscole
abbiano l’effetto di eliminare le corrispondenti ricorrenze nella stringa iniziale (come sopra), mentre la pressione di
tasti corrispondenti a lettere maiuscole abbiano l’effetto opposto, ovvero di reinserire le lettere eliminate in precedenza.

Esempio:

* @ •þ  N  ø  ý •þ   ø@< øSù*ú% %_ù~0/0Ñø5G52ú

øSù"úB% %_ù~0/0Ñø5G52ú ü

8 ü
-
 ø - J þZ
Jü þ ø@ :
ù*úŽù~0/025G5Ñú ü

8 ü
-
 ø - J þZ
Jü þ ù€ :
ú;0/0Ñú ü

8 ü
-
 ø - J þZ
Jü þ ú :
ü

8 ü
-
 ø - J þZ
Jü þ 5 :
ùfù@5G5 ü

8 ü
-
 ø - J þZ
Jü þ %] :
øSù}% %ù"ø5G5 ü

8 ü
-
 ø - J þZ

 Jü þ)0# :
øSù"úB% %_ù~0/0Ñø5G52ú ü
226 A.Broggi

CALCOLATORI ELETTRONICI
Prova scritta
27 Gennaio 1998

Scrivere un programma in Assembly che permetta di inserire tre stringhe a, b, e c di caratteri alfanumerici (lettere
e numeri) e le visualizzi sullo schermo. Il programma deve stampare la stringa a, carattere per carattere, partendo
dalla metà del bordo sinistro dello schermo verso destra; ogni volta che si incontra una ricorrenza di un carattere della
stringa b, la stampa procede verso l’alto di un carattere. Parallelamente ogni volta che si incontra una ricorrenza di un
carattere della stringa c, la stampa procede verso il basso di un carattere.
Successivamente modificare il programma in modo che richieda l’immissione di una quarta stringa d; ogni volta
che si incontra una ricorrenza di un carattere di quest’ultima stringa, la stampa della stringa a viene riportata nella
posizione originale.
In un primo tempo si assuma che gli insiemi dei caratteri delle stringhe b, c e d abbiano intersezione nulla;
successivamente introdurre tale controllo e, in caso di intersezione non nulla, mostrare le lettere in comune.

Esempio:

* @ •þ r ø - “þ I ø  ýJ “þ   ø@< _ M ú P%ù@b ø%ú ü  kK  O þ ^aj  I 


* @ •þ r ø  úB
*ü ø  ýJ “þ   ø@< %P ù
* @ •þ r øký  _ ø  ý •þ   ø< O
* @ •þ r ø‚ N ø Šý:ø  ýJ “þ  ø< K
ü K
b(ø%ú 
ù
_ M úBP  O
þ ^aj 
I 

Das könnte Ihnen auch gefallen