Sei sulla pagina 1di 236

La CPU Intel 8086:

Architettura
e Programmazione Assembly

Alberto BROGGI
Dipartimento di Ingegneria dellInformazione
Universit di Parma

La CPU Intel 8086:


Architettura
e Programmazione Assembly

Alberto BROGGI
Dipartimento di Ingegneria dellInformazione
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 nellambito del corso di Calcolatori Elettronici tenuto
presso la Facolt di Ingegneria dellUniversit degli Studi di Parma.
In esso affrontato lo studio del processore 8086 da un punto
di vista funzionale con un breve cenno allarchitettura 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 collezione di gran parte delle Prove Scritte dEsame 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 riferimento 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
Caratteristiche dei Linguaggi Assembly
Statements
Istruzioni
Pseudo-Istruzioni
Macro
Commenti
Vantaggi dei Programmi Assembly

2
3
4
5
9
10
11
12

ARCHITETTURA LOGICA DELLA CPU 8086


La CPU INTEL 8086
Gestione della Memoria
Registri e Flags
Composizione Manuale di Istruzioni Macchina

16
17
18
20
27

IL LINGUAGGIO ASSEMBLY 8086


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

29
30
35
70
87
89

LE FUNZIONI MS-DOS
Accesso alle Funzioni DOS e BIOS
Accesso diretto alla memoria video

90
92
93

LA FAMIGLIA DI PROCESSORI 80X86


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
Modalita reale e protetta

94
95
96
97
98
99
100
101
102
103
104
105

CREAZIONE DI UN PROGRAMMA ASSEMBLY


Suddivisione in moduli differenti
LAssemblatore
Il Linker
Il Debugger
Struttura e Documentazione di un Programma Assembly

106
107
108
109
110
111

APPENDICI
A: Programma di Esempio
B: Esempio di Documentazione dellIstruzione AND
C: Instruction Set della CPU 8086

114
114
120
121

D: Funzioni DOS (INT 21h)


E: Funzioni BIOS
F: Pseudo Istruzioni del MACRO ASSEMBLER
G: Tracce per la Risoluzione di Alcune Prove Scritte

124
127
128
132

La CPU Intel 8086: Architettura e Programmazione Assembly

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

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

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

A.Broggi

Statements
Un programma Assembly composto di Statements. Ogni statement comprende una direttiva per lAssemblatore e corrisponde ad
una riga del programma.
Se la direttiva corrisponde ad una istruzione macchina eseguibile dalla CPU, essa detta Istruzione, altrimenti una PseudoIstruzione.

Nel seguito verranno quindi analizzate:


Istruzioni
Etichette
Codici Operativi
+

Operandi
+

Pseudo-Istruzioni
+

Macro
Commenti

La CPU Intel 8086: Architettura e Programmazione Assembly

Istruzioni
Vengono tradotte dallAssemblatore 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
1MCON
T*U
Y[Z =
@ V =



? GJILKMG
H
?HGJIQPSR

VMWAX ? ,
R"P


V\WFX ? , 

A.Broggi

Etichette
Sono identificatori associati ad una istruzione; lassemblatore le
sostituisce con lindirizzo dellistruzione 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 ;

`3Ya Y =FP 

] P ^
] 1
P] ] V
] PPP
] PPfe

T.,_V
< X K
CD/cE
<>g ,

`3YbaFY = P
`5,
1 , IdR
`h, IQP

La CPU Intel 8086: Architettura e Programmazione Assembly

Codici Operativi

lo mnemonico di unistruzione assembly: in altri termini specifica loperazione che deve essere eseguita dalla CPU
lunico campo che non pu mai mancare in unistruzione

Esempio:
<>=#?A@B= 

V\WFX ? , 

C /FE
D
1MCON
T*U
Y[Z =
@ V =



? GJILKMG
H
?HGJIQPSR

VMWAX ? ,
R"P


A.Broggi

Operandi
Contiene lindicazione necessaria a reperire gli operandi (uno o
pi, a seconda dei casi) richiesti dallistruzione.
Sulla base di quanto indicato in questo campo, la CPU provveder,
durante lesecuzione del programma, a reperire gli operandi:
+
+

nellistruzione stessa
+

in un registro
+

in memoria
su una porta di I/O

Esempio:
CD/cE
CD/cE
CD/cE
Y[Z

?0GJIdR
?0GJILK\G
?0GJI E ? , / @ V
?iGJI ` G

La CPU Intel 8086: Architettura e Programmazione Assembly

Pseudo-Istruzioni
Sono comandi utilizzati durante il processo di assemblaggio (dallAssemblatore o Assembler), che non vengono tradotti in istruzioni
macchina eseguibili dalla CPU.

Esempio:
= Y = ,\V
` < V3a

< V0a C ViZ =

,V =#= X @q?sr < Z

N @ / 1

N8 -jkjlN ?A@B?


ZiV ?A@

4>mNn N X K ,oY 1

p ` ?B=q? p

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 ) - 

A.Broggi

10

Macro
Sono comandi utilizzati per semplificare la stesura di un programma 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}~

<"g Y x|=Ar ,\V x|=Fr}?cGsr}~

<>g
>< g
>< g
>< g

C ? 1
,
,
,
,
VZA`

@ /
?0GIQP
?0GIQP
?0GIQP
?0GIQP
C

, / ? ` r ?cGsr}? Zc` r C XA, rPf

C ? 1 @ /
E ? ,_XAV
?0GJI E ? ,_XAV
CD/FE
<>g Y x|=Ar ,_V x|=Ar ?BGr~
, / ? ` r ?cGsr}? c
Z ` rC A
X , rPf
VoZc` C
?0GJIm C V C
CD/FE
<>g Y x|=Ar ,_V x|=Ar ?BGr~
KMGIL?0G
CD/FE
, / ? ` r?cGr}? ZA` r C XA, r Pf
KMGIL?0G
CD/FE


R ]

La CPU Intel 8086: Architettura e Programmazione Assembly

11

Commenti
Sono parole o frasi inserite dal programmatore per rendere il programma pi comprensibile; servono al programmatore stesso e a chi
analizzer in futuro il codice.
Vengono ignorati dallassemblatore, che si limita a visualizzarli
quando si richiede il listato del programma.
Tutti i caratteri compresi tra un ; e un CR , vengono considerati commenti.

Devono essere utili ed esplicativi; ad esempio:

 -jkjl-j$- )m
 jkj % - 
<>=#?A@B= 

V\WFX ? , 
 -jkjl<>=#?A@B= 

V\WFX ? , 

C /AE

1MCON
T*U
Y[Z =
@ V =


? GILKMG
0
t 1 - &
% ?HG
b)l
w %wv4> KMG
?0GIdR(~
t 1iww ?0G
)ln - )b R(~ 4 .
"
t < ?HG$$R"~ - )&) - 9 - ) --V\W X ? ,
VMWAX ? ,
R"P
t 1  ->jl- )p YZ = V @c@ X N =  j . R"P
2



t @ ' -- )') - z
% .4w -
 -jl- w


 .
b jj .w - b
C /AE

1MCON
T*U
Y[Z =
@ V =


? GILKMG
0
t 1 - &
%v ?iG )k j 4 )) -  ?0GIdR(~
t < 9 - )k . j ' 4" .)&)&9
% j 

?
t - )&) - 9
%'n)') VMWAX
,
R"P
t <
 &nl) - b99b jk- & - 4 %)l .9

t @ ' -

A.Broggi

12

Vantaggi dei programmi Assembly


Lutilizzo 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 tipicamente
+
+

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
PSR ] Y
Pe ] Y

]
@ YZ = Y
Y R
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
, ]] P ]]w
, ]] PP ]w
, ]] P*R ]w
, ]] Pfe ]w

`3
C/AE
C/AE
1 ? ,o,
C/AE
? `F`
CD/FE
C/AE
1MCON
T K

YI ]
?0GJI Y
<=q? CN ?
?0GJI Y
?iGJIdR
Y IL?0G
?0GJI Y
?0GJIQP ]]
, ]] PP ]

Si notano almeno due semplici modifiche, che ne migliorano notevolmente le prestazioni:


+
+

Luso di registri al posto di locazioni di memoria


Luso di particolari caratteristiche dellAssembly

A.Broggi

14

Il programma scritto direttamente in Assembly quindi il seguente:


1 Y 1 , /L

?0GJI ]
CD/FE
<>=#? CON ?
1 ? ,o,
? G
0
Y[Z 1
? G
0
Y[Z 1
? GIQP ]]
0
1MCON
1 Y1 , /
T K

t Y u% - )&&u%u - )ln - )& {4" %)m


 - 
t<  -j  - )kn - )' {
 %b {4> ?iG
t 1 - )
%>) - )lnv> j % -  t
 - &b {4 - )Qnf f
%
' ?0G

t < ?0G 
-  - 'w)kn - )'

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 loperazione 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 complessit 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>Q9b9b - 7 <  Z ;4 - )&)p .w yn* -  - 9 % t
t">>
= = X @c?sr}< Z
,V #
/ E ?sr ,oV =q= X @c? 
Z X F
i

x Y ZcV r ,_V =#= X @q? 


,V =#= X @c?sr}< Z

`
`
`
`
`
`
`
`

? ]]
? ]]
? ]]
? ]]
? ]]
? ]]
? ]]
? ]]

?AR
?B~
?c
?c
?c?

? 1
? V
K ]

K\~ ]^
1 ` RP
]%1 R ]
e 1 V
~ ] ~
e 1h e
xR
1 e

t Y uz
 .4 -,V =#= X @q?sr< Z
N @ $
/ 1
Z3V ?A@
?0gI ]z
t < %nu%& ` / < p @ - 45 % - 4
C/cE

R*P
t ' w V
p
Y[Z =



? , I}R ]
t 13n %b y j &9
%>)
/ @

? , I p8p
t < ) - 9 j wv pQp Z p
1MCN
x YZAV r ,_V =#= X @c?
t 9
{4 - )&) - 
% %4w6 T"U
? , I p}9 p
t <  pQp < p I
1MCN
t  y)   - )'
TfZFU
Z3X /FE ? r ,_V =#= X @q?
@ V =
t @  - )&) - z
>L
 -jl- w

t x & {4> )) - z
.4 V_ZA` N

C/cE
Y[Z =
/ @
1|CON
T"U
1MCN
T.Z U
@ V =

?0gI ]^
R"P
? , I}R ]
? , I V
] ] K ]
? , I e
]%] ?FR

A.Broggi

16

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

La CPU INTEL 8086


L8086 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)

17

A.Broggi

18

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
Paragrafi

16
0

32
1

0
Segmenti

48

1
2

64
3

80
4

96
5

1M-32
64k-2

1M-16 1M
64k-1

La CPU Intel 8086: Architettura e Programmazione Assembly

19

Calcolo dellIndirizzo Fisico


Lindirizzo 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:
lindirizzo di testa del segmento e viene ottenuto moltiplicando
per 16 il numero del segmento.
lEffective Address (EA):
lindirizzo effettivo allinterno del segmento, calcolato come
offset (spostamento) rispetto allinizio del segmento stesso.

NB: la moltiplicazione per 16 pu essere notevolmente velocizzata 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

A.Broggi

20

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 indifferentemente 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

A.Broggi

22

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 lindirizzo di testa dei segmenti usati dal programma.
+

CS: Code Segment Register


Contiene sempre lindirizzo 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 lindirizzo 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 lindirizzo di testa del segmento dei dati utilizzati dal programma; deve essere inizializzato dal programmatore
allinterno 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 allinterno del suo programma.

A.Broggi

24

Flag Register
L8086 dispone di 9 bit detti flag, organizzati allinterno di un
registro a 16 bit (Flag Register).
I bit non usati sono fissi al valore 0.
15 14 13 12 11 10 9

OF DF IF TF SF ZF

4
AF

PF

0
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 dellultima istruzione eseguita. Vengono automaticamente aggiornati dal processore
ed il loro valore pu essere testato dallutente tramite opportune
istruzioni. Sono:
+

Carry Flag (CF)


Forzato ad 1 principalmente quando unistruzione 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 operazione
Overflow Flag (OF)
Forzato ad 1 quando unoperazione aritmetica da origine ad una
condizione di overflow.

A.Broggi

26

Flag di Controllo
Il loro valore pu essere forzato dallutente attraverso apposite
istruzioni.
In determinate situazioni sono testati dal processore che, a seconda del loro valore, si comporta in modi diversi.
+

Trap Flag (TF)


Usato in ambiente di debug, causa lesecuzione 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 lincremento
(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 comportamento dellAssemblatore, costruendo manualmente unistruzione
macchina: ad esempio
MOV AH,11
Si esamina la tabella relativa allistruzione MOV, unitamente alla
speigazione dei simboli in essa contenuti.

A.Broggi

28

Esempio: MOV AH, 11


Dalla tabella fornita per listruzione MOV si osserva il formato
nel caso di trasferimento di un dato contenuto nellistruzione stessa (immediate) in un registro; si consideri quindi la terza riga della
tabella.
Il formato macchina dellistruzione occupa quindi due byte, cos
composti:

OpCode W Reg

Dato

Il significato dei vari campi il seguente:


i primi 4 bit rappresentano lOperation Code, che identifica il
tipo di istruzione;
il bit W vale 1 se loperando 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 loperando:
nel caso in esame 11 10 00001011 2 .
Il formato macchina dellistruzione 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.

A.Broggi

30

Elementi di base del linguaggio

Un programma scritto in Assembly 8086 composto di Statements; 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 &.
Linsieme dei caratteri utilizzabili composto da
caratteri alfanumerici (maiuscole, minuscole, cifre),
caratteri non stampabili (spazio, TAB,
+

caratteri speciali (

M'

CR ,

;.",_:?@$&)

Allinterno del programma possono comparire:


Identificatori
Costanti
Espressioni

LF

),

La CPU Intel 8086: Architettura e Programmazione Assembly

31

Identificatori

Sono usati come nomi assegnati ad entit definite dal programmatore (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

A.Broggi

32

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

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)

33

A.Broggi

34

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 luso delle parentesi tonde.

La CPU Intel 8086: Architettura e Programmazione Assembly

35

Istruzioni
LAssembly 8086 rende disponibili 92 tipi di istruzioni, raggruppabili nelle seguenti classi:
+
+

Trasferimento Dati
+

Aritmetiche
+

Manipolazione di Bit
+

Trasferimento di Controllo
+

Manipolazione di Stringhe
+

Manipolazione di Interruzioni
Controllo del Processore

A.Broggi

36

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
OUT

Input Byte or Word


Output to Port

LDS
LEA
LES

Load Pointer Using DS


Load Effective Address
Load Pointer Using ES

LAHF
SAHF
POPF
PUSHF

Load Register AH from


Store Register AH into
Pop Flags from the Stack
Push Flags onto Stack

Trasf. di indirizzi

Trasf. Flag Register

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
CD/AE

?0GJId<>@ 1
`5V <=AIL?0G

segment register immediato


Si deve passare attraverso un registro general-purpose: esempio:

CD/AE
CD/AE

?0GJI ` ?c=#?sr< V0a


` <2IL?iG

segment register segment register


Si deve passare attraverso un registro general-purpose (4 cicli):
esempio:
CD/AE
CD/AE

?0GJI V <
` <2IL?iG

oppure attraverso lo stack (26 cicli): esempio:

N X <g
N /FN
\

V <

` <

Qualsiasi trasferimento che utilizzi CS come destinazione

A.Broggi

38

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) nellordine inverso a quello
in cui erano stati inseriti (PUSH).
Esempio:
< g
N X w
N X <wg
N X <wg
N X <wg

N\/FN
N\/FN
N\/FN
N\/FN

?0G
V <
` Y
3
< Y
< Y
`3Y
V <
?0G

La CPU Intel 8086: Architettura e Programmazione Assembly

Effetti di PUSH e POP sullo Stack

39

A.Broggi

40

Istruzioni Artimetiche
OpCode

Descrizione

AAA
ADC
ADD
DAA
INC

ASCII Adjust after Addition


Add with Carry
Addition
Decimal Adjust after Addition
Increment

AAS
SUB
SBB
DAS
DEC
CMP
NEG

ASCII Adjust after Subtraction


Subtract
Subtract with Borrow
Decimal Adjust after Subtraction
Decrement
Compare
Negate

AAM
IMUL
MUL

ASCII Adjust after Multiply


Integer Multiply, Signed
Multiply, Unsigned

AAD
DIV
IDIV

ASCII Adjust before Division


Divide, Unsigned
Integer Divide, Signed

CBW
CWD

Convert Byte to Word


Convert Word to Doubleword

Addizione

Sottrazione

Moltiplicazione

Divisione

Conversione

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 numero decimale BCD nei 4 bit inferiori; i 4 bit superiori devono
essere a 0 se il numero usato in una operazione di moltiplicazione o divisione

A.Broggi

42

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

destination

destination

source

source

Carry

Carry

Esempio 1:
Per sommare i 32 bit memorizzati in BX:AX con DX:CX, lasciando
il risultato in BX:AX,
? `F`
? ` 1

? GJI 1 G
i
KMGJI ` G

t <  jkjkt<  k
j jl-

 P
 P

 j .v9&&[
- &n
'8L9''&
- n

Esempio 2:
Per sottrarre i 32 bit memorizzati in BX:AX a DX:CX, lasciando il
risultato in BX:AX,
< X K
< K 1


?iGJI 1 G
KMGJI ` G

t <   - ) !4 j %v9&'


- n^
t< "  - y
) !42d9'[
- &n

La CPU Intel 8086: Architettura e Programmazione Assembly

43

Moltiplicazione e Divisione
Il processore 8086, a differenza di molti processori ad 8 bit, dispone 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.

A.Broggi

44

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 listruzione 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

A.Broggi

46

Le Istruzioni di conversione decimale-binario sono:

AAA:
converte il risultato di unaddizione 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 unaddizione in decimale packed
DAS:
converte il risultato di una sottrazione in decimale packed

La CPU Intel 8086: Architettura e Programmazione Assembly

Istruzioni
per la Manipolazione dei Bit
OpCode

Descrizione

AND
OR
XOR
NOT
TEST

Logical AND
Logical OR
Exclusive OR
Logical NOT
Test

SAL
SAR
SHL
SHR

Shift Arithmetic Left (=SHL)


Shift Arithmetic Right
Shift Logical Left (=SAL)
Shift Logical Right

ROL
ROR
RCL
RCR

Rotate Left
Rotate Right
Rotate through Carry Left
Rotate through Carry Right

Logiche

Di Traslazione

Di Rotazione

47

A.Broggi

48

Istruzioni di Shift e Rotate

La CPU Intel 8086: Architettura e Programmazione Assembly

49

Trasferimento del Controllo


OpCode

Descrizione

CALL
RET
JMP

Call Procedure
Return from Procedure
Jump Unconditionally

JA, JNBE
JAE, JNB
JB, JNAE, JC
JBE, JNA
JCXZ
JE, JZ
JG, JNLE
JGE, JNL
JL, JNGE
JLE, JNG
JNC
JNE, JNZ
JNO
JNP, JPO
JNS
JO
JP, JPE
JS

Jump If Above
Jump If Above or Equal
Jump If Below
Jump If Below or Equal
Jump if CX Register Zero
Jump If Equal
Jump If Greater
Jump If Greater or Equal
Jump If Less
Jump If Less or Equal
Jump If No Carry
Jump If Not Equal
Jump If No Overflow
Jump If No Parity
Jump If No Sign
Jump If Overflow
Jump If Parity
Jump If Sign

LOOP
LOOPE, LOOPZ
LOOPNE, LOOPNZ

Loop on Count
Loop While Equal
Loop While Not Equal

Salti incondizionati

Salti condizionati

Istruzioni iterative

A.Broggi

50

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 dellistruzione 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 allinterno 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 ridondanti: ad esempio la JA (Jump if Above) equivalente alla JNBE
(Jump if Not Below or Equal).
La seguente tabella riporta linsieme minimo di istruzioni di salto
condizionato da usare dopo unistruzione
CMP NUM1, NUM2
dove NUM1 e NUM2 possono essere due numeri con o senza segno.

NUM1
NUM1
NUM1
NUM1
NUM1
NUM1

NUM2
NUM2
NUM2
NUM2
NUM2
NUM2

numeri senza segno numeri con segno


JA
JG
JE
JE
JNE
JNE
JB
JL
JBE
JLE
JAE
JGE

A.Broggi

52

Le Istruzioni CALL e RET


LAssembly 8086 permette luso delle Procedure, in modo simile
a quanto avviene nei linguaggi ad alto livello: lunica differenza sta
nellimpossibilit di passare dei parametri nel modo consueto.
Mediante una Procedura possibile scrivere una volta per tutte 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 dimensioni 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 dallinterno dello stesso segmento di
codice cui appartiene;
FAR:
pu essere chiamata dallinterno di un segmento di codice qualsiasi.

Il tipo di procedura (NEAR o FAR) deve essere dichiarato allatto


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 unoperazione di PUSH;
caricare in IP (e in CS) il valore corrispondente allindirizzo di
partenza della procedura chiamata.

La RET provvede a:
ripristinare tramite unistruzione POP il valore di IP (e di CS nel
caso di procedura FAR) salvato nello stack, riprendendo quindi
lesecuzione del programma a partire dellistruzione successiva
allultima CALL.

A.Broggi

54

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

MOVS
MOVSB
MOVSW

Move String (Byte or Word)


Move String Byte
Move String Word

Istruzioni di Spostamento

Istruzioni di Confronto
CMPS Compare String (Byte or Word)
CMPSB
Compare String Byte
CMPSW
Compare String Word
Istruzioni di Ricerca
SCAS
SCASB
SCASW

Scan String (Byte or Word)


Scan String Byte
Scan String Word

LODS
LODSB
LODSW

Load String (Byte or Word)


Load String Byte
Load String Word

STOS
STOSB
STOSW

Store String (Byte or Word)


Store String Byte
Store String Word

Istruzioni di Caricamento

Istruzioni di Scrittura

A.Broggi

56

Le istruzioni per la manipolazione delle stringhe operano su blocchi 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 unaltra

Compare:
confronto di due dati in memoria

Scan:
ricerca di un dato in memoria

Load:
caricamento di un dato dalla memoria in un registro accumulatore
Store:
scrittura in memoria di un dato presente in un registro accumulatore

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:
+

laccesso ai dati in memoria avviene attraverso i registri SI e DI,


usati come offset rispettivamente allinterno del Data Segment
(DS) e dellExtra Segment (ES);
SI e DI vengono automaticamente modificati al termine di ogni
operazione, in modo da puntare al successivo dato allinterno
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.

A.Broggi

58

Tutte le istruzioni di manipolazione di stringhe hanno tre forme:


+

operazioni su byte (ad esempio MOVSB) che non hanno operandi;

operazioni su word (ad esempio MOVSW) che non hanno operandi;


operazioni su byte o word (ad esempio MOVS) che hanno uno
o due operandi; vengono tradotte dallassemblatore in una delle
precedenti due forme, a seconda del tipo degli operandi.

Esempio: nel seguente programma


<>=#@$P
<>=#@cR

` K
` K
CD/cE <

P ]]
P ]]

N 7 ;
`5X q
N 7 ;
` X q
5

<>=q@ PId<>=#@AR

listruzione MOVS viene tradotta dallassemblatore 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 allinterno della stringa, ma sono costruite per essere utilizzate
in costrutti iterativi attraverso luso dei Prefissi di Ripetizione.
Questi, inseriti nel programma sorgente prima dello mnemonico
dellistruzione, permettono di ripetere listruzione seguente fino a
che non si verifica una determinata condizione: esistono 2 Prefissi di
Ripetizione:

A.Broggi

60

REP o REPE o REPZ:


Se usate in combinazione con
MOVS, LODS e STOS, causano la ripetizione dellistruzione seguente per un numero di volte pari al contenuto iniziale di CX; ad ogni iterazione CX viene decrementato e listruzione viene ripetuta fin tanto che CX diverso da 0; al
termine CX vale 0;

CMPS e SCAS, il comportamento uguale al caso precedente, con lunica 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 dellistruzione seguente per un numero di volte pari al contenuto iniziale di CX; ad ogni iterazione CX viene decrementato e listruzione viene ripetuta fin tanto che CX diverso da 0; al
termine CX vale 0;
CMPS e SCAS, il comportamento uguale al caso precedente, con lunica 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

INT
INTO
IRET

Interrupt
Interrupt on Overflow
Interrupt Return

Manipolazione di Interruzioni

Permettono di gestire gli Interrupt software. La richiesta di uninterruzione causa:


+
+

il salvataggio sullo stack dei registri IP e CS;


il salvataggio sullo stack del Flag Register;
lesecuzione di una routine di servizio dellInterrupt (ISR, Interrupt Service Routine).
+

Un Interrupt simile ad una chiamata a procedura; esistono tuttavia delle differenze:

Mentre lesecuzione di una procedura pu essere attivata solo


via software, lesecuzione di una ISR pu essere attivata anche
via hardware;
Una ISR sempre FAR, in quanto comporta comunque il caricamento del registro CS.
Un Interrupt causa il salvataggio nello stack anche del Flag Register.

A.Broggi

62

Lattivazione di una ISR una procedura abbastanza complessa:


lindirizzo della routine di servizio dellInterrupt viene ottenuto da
una tabella allocata negli indirizzi bassi della memoria (nelle locazioni 0000:0000h 0000:03FFh); ogni elemento di tale tabella, detto Interrupt Vector, contiene i 32 bit dellindirizzo 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 lattivazione della routine di servizio relativa ad un certo
Interrupt. Ha il seguente formato:
INT interrupt-number
dove interrupt-number identifica lInterrupt, cio il numero dordine
dellInterrupt Vector che si desidera attivare, allinterno della tabella
che contiene i 256 Interrupt Vector ammessi dal sistema.
Lindirizzo fisico dellInterrupt viene ottenuto semplicemente moltiplicando per 4 il parametro interrupt-number.

NB: come caso particolare si ha listruzione senza parametri


INTO, che equivale a:
+
+

una INT 4 quando lOverflow Flag (OF) settato;


una istruzione nulla, altrimenti.

A.Broggi

64

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 dellInterrupt Vector


+

salvataggio nello stack del registro IP


caricamento in IP della prima word dellInterrupt Vector

La CPU Intel 8086: Architettura e Programmazione Assembly

65

Istruzione IRET
listruzione conclusiva di una ISR; causa il ritorno del sistema
nello stato precedente allultima INT e lesecuzione delle istruzioni 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.

A.Broggi

66

Istruzioni
per il Controllo del Processore
OpCode

Descrizione

CLC
CLD
CLI
CMC
STC
STD
STI

Clear Carry Flag


Clear Direction Flag
Clear Interrupt-Enable Flag
Complement Carry Flag
Set Carry Flag
Set Direction Flag
Set Interrupt Enable Flag

ESC
HLT
LOCK
WAIT

Escape
Halt
Lock the Bus
Wait

NOP

No Operation

Modifica dei flag

Sincronizzazione

Istruzione nulla

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 lInterrupt Flag;

A.Broggi

68

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 processore procede con lesecuzione dellistruzione 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 durante lesecuzione dellistruzione 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
lInstruction Pointer (IP) allistruzione 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 dellesecuzione dellistruzione successiva.

A.Broggi

70

Modi di Indirizzamento
Il Modo di Indirizzamento di unistruzione definisce il metodo da
utilizzare per determinare dove memorizzato un particolare dato
(operando).
Gli operandi possono essere contenuti:
+
+

in registri;
+

nellistruzione 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
Nellistruzione specificato il registro da utilizzare come operando.

Formato Assembly:

registro

Esempio:
CD/cE

?0GJILK\G

A.Broggi

72

Immediate Addressing
Nellistruzione stessa indicato il dato da utilizzare come operando.

Formato Assembly:

espressione

Esempi:
CD/AE
CD/AE

?HGJIQP ]

K , I 7 ~P


;b P ]

La CPU Intel 8086: Architettura e Programmazione Assembly

73

Note:
+

Loperando pu anche essere un simbolo definito mediante una


pseudo-istruzione EQU.
Esempio:

V WFX
M
'
C/AE

PSRe~
1 GI

Il dato indicato nellistruzione viene trasformato dallassemblatore in formato binario su 8 o 16 bit, e scritto nel campo opportuno dellistruzione 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.

A.Broggi

74

Direct Addressing
Nellistruzione specificato il nome di una variabile, corrispondente allEffective Address della parola di memoria da utilizzare come operando. Alla variabile pu essere sommata o sottratta unespressione.
Lindirizzo fisico ottenuto sommando lEA con il contenuto del
Data Segment DS moltiplicato per 16.

Formato Assembly:

variabile

espressione

Esempio:
CD/FE
CD/FE

?0GIL=?AK _
, V
?0GIL=?AK _
, V

P

La CPU Intel 8086: Architettura e Programmazione Assembly

Esempio di Direct Addressing

75

A.Broggi

76

Register Indirect Addressing


LEffective Address delloperando contenuto in uno dei seguenti
registri:
+
+

Base;
+

Index Register (DI oppure SI);


Base Pointer (BP).

Viene detto Indirect perch nellistruzione indicato dove trovare


lindirizzo delloperando.

Formato Assembly:


registro

Esempio:
CD/cE
CD/cE

?0GJIm K0G
?0GJIm < Y

La CPU Intel 8086: Architettura e Programmazione Assembly

Esempio di
Register Indirect Addressing

77

A.Broggi

78

Esempio
Codice per il trasferimento di un vettore in un altro usando il
Register Indirect Addressing.

W5XBY 

CD/AE
CD/AE
CD/AE
CD/FE
CD/AE
? `F`
? `F`
, /s/AN

< Y I
/ x|x< V = < / X @ 1 V r E V 1 =
= rE V 1 =
/ x|x< V = `5V <wA
`3Y I
1 GJI
E V 1 =Ar ,_V0ZAa =qg
?iGJI
< Y
`cY IL?HG
< Y I
R
R
`3Y I
W3XcY

La CPU Intel 8086: Architettura e Programmazione Assembly

79

Base Relative Addressing


LEffective Address delloperando calcolato sommando il contenuto di uno dei Base Register (BX o BP) ad un displacement rappresentato da una costante presente nellistruzione stessa.

Formato Assembly:

registro

displacement

Esempio:
CD/AE

?HGJIm K0G

CD/AE
CD/AE
CD/AE

?HGJIm K0G ~
?HGJIJ~v K0G
?HGJIm K0G ~

Nota:
le 3 forme

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


LEffective Address delloperando calcolato sommando il valore di un offset, contenuto in una variabile, ad un displacement,
contenuto in uno degli Index Register (SI o DI).

Formato Assembly:

variabile
variabile

SI
DI

Esempio:
C/AE

?0GJIL=|?AK ,oV `FY

A.Broggi

82

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.

W5XBY 

CD/AE
CD/AE
CD/FE
CD/AE
? `F`
, /s/AN

< Y I
]
1 GJI
E V 1 =Ar ,_V0ZAa =qg
?iGJI
< / X @ 1 V rE V 1 =
`5V <=Fr E V 1 = < Y IL?iG
< Y I
R
W3XcY

< Y

A.Broggi

84

Base Indexed Addressing


LEffective Address delloperando 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 nellistruzione stessa.

Formato Assembly:

variabile
variabile
variabile
variabile

BX
BX

BP
BP

SI
DI
SI
DI

Esempio:
C/AE

?0GJIL?0@B@B?BLKhG `AY

La CPU Intel 8086: Architettura e Programmazione Assembly

Esempio di Base Indexed Addressing

85

A.Broggi

86

Segment Register Impiegato


La seguente tabella riassume i vari modi di indirizzamento con il
Segment Register impiegato da ognuno.
Indirizzamento
Register
Immediate
Direct
Register Indirect

Base Relative
Direct Indexed
Base Indexed

Formato
SegReg
registro
nessuno
dato
nessuno
variabile
DS
[BX]
DS
[BP]
SS
[DI]
DS
[SI]
DS
label [BX]
DS
label [BP]
SS
label [DI]
DS
label [SI]
DS
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 unistruzione si ricava sommando:
+

il tempo di esecuzione vero e proprio (fornito dal costruttore per


ogni diverso impiego di ogni istruzione)
leventuale calcolo dellEffective Address.

La seguente tabella mostra i tempi di calcolo dellEffective 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.

A.Broggi

88

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 lassemblatore. Non vengono tradotte in istruzioni macchina, ma sono interpretate come operazioni che lassemblatore deve compiere al momento dellassemblaggio.
Vi sono circa 60 Pseudo-Istruzioni, ma verranno sommariamente
analizzate solo quelle di uso comune, utilizzando come riferimento
un programma dimostrativo.

A.Broggi

90

LE FUNZIONI MS-DOS
Il Sistema Operativo MS-DOS offre al programmatore assembly
un insieme di funzioni che permettono di eseguire le pi comuni operazioni di gestione del sistema, permettendo al programmatore di
trascurare i dettagli relativi allimplementazione 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, periferiche);
allocazione e deallocazione di aree di memoria;
+
+

Inoltre, per garantire la portabilit dei programmi su tutte le macchine dotate di MS-DOS prescindendo dallhardware usato, ogni costruttore 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

Visione Stratificata del Sistema DOS

Livelli superiori

Applicazioni Assembly

DOS
BIOS
Hardware

91

A.Broggi

92

Accesso alle funzioni DOS e BIOS


Le funzioni DOS sono richiamabili mediante listruzione 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 loperazione si conclusa correttamente, mentre lo forzano ad 1 se si
sono verificati degli errori.
Linsieme delle funzioni disponibili varia in funzione della versione del DOS usata; auspicabile che linsieme delle funzioni corrispondente ad una determinata versione contenga gli insiemi delle
funzioni corrispondenti alle versioni precedenti.
Le funzioni BIOS sono richiamabili mediante linvocazione di un
particolare Interrupt con listruzione INT; molte di esse possono fornire diversi servizi che si distinguono dal valore presente nel registro
AH al momento della chiamata.
Esempio:
C /FE
D
Y[Z =
CD/FE
Y[Z =

R"P
P ]

?3gI ]f

?3gI ] ?





t x u.'
t ' w V

t< %bn'u.& K
t - 1\69b%p

` / <

p

Y/ <

p @ - 45 . - 4
p

& 1


- 

La CPU Intel 8086: Architettura e Programmazione Assembly

93

Accesso diretto alla memoria video


Laccesso 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
listruzione OUT.
Modalit superiori a 256 colori o truecolor: iniziano a A0000,
e proseguono su moduli differenti.

A.Broggi

94

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.

A.Broggi

96

Il processore 8080
+

Introdotto nel 1973;


+

il primo processore a 8 bit;


+

10 volte pi veloce dell8008;


+

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 dell8080;

altre case hanno sviluppato processori compatibili con l8085


(Zilog Z80);
lultimo processore a 8 bit, venduto in 700 milioni di copie.

A.Broggi

98

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 ununit di prefetching;


include operazioni complesse come la moltiplicazione e la divisione.

La CPU Intel 8086: Architettura e Programmazione Assembly

99

Il processore 8088
+

Nato 1 anno dopo l8086;

l8086 e l8088 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 all8086 (16 bit);

linsieme delle istruzioni riconosciute dall8086 coincide con


quello dell8088, portando completa compatibilit;

l8088 stato affiancato all8086 perch rende possibile limpiego di periferici ad 8 bit.
nel 1981 IBM include l8088 nel proprio personal computer.

A.Broggi

100

Il processore 80286
+

Rappresenta levoluzione dell8086, introdotto nel 1983;


+

indirizza 16 M byte di memoria;

linstruction set praticamente identico a quello dell8086 a meno di poche istruzioni per lutilizzo 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 all80286;

un processore a 32 bit (sia per il bus dei dati sia per laccesso
alla memoria);
+

indirizza 4 G byte di memoria;

nascono diverse versioni dell80386: 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.

A.Broggi

102

Il processore 80486
+

Nel 1989 viene introdotto l80486;

non molto differente dal precedente se non per linclusione


della parte matematica (80387) e di 8 k bytes di cache;
+

funziona a 50 MHz, e arriva a 50 MIPS (50% pi veloce dell80386);


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.

A.Broggi

104

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 dellarea del processore, vengono implementate 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 finora 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 laccortezza di inserire il
valore corretto nel descrittore della zona di memoria utilizzata.
Ci sono due tabelle di 8192 descrittori luna; la prima per descrittori validi per tutti i programmi (Global descriptors), la seconda
per descrittori validi solo per particolari applicazioni (Local descriptors).

106

A.Broggi

CREAZIONE DI UN PROGRAMMA
ASSEMBLY
Il processo di creazione di un programma Assembly passa attraverso le seguenti fasi:
+

scrittura, tramite un normale EDITOR, di uno o pi file di caratteri ASCII con estensione .ASM contenenti il programma
sorgente.

assemblaggio, tramite un ASSEMBLATORE, dei singoli file sorgente, 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 DEBUGGER.

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 allassemblatore 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

?3@B@B?q

N X K ,_Y 1
` K

?0@B@B?B
P ]>]

?0@B@B?B

?3@B@q?B  K0 = V
ah, / Kh? ,
K
P
]]
`

Esempio: file 2
G = V @ Z
?0@c@q?B  K3F= V
V A
?q@c@B?B IL?0G
CD/AE

K ? ,
?0@B@B?B  K5A= V
a#, / h
?c@B@q?B IL?0G
C/cE

A.Broggi

108

LAssemblatore
LAssemblatore trasforma i file di caratteri contenenti il programma 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 delloffset 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 eseguibile (.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 programma composto da un solo modulo oggetto.

A.Broggi

110

Il Debugger
Il Debugger un ambiente di verifica e messa a punto dei programmi Assembly. Esso permette di:
+

visualizzare, ed eventualmente modificare, il contenuto dei registri 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 lallocazione 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 lallocazione 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 suddivisibili nelle seguenti classi:
+
+

Procedura principale (o MAIN)


+

Procedure di medio livello


Procedure di basso livello
di interfaccia
di calcolo

A.Broggi

112

Strutturazione delle procedure


Alcune regole per la standardizzazione della codifica delle procedure sono:
+

Il corpo principale del programma (MAIN) deve essere corto, e


formato esclusivamente da chiamate a procedure; inoltre, deve
comparire come prima procedura allinterno 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 lindirizzo corretto per ritornare al sistema
operativo.
Ogni altra procedura deve essere preceduta da unindicazione
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 :::::::::::
t N
% %4w6 -  )&p&n'99 -j  -  4>Q j %b
b j  .9b: -

] %

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.'

` <  Z / =q? U p j j &u%u -  P%I - ) j %wQ 9 - 4w .


% jl- )&
tA@ V3aFY <w=q@ YX = 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 xHP 9 n"l pL9 - bv > t w>)&
b1 xHLPI 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 procedure di basso livello di interfaccia.

A.Broggi

114

APPENDICE A:
Programma di Esempio
= Y = ,_V

V 9b .
& - u 4>1 - )
%) -  V ) 


` < V3a
N ? a YZ ?
, x
1 @
g3=
= Y= / , /
Y <w=#@ XFUY / ZBY
1/ `FY 1 V r =#?F<w= /
K YZ r C V <<
`5V 1 r C V <<
= V @ C YZAV
` < V3a

< 0
V a C i
V Z = N ?A@B? N X K ,oY 1 p ` ?B=q? p
]%]
VMWAX

] ?
VMWFX

] `
V\W X

]%
VMWAX

p15/ @c< / 41 ? , 1q/ , ?A= / @ YV_,_V =#=q@ / ZBY 1 Y p
` K
1 @ }I gA=FIgA=FI}gc=FI}gA=FIgA= I 1 @ I pNi j % y - 9 p
` K
` K

1 @ I , x3I}gA=FIgA=FI p @ -  .9 w - u% K & -  -  p


` K
1 @ I , x3I}gc=FI}gA=FI p @ -  .9 .w - u%'6 ` f
 jQ- )&  p
` K
1 @sI , x3I , x3IgA=FI p X 8pp - ) -  . - u%& <  Z p
` K
V_ZA` <

<>=#? 1h C
<>=#? 1h C

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
` K
V_Zc` <

1 < V3a

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
C ? YZ

x2?A@
N @ $
/ 1
N X <wg
` <
? GI ]]
0
CD/cE

?HG
N X <wg

t Y b9 bu%m4 - ) - 9
 - b < V CN @ V
t - )Q&6
'v4> %Q> -k
j j 
t

ub -

4

La CPU Intel 8086: Architettura e Programmazione Assembly


1 ? ,o,
Y[ZcYbU2Y ? ,YbU_U ? UY / ZBV
1 Y 1 , / r N @ YZ 1 Y N ? ,_V
 1 ? o
N @ / CON =
, ,
1 ? ,o,
, V =#= X @q?sr ` ?A= Y

< =q? CN ?sr `FV 1



1 ? ,o,
< =q? CN ?sr K YZ

1 ? ,o,
= V <w=Ar x YZ ? ,\V
1 ? ,o,
1 Y 1 , / r N @ YZ 1 Y N ? o
T.ZAU
, V
@ V =
t @ '
C ? YZ
V_ZA` N

115

- ) <  9 jl-

/3 % - &n

t :::::::::::t
t
N_bz
 f4w - 4Qw'u. - )&u%u - u%
t

tA@ V3aFY <=#@ YX = Y,YbU_U ?c= Y  ?0GJI ` GJI ` <


t :::::::::::t
Y[ZcYbUY ? ,oYUU ? U2Y / ZAV

N @ /s1
Z3V ?A@
? GI ` < V3a
0
CD/cE
CD/cE
` <I}?cG
CD/cE
CD/cE
Y[Z =

?3gsI ]]

? , I] e

P ]


t Y 'u. - )&&u.u - u% 9 % j %v4 - 


t :  -j ' )k .> 9b ?0G 
t < %n^u%& K Y / < p < E34 %vClz4 p
t j z4w: %9b ] R I
)'
t 7 V  - 9w[[
 %w CD/AE ?0GJIe ;

CD/cE
1 ? ,o,

G I ] ewP
t Yj 
 z9 -  - 7 ` g ;
)'6 - 7 `F, ;
` J

< N3/ <w=q?sr 1 X @A< / @ V
t Cn y)l
9b y %)&) - 99
% %)' -

CD/cE
1 ? ,o,

` GJI / x|x< V = = Y = / , / t<


%)' ) - 9 ' <=q? CN ?sr<w=#@ YZFa ?
t
) - 9 -j  - 

7` < ` G ;

t Yj z9 -  - 7 ` g ;
)'6 - 7 `F, ;
CD/cE
` GJI ]]

< 3
t Cn y)l
9b y %)&) - 99
% %)' 1 ? ,o,
N / <w=q?sr 1 X @A< / @ V
@ V =
t @ ' - )) - bz
 .4w -
 -jk- w

Y[ZcYbUY ? ,oYUU ? 2
U Y / ZAV
VoZA` N
t :::::::::::t
t
Nz
 .4 -  %9 -j  -  ) j f99 - 'w&u% - )&
t

tA@ V3aFY <=#@ YX = Y,YbU_U ?c= Y  ` GJIL?3g


t :::::::::::t
N @ / CON =

N @ / 1

Z0V ?A@

t
t

A.Broggi

116

N @ / CON =

CD/cE
` GJI / x|x< V = Y <=#@
X UY / ZcY t <
 %)& y) - 9 b - 7 ` <  ` G ;
< =q? CN ?sr<w=#@ Y ZFa ?

t ) - 9  -j  - 
1 ? ,o,
@ V =
t @ '  - )) - 
 bz
 .4w -
 -jk- w

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 @ V3aFY <=#@ YX = Y,YbU_U ?c= Y  ?0GJILK , I 1 GJI ` G
A
t :::::::::::t
<>=#? CON ?sr K YZ

1 Y 1 , / rK YZ ?B@ Y /J

<>=#? CON ?sr K YZ

N @ / 1
Z0V ?A@
CD/cE
` GJI / x|x< V = K YZ r C V <<t<
% %)' ) - 9& - 7 ` <  ` G ;
<=q? CN ?sr<w=#@ YZFa ?
t ) - 9 -j  - 
1 ? ,o,
CD/cE
`5, I 1#/ `FY 1 V r}=#?F<= /A t 1 - 
- )Q
z4w
 {4" .)k - 9
t 1i -  4 %Q&9
CD/cE
` gI ]

G / @
? , I? ,
t ? u%u . - )k .9bb ? ,
<"g ,
t<  , &
% - < & 9 `5, I ] P


? ` 1
? , I}? ,
t Y  ? , 9Q y)D1 ?A@B@h
<=q? CN ?sr ZAX C V @ /
t <  -j  - ) -
&[ - ' -  1 ? ,o,
t ` f
 j  - )l
b -  4 %)m

)
`5V 1
` g
t<  %pL] % - 8p - ) - n")' 1 Y 1 , / r}K YZ ?c@ Y /
T.ZAU
@ V =
t @ ' - )) - bz
 .4w -
 -jk- w

V_Zc` N

t :::::::::::t
t
N_bz
 f4w -  %9 -j  -  > j v jQ- 4> f
 jl- )'
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 @ V3aFY <=#@ YX = Y,YbU_U ?c= Y  ?0GJILK\GJI ` G
A
t :::::::::::t
<>=#? CON ?sr `FV 1

N @ / 1

CD/cE
1 ? ,o,
CD/cE
G / @
CD/cE
Y[`AY E
CD/cE
1MCON

t
t

ZiV ?A@
` GJI / x|x< V = `5V 1 r C V <<t<
 ) y) - 9[& - 7 ` <  ` G ;
<=q? CN ?sr<w=#@ YZFa ?
t ) - 9 -j  - 
? , I 1q/ `AY 1 V r =#?F<w= /c t 1 - 
- )Q
z4w
 4> %)l - 9
?3gsI}?Ag
t ? u%u % - )k % 9 ?0g
K , I] ?
t <  - )l4'n 4w 47 P ] ` .
 jl- )' *;

K ,
t ` n^ 9b&  -  %
t< - )&n - &9)& - Q ` G  %4
` GJI?cG
? , I] ?
t 13m9 - 
) y
 .w' -  -z



La CPU Intel 8086: Architettura e Programmazione Assembly

`5XAV r 1 Y x|@ V 

<>=#? CON ?sr `FV 1

117

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

V_ZA` N

t :::::::::::t
t
N_bz
 f4w -  %4  % j  -  9 y.

% p - )' t

 % - u%&

tA@ 3
< =#@ YX = Y ,YbU_U ?c= Y  ?0GJI ` G
V aFY 
t 1/ `FY 1 Y`3Y @ Y = / @ Z /
t
[ 8p - )& - b . - u%&
U .) -  ]
t
U .) -  P [ 9
m4 - )Q> -jkjkt :::::::::::t
= V <w=Ar x YZ ? ,_V

= V <w=Ar x YZ ? ,_V

N @ /$1
CD/cE
1 ? ,o,
1 ? ,o,
1MCON
@ V =
V_ZA` N

t
t
t

Z V ?c@
3
` GJI / x|x< V = = V @ C YZcV t<
% )&& ) - 9' - 7 ` <  ` G ;
<=q? CN ?sr<w=#@ YZFa ?
t ) - 9 -j  - 
t , . {4 -  - 9' . - 9 %u - 

,V =#= X @q?sr< Z

? , I p8p
t Cz4w'
- ) x , ? a p U p
t @ ' - )) - bz
 .4w -
 -jk- w
 


t">>t
t
*t
Nz
 .4 4Q - 99)n %)&)&4k . -
%
 t">>t

t :::::::::::t
t
Nz
 .4w -  .9 -j  -  y j %v4 - ]
-

t N ?c@c? C V =#@ Y J)k j  p j j uu -  ? ,


t E ?B@ Y ?cK Y,Y J)l> j .v4> %)&) -  - & - j j bu%u - vN ? a YZ ?
t @ V3aFY <=#@ YX = Y,YbU_U ?c= Y  ?0GJI 1 GILK ,
A
t :::::::::::t

t
t

t
t

A.Broggi

118
<>=#? CON ?sr ZBX C V @ /

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

? F
` `
CD/cE
CD/cE
CD/cE
Y[Z =
@ V =

N @ $
/ 1
Z3V ?A@
? , I p}]p
?3gsI ] ?

KMgI N ? a$YZ ?
1 GJI ]]] P

P ]

V_ZA` N

t ,-

- 9b 4 -
Q - b' pQp ]^p
t < .n^u%& K Y / < p  1 - %p

t N - & -- b&n t <  ->j  - 9)v
-  - b %b

t @ '

- )) -

bz
 .4w -

t :::::::::::t
t
Nz
 .4w -  .)  . 4 -  - 9 % - v4> .l - 9p < pJp Z p
t
&b - 9)'v4 - n^ .) ( - ) j %v>4 %m4"6  - 9

 -jk- w


t
t

tA@ 3
V aFY <=#@ YX = Y,YbU_U ?c= Y  ?0G
t 1/ `FY 1 Y`3Y @ Y = / @ Z /J ? , )l
b4&
% ?5< 1 YY ) b
t :::::::::::t
= = X @q?sr < Z
,V #
/ E ?$r ,_V =#= X @B? 
Z X A
3

x Y ZAV r ,_V =#= X @q? 


,V =#= X @q?sr < Z

N @
/ 1
ZiV ?A@
?0gI ]^
t< .n&u% ` / < p @ - 4h .^ - 41 - 
C/cE


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



? , I}R ]
t 1in %b  j &9
%)'
/ @

? , I p8p
t< ) - 9v> j w pQp Z p 9b

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

VZA` N

t :::::::::::t
t
N_bz
 f4w -  %9z9 -  y)Q
9b
t

t N ?c@c? C V =#@ Y J) y


4w& -  4 %)) - z9u%& 4 )m
9 96 j j 'u
t
u -  y .)Q 9bb ` G  ` g & - I `5,
b)& - 
t E ?B@ Y ?cK Y,Y J)l> j .v4> %)&) -  - & - j j bu%u - vN ? a YZ ?
tA@ V3aFY <=#@ YX = Y,YbU_U ?c= Y  ?3gILKMg
t :::::::::::t
< N3/ <w=#?sr 1 X @c< / @ V

CD/cE
CD/cE
Y[Z =
@ V =

? @
N @ /$1
Z V A
3
KMgI N ? a$Y Z ?
?3gsI ] R

P ]


t
t
t

t
t

t N - & - n*4 % - b&n - 


t < %n^u%& K Y / < p < 1M9
t Nz9b&&8p
t @ ' - )) - bz
 .4w -
 -jk- w


La CPU Intel 8086: Architettura e Programmazione Assembly


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

119

V_ZA` N

t :::::::::::t
t
N_bz
 f4w -  %)   > - 9b j j u%u - )1/ `AY 1 V r =#?F<w= /
t

t N ?c@c? C V =#@ Y J)k j  p j j uu - 1/ `FY 1 V r =#?F<w= /


t @ V3aFY <=#@ YX = Y,YbU_U ?c= Y  ?0G
A
t :::::::::::t

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

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

N @ /$1

? @
Z3V A
?3gsI ] P
t < %n^u%& ` / < p @ - 45 . - 41 - %p
CD/cE


R"P
t C j &u%u - )l
-  -  %b - )) - )>
-
Y[Z =

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

VZA` N

t :::::::::::t
t
Nz
 .4 -  %9 -j  -   - 9'6 t

t N ?c@c? C V =#@ Y J)&p&4&&u%u%4> %)) - 9[' - ( j j uu - 


t @ V3aFY <=#@ YX = Y,YbU_U ?c= Y  ?3gI ` G
A
t :::::::::::t
<>=#? CON ?sr<w=#@ YZFa ?

<>=#? CON ?sr<w=#@ YZFa ?


1 < V3a

C /cE
D
Y[Z =
@ V =

N @ / 1
Z3V ?A@
?3gsI ]

R"P

V_Zc` N

V ZB` <
o
C ? YZ
VZA`

t
` < ` G

t < %n^u%& ` / < p NH' < &p t ) t 9[ -  pJw -  - 4 -v` <  ` G 
t @ ' - )) - bz
 .4w -
 -jk- w


A.Broggi

120

APPENDICE B:
Esempio di Documentazione
dellIstruzione AND
? Zc`
? Zc`

, 
- ) ? ZA`

x ) - z9/
]
`

Y =< U ? N1
y ]

4> .9b& -  I 9b



, 
>

4> f9& - b

? ZA`

4> f9' - 

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' - 
]
]
P
]
P
]
P
P
? Zc` 9 S9 -

'(  .9b)'


 y
% . - 649 -  P 

/0 % - 49
 % 9 % I
 % 9 % I
-

 j )  % 9 % I
j j b I
j j b I

1 )&z
w9
M
^ 7!h46;

, &

@ .9)&
]
]
]
P

P 




bb f9b64w&S9


=  - 69[ .9

  9 
~

 jdj %4w - 
~

 I  jdj %4w - 


P
>7 Pfe ; V ?
j j 
P 7 R>~ ; V ?
R
 .9bb .
P 7 R ; V ?
R
 jj .4 - 

K  f9

V -j )&

? A
Z ` ? , I ` ,
e ~
? ZA` 1 GJI ] x|x

RSe
? ZA` ?0GJI ] P ]]]] P ]
R(:~
? ZA` 1 GJI C ?F<
R(~
? ZA` E ? ,_XAV I}K ,
e :
? ZA` <>=#?A= X <8I ] P


La CPU Intel 8086: Architettura e Programmazione Assembly

APPENDICE C:
Instruction Set della CPU INTEL 8086
?3?c?
?3? `
?3? C
?3?A<
? ` 1
? `F`
? Zc`
1 ? ,o,
1 K
1 , 1
1 ,o`
1 ,_Y
1MC1
1MCON
1MCON <
1MCON <wK
1MCON <
1 {`
` ?A?
` ?F<
`5V 1
`3Y E
V < 1
g , =
Y[`AY E
Y C XA,
Y[Z
Y[Z 1
Y[Z =
Y[Z = /
Y@ V =
T ?
T ? V

?3< 1 YY ? 469 -  % ? 44w'


?5< 1 YY ? 4>9 [ ` n^ 9b&
?5< 1 YY ? 4>9b - [ %Cl)'&)
?5< 1 YY ? 4>9b - [ % < w -
(&
? 44!'
1 - 

? 44&
, &
- ) ? ZA`
1 - ))mN8
% .4w
1\n %b K z y 4
1o)& - 1 -  x ) - 
1M)' -  ` &b f
' x ) - 
1M)' -  Y w %b V  - )& x ) - 
1M j )& j %w1 -  x ) - 
1M j  - 
1o j  -  < &7 K ^ y% 4;
1\ j  -  < b K 
1\ j  -  < & 4
1Mn %b 4 ` >6)& %!#4
` .
% jk- ) ? 4>9 -  % ? 44w'&
` %
 jk- ) ? 49b -  % < w -
(
` f
 j %
` &n&4 I X 69b& .4
V 9
- 
g - )'
Y w % % ` &n 4w Id< ' f4
Y  . Cl))& Id< ' .4
Y w K z  4
Y 
% j %
Y w w
Y  .bw/0n %)'!
Y  .bw @ b
T  j  Y ? n
T  j  Y ? n^ % Vo  - )

121

A.Broggi

122
T K

T K V
T 1
T 1 G U
T.V
Tfa
Tfa$V
T.,
T.,\V
T CN
T.Z ?
T.Z ? V
T.Z K
T.Z K V
T.Z 1
T.ZAV
T.ZFa
T.ZFa$V
T.ZA,
T.ZA,_V
T.Z /
T.Z N
T.Z <
T.Z U
T /
T N
T N V
T N5/
T <
T*U
, ?AgAx
,` <
,V ?
,V <
, /s15
, / ` <
, / ` <wK
, / ` <
, /s/AN
, /s/AN V
, /s/AN ZAV
, /s/AN Z U
, /s/AN U
CD/FE

T  j  Y K )!
T  j  Y K .)'! % V_  - )
T  j  Y 1 - 
T  j 1 G @ %&9b . U %
T  j  Y V_  - )
T  j  Y a b -  %
T  j  Y a  - b .% Vo  - )
T  j  Y , .99
T  j  Y , %99 V_  - )
T  j  X 
4'& - )&)&
T  j  Y Z > ? n
T  j  Y Z  ? n % V_  - )
T  j  Y Z  K %)!
T  j  Y Z  K .)&!  V_  - )
T  j  Y Z 1 - 
T  j  Y Z " V_  - )
T  j  Y Z  a  -  
T  j  Y Z > a b -  .% V_  - )
T  j  Y Z  , .99
T  j  Y Z /B , f9b9  V  - )
T  j  Y Z /3n .[)!
T  j  Y Z vN - &
T  j  Y Z  < &
T  j  Y Z  U .
T  j  Y /3n %[)&!
T  j  Y N - &
T  j  Y N -  V n .
T  j  Y N - b&/344
T  j  Y < 
T  j  Y U .b
,  - 4 @ 9bb . ?0g  j
,  - 4N8w % X 9& ` <
,  - 4 V [[ f
'n ? 44 .99
,  - 4Nw % X 9 V <
, 
% K 9

,  - 4 < b7 K   S4;
,  - 4 <  K ^
,  - 4 < & 4
,  1\
)' V_  - )
, 

)& Z  Vo  - )
, 

&) Z  U %
, 

)' U %
, 

Cln 7 K  y% 4;

La CPU Intel 8086: Architettura e Programmazione Assembly


CD/FE <
CD/FE <wK
CD/FE <
C XA,
Z3V0a
Z /AN
Z / =
/ @
/ X =
N\/FN
N\/FN x
N X <wg
N X <wgAx
@ 1 ,
@ 1 @
@ V N
@ V N V
@ V N ZAV
@ V N Z U
@ V N U
@ V =
@ / ,
@ / @
<>?AgAx
<>? ,
<>?A@
<>KhK
< 1 ?F<
< 1 ?F<wK
< 1 ?F<
<>g ,
<>gA@
<>= 1
<>= `
<>= Y
<>= / <
<>= / <wK
<>= / <
< X K
= V <w=
? Y=
G 1 g a
G , ?A=
G / @

Cln < b7 K z  4;


CQn < '6 K ^
Cln < b 4
Cl)&&)' I X 9b& .4
Z % - 
Z /5 % - 
, 
- ) Z / =
, 
- )/ @
/0wN8b
N - 4 j  <  -


N x ) - z9 j  <  -
%

N9
4b <  -
%

x ) - z9b <  -
%
N_69

@  -  y b
1 -  , 


@  -  y 
1 -  @ & 



@  - 
@ % - 
&)& V  - )

@  - 
&)& Z  V  - )

@ % - 
) Z  U .b

@ . - 
') U .

@ b j Nz
 f4w
@  -  , 
@  -  @ & 

< b @ %&9b % ?3g 
< '[ ? & j 
, 


< ' ? & j 
@ & 



< 6w -
!'
K !

<
-  < &7 K ^ % 4;
<
-  <  K z
<
-  < b& 4
< '[ , 
- ) , %

< ' , 
- ) @ ' 


< 1 -  x ) - 
<  ` & .
& x ) - 
<  Y  .bw V  - )' x ) - 
< b < &7 K ^ y% 4;
< > <  K z
<  < b 4
< w -

= %9b
- &
V 
-  @ 9bb .9

=  - 9b) - 
V
%)&69b&n / @

123

A.Broggi

124

APPENDICE D:
Funzioni DOS (INT 21h)
]%]

] P
] R
] e
] ~
]
]
]f
]
]%
] ?
] K
]f1
] `
] V
] x
P ]
P%P
PSR
Pe
P~
P
P
P
P
P
P?
PK
P 1
P `
P V
Px
R ]
R"P




































7]z;
7P ;
7R ;
7e ;
7~ ;
7 ;
7 ;
7;
7 ;
7z;
7 P ]z;
7 PP ;
7 P*R ;
7 Pfe ;
7 P.~ ;
7P ;
7 Pf ;
7 P ;
7 Pf ;
7 P z;
7 R ]z;
7 RP ;
7 RR ;
7 Re ;
7 R>~ ;
7R ;
7 R ;
7 R >;
7 R ;
7 R z;
7 e ]z;
7 ewP ;
7 ezR ;
7 ee ;

= % j  -  N -j


@ - 45 .^6 - 41 -  -
 % - 64 V



1 -  -
 /3w

? w&)& - 1 -  -
( % Y 

? w&)& - 1 -  -
( %/3b6w

N&b .1 -  -
( %/3w

` b .
1\9) 1 -  -
 % Y /

` b .
1\9) 1 -  -
 % Y w!0" V



1\9b) {1 -  -
b . Y w!' > V




N& < b
K w[[ %b f4 Y w
1 f
 <  - 4 - 4 Y w <  - 9

1\)& -  Y  K [ . I  % Y n x 


`  9 @ .9 
< %) %
 ` % - )& ` n^
/0 . x )& I X 9b& x 1 K 9
1\)&z9b x &)& I X 9b& x 1 K 9
< - 

x 1 K 9
> x 9C - S
& x )' I !|&



< - 

x 1 K 9
> Z C - S
& x ') I !H'



` %)' % x &)& I X 9& x 1 K 9
<  % - ) @ - 4 I X 9& x 1 K 9
<  % - ) & I X 9b x 1 K 9
1\ - b x &)& I z9b x 1 K 9
@ % -j x ') I z9 x 1 K 9
@ .9b .n^ f4
a 1\ .w `  9b
<  ` 9b =  - 9 % ? 44 .9b97 ` =#? ;
a % x2?c= Y w[ jk- &1\6b %w ` n
a  x?A= Y w jl-  <  f
&[& .4 ` &n
@ .9 %n .4
@ .9 .n f4
@ .9 %n^ f4
@ .9b .n^ f4
@ - 4w j @ - 4 I X 9b x 1 K 9

La CPU Intel 8086: Architettura e Programmazione Assembly


R%R

Re

R ~

R

R

R

R

R

R?

RK

R 1

R `

R V

Rx

e ]

e>P

e.R

e%e

e~

e

e%

e

e%

e

e%?

e%K

e 1

e `

e V

e%x

~ ]

~P

~fR

~.e

~%~ ]]
~%~ ] P
~%~ ] R
~%~ ] e
~%~ ] ~
~%~ ]
~%~ ]
~%~ ]z
~%~ ]
~%~ ]


7 e~ ;
7e ;
7 e ;
7 e ;
7 e ;
7 e z;
7 ~ ]z;
7 ~P ;
7 ~^R ;
7 ~ze ;
7 ~~ ;
7~ ;
7 ~z ;
7 ~ ;
7 ~z ;
7 ~ z;
7 ]z;
7 P ;
7 R ;
7 e ;
7 ~ ;
7  ;
7 ;
7 ;
7 ;
7 ;
7 ]z;
7 wP ;
7 zR ;
7 e ;
7 ~ ;
7 ;
7  ;
7 ;
7 > ]z;

7 >bP ;

7 >R ;

7 >:e ;

7 >~ ;

7 > ;

7 >: ;

7 > ;

7 >: ;

7 > z;

@ - 4w j b' I X 9b x 1 K 9


a  x )' < u% I X 9b x 1 K 9
<  @ - 64w j :@ f
4 x & %) 4 I X 9 x 1 K 9
<  Y w %wE3 .

1\ - b {N -j < % j %w
@ - 4w j K )
% @ - 4 I X 9 x 1 K 9
@ - 4w j K )
% ' I X 9& x 1 K 9
N - 9b x &)& . -j
a  < w9 j `5- 
<  < 9 j `5- 
a  < w9 j =  j
<  < 9b j =  j
< % @ f9 E V @ Y x\ < !h&S


a  `  9b =  - 9  ? 464wb .997 ` =q? ;
a  ` / < E3 %9 Z  j  %
= . j & - b - 4 <  - @ .9b4w .w
@ .9b .n^ f4
a % < %1o) K  - <  - 69
@ .9b .n^ f4
a  Y w %b6wE3 %

a  `  9b x  % <  -

@ .9b .n^ f4
a % < %1\w ` % .4w .w Y w jl- &
1\ - b ` & .
7&C `FY @ ;
@ j n^ `  .
(7 @ C `FY @ ;
1 -  `  .
(71 g `AY @ ;

1\ -  - x )' v71 @ V ?B= ;
/0 % - x ')
1\)z9b - x &)& g - 64w)
@ - 4 j x )& y% ` .n
 I X 9b& - g - 4)'
' y: x &)&   ` n&
% I X 9' - g - 64w)&
` %)' % x &)& v7 XcZA,YZ ;
CQn^ x &)& {N8w %{7 , < ViV $;
a % < % x ') ? b&w .971 g C/ ` ;
Y /s1 = ,  a  ` %n
 Y w[ jl- '
Y /s1 = ,  <  ` .n^
 Y w[ jk- 
Y /s1 = ,  @ - 4 j 1 -  -
 % ` %n&
%

Y /s1 = ,  &b 1 -  -
( % ` .n


Y /s1 = ,  @ - 4 j K )&z
% ` .n^

Y /s1 = ,  &b  K )z
 ` %n

Y /s1 = ,  a  Y 6w <  - 9
Y /s1 = ,  a /5ww <  - 9
Y /s1 = ,  Y 9 ` .n
 @ j n - )'
Y /s1 = ,  Y 9 , 
- ) ` %n
% @ j b

125

A.Broggi

126
~%~
%~ ~
%~ ~
%~ ~
%~ ~

] ?
] K
] `
] V
] x

~

~.

~

~.

~

~.?

~.K

~ 1

~ `

~ V

~.x

]

P

R

e

~

%







?

K

1

`

V ]]
V ] R
V ] e
x ] R
x ] e
x ] ~
]

>P

.R


7 >bP ]z;
7 >bPP ;

7 >Pfe ;

7 >P.~ ;

7 "P ;

7 z;
7>]z;
7 P ;
7 R ;
7 e ;
7 ~ ;
7 ;
7 ;
7;
7 ;
7>z;
7 ]z;
7 wP ;
7 zR ;
7 e ;
7 ~ ;
7 ;
7  ;
7 ;
7 z;
7]z;
7 P ;
7& R ;
7' e ;
7& ~ ]z;

7& ~R ;

7& ~e ;

7 R ;

7 e ;

7 :~ ;

7 ;
7^;
7 ;


Y / 1 = ,  Y 9 g - 64w)& @ j b
/ 1 = , 1 -  < -  @ 1\w
Ys


Y /$1 = ,  a % .&
Y / 1 = , @  f9
Y / 1 = ,  a % , &
- ) ` n
Y / 1 = ,  <  , 
- ) ` 'n
` )&
- b - x &)& g - 64w) 7 ` X N0;
x 
% g - 4w) ` )
- '7 x / @ 1 `FX N3;
a 1\ .w `  %

? ))
-  Cl j 
x  . ? ))'z
-  .4Cl j b
CQ4'[Cl j  ? )&)&z
- '7 < V =qK , /$15$;
,  - 4 V .
%w - N_ -j 7 V G V 1h;
= % j & -  - N_z
.99y7 V G Y = ;
a  @ b1oz4 y - < z
 f9b97 ? Y = ;
x 4 x 9C - S
& x ') v7 x YZA` x Y @c<w= ;

x '64 Z C - S
& x ') 7 x YZA` Z3V Gc= ;

@ .9b .n^ f4
@ .9b .n^ f4
@ .9b .n^ f4
@ .9b .n^ f4
a E V @ Y x\ < 
@ .9b .n^ f4
@ % -j - x )'
a % < % - x &)& p}9 `5-  - 4 =  j
a  V ^ %64w .4 V b Y w> jl- &
1\ -  X   x &)&
1\ -  Z .! x ')
, z
 X )&z
 x &)& ?
%
 %99
@ .9 %n .4
a %C -
 Z3->j

< %N8'b . < 
a %Nbw % < 
a % @ .4&b f
' ,  9 V w
@ .4w& .
 ` %n^

1 - 
% %) @ f4w& .

@ .9b .n^ f4
@ .9b .n^ f4
a N < N ? 44b .99

La CPU Intel 8086: Architettura e Programmazione Assembly

127

APPENDICE E:
Funzioni BIOS

Y[Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z
[Y Z

]%]

] P
] R
] e
] ~
]
]
]%
P ]
P%P
PSR
Pe
P~
P
P
P
P
P
P?
PK
P 1
~.?
]


























7]z;
7P ;
7R ;
7e ;
7~ ;
7 ;
7 ;
7z;
7 Pf ;
7 P ;
7 Pf ;
7 P z;
7 R ]z;
7 RP ;
7 RR ;
7 Re ;
7 R>~ ;
7R ;
7 R ;
7 R ;
7 R ;
7 ~ ;
7 PP*R ;

` & n4w ]
< &) <  .
Z  C - 9b - )& Y b .w7 Z C Y ;
K b - &w
/0n b)&!
N' <
 . %
< 9 j =  j %
5 .^ - 4
E3 4w % - 64 <
 % % < .n^
 %9
@ - 4 Vo  j % ,  9
@ %bCl j  < 'u.
`  9b Y / < n
 .9 IJx )& - 64 g - 4
< % - ) Y / < .n^
 .9713 jj LNbS9;
1 - 9b9  - 4 V ^ %64w .4 < %n
 .9
# % - 4 Y / < %n
 .9
N_&w % Y / < .n^
.9
K|?F< Y 1 ,  - 4w . < .bn

K 9b -  ,  - 4w % < %n
%
< 9 j =  j . - 41\)&z
 < n&
 f9
h %^ - 4 K b -
X 9 . =  j % = 

X 9b . ? ) -  j
@ - ) =  j {1M)&z


` &9bw9

A.Broggi

128

APPENDICE F:
Pseudo-Istruzioni
del MACRO ASSEMBLER

tt

 P%
 R"

 R" 
 R"
 ] 
 ]
? Zc`
?5<< X C V
?3=
K\F= V
K\F= V
1/FCC V0Z =
1/FCC/ Z
1 @ V x
` K
`5`
`#W

, '  . - ) 1 -  -
 ./0 % - >

, z
- &1\w %/0 % - 4
V wb .99'/0 % - 
< 9'w /0 % - b
Cl)')&
- &
? 44w&&  X  - N_)&9
< w -
&% X  - bCl69
< 
 x & %) 4 ZA-j {/3 . - 
` n^ 9
< % j .w /An %4w /0 % - b
C -
%1\ jkj %w
, &b . - ) = /3 % - 
Y 64w /0 % - >
1\ -  ? 9b)w < j )
V  - )& ] P. Y 69
(9
V  - )' @ - )mCQ4 ] R Y 9
b9
V  - ) N f
( .4Clz4w ] R Y 9bb
(&69
V  - )& ] R> Y 69
(9
V  - )& ]  Y 9bb6
'9
V  - )& ] Y 9bb6
'9
K !# 9b , 
- ) ? ZA`
? 99bz
% -  < % j %w!&
< % j %w @ %9 %

` [ ? 9b)&w < % j w
? )' < % j .w% ?  K z ? 44w .99
`5-  - =  > P ^
V w %Cl)& ,  {1\ jkj %
` %[& /0n %) - 6& < . j %wS9
V  - )& {1Mbz99 @ %[ % .
 ,  9'z9
` [ K ^
`  ` ) %!#4
` [ W  - 4!#4

La CPU Intel 8086: Architettura e Programmazione Assembly


` =
`3
`3 / @ `
` X N
5
V_, < V
V_ZA`
V_ZA`FY x
V_ZA` C
V_ZA` N
V_ZA` <
V\W
V\WFX
 V @B@
 V @B@ P
 V @B@BR
 V @B@qK
 V @B@ `FV x
 V @B@ `AY x
 V @B@ V
 V @B@ Y` Z
 V @B@ Z K
 V @B@ ZA`FV x
 V @B@ Z U
V E ViZ
V G Y= C
V GF=q@ Z
x2?A@
ahV
a @ / X N
a =
g Ya g
Yx
Y x3P
Y xR
Y x|K
Y x `FV x
Y x `AY x
Yx V
Y x Y`FZ
Yx Z K
Y x ZA`FV x
Y[Z 1 ,oXA`FV
Y@ N
Y @ N31

`  & = .  X &


` %[ 4
`5-  - =  y ~ z .9
` )&
-  /5

% %6
 .9
? 99 j )' Y 1\4w'& Z Cl 
= % j & -  Clz4w)
= % j  -  {1\4'& - ) K )z

= . j ' -  C -
% @ % -  K )&
%
= % j  -  Nz
 %4b ` [&&&
V 4 < . j %w% < 6
b ` [&&&
V_  - ) @ %) - b - )/3 % - 
1\ -  < j )
x >
% V b
x 
 V b4>vN - 99 P
x 
 V b4>vN - 99 R
V > Y < ' Y 9 K ) - 6
V  Y Z3-j Y 9 ` & .4
V b Y < '9 ` & %
V  Y x - ) 9b
V b Y < bz9 ?  Y 4w .w&
- )
V b Y < b Y 9 Z  K ) - 
V b Y Z0-j Y 9 Z  ` '6 %4
V b Y = 
? )' S4 K 4 - 
Yjkj %4 -  C -
% V &
` [ V ^ % - )
`5-  - =  y ,-  %)Q ` & % .w < % j . w
a  -  % = -  V_  - ) @ %) - & - )/3 % - 

` [ < . j .w a 
a  -   = -  @ %) -  - )/0 % - b

@ % g  /F4w % K &9

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

? 99 j )& Y N - 99 P
? 99 j )& Y N - 99 R
? 9b9b j )& Y ?  j % Y 9 K ) - 
? 99 j ) Y Z3->j Y 9 ` [ f4
? 99 j )& Y ?  j %9 ` & %
? 99 j ) Y x - ) 9b
? 99b j )& Y ? b j %wS9 ?  Y 4w %&
- )
? 99b j 6)' Y ? b j .w Y 9 Z  K ) - 
? 99b j )& Y Z3-j Y 9 Z > ` [& f4
N_bz
 .991\z4w  j V  . - ) x &)&
? 99 j )' /06
 y Vo-

N -  -j  %

? 99 j ) /0
%  V_-

1 -  -
 %



129

A.Broggi

130
? K Vi,
, A
 , ? ,_,
,V
,V0ZFa =qg
 , x 1#/ ZA`
 ,8Y <w=
, /s1 ? ,
, /
, =
C ? 1 @ /
C ?F<
C V C/ @#
CD/ `
Z ? C V
Z3V
Z3V ?c@
Z / =
/ x|x< V =
/ @
/ @ a
/ X =
N ? a$V
N ? a$V
N ?A@B?
N @ /s1
N =q@
N X K ,_Y 1
N X K ,_Y 1
N X @ a$V
W3 / @ `
 @#? `AY G
@ V 1#/ @ `
@ V N =
 <? ,o,
< V0a
< V0a C ViZ =
 <x 1q/ Zc`
<>g ,
<>g / @B=
<>gA@
< YbU2V
<>=#? 1h
<>=#@ X 1
< X Kh=#= ,

1\ -  yE -  - )  ,6-  )


,  9b ? ))mC -
 V w - 9'9
, .99 = - % V_  - ) @ %) - b - )/0 % - 

@  , %
 Y  j

, 9 x - ) 9b {1\64w&b - ) 9
@ .9b < >6
 134 , &9b&
1\ -  < j )l> X 9 C -

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

Y ' -  C -
b ` ''&
@  - K 'C - 9b
, z
-  9 % j %w - 9) - 99 % j %wz99)
Clz4w)&9
? 99 Z3-j :vCQ4)
Z  Vo  - ) @ ) - & - )/06  - 
`5-  - = ^ y> ,-  %)Q < -j < % j %w
K &!#&9 Z / =
/39b  V  .9b9&
K '!q&9 , 
- )/ @
? 99b& , z
- &1\w 
` &9) - = 4>& ? 99b j )
? )'% R > z K 4 - b
N -  1\wb)l , 9&z9
? )&& P"  K 4 - 
Y & -  N_bz
 f4w ` &
1 -  =  E -  - )&

1M
-  % -  ? )') , & ZA-j .4 < % j %9
C - < j ) ? n - ') - )& : ? )&)mCQz4w)& .9
` %)  {C -
b ` &&&
`5-  - = ^ y> ^ f9
<  Y w @ - 4'
` ' @ .
4 = 
Y 6 -  @ % -  K )&z

< 6b .99 ? )&)mC -
%b V  - 69b& , 9z9
@ % < % j wE - )
Y &b -  < % j %w ` %['&
<  f99 , 9bb( x - )9b {1\4'& - ) 9
<  , [

< %9 ,6-  .) =  <>g / @B= = 
< '[ @  


@  K ^ .9 X 9b f4E - b - )
` [ - <  -
 < . j .w
` %[ < 
b6b = 
<  f
'[ , 9' < w)&

La CPU Intel 8086: Architettura e Programmazione Assembly


=K3F= V
 =hx 1#/ ZA`
=g Y <
= Y = ,_V
=M N V
 =3 N V
Y` =hg
/ @ `
/ @ `
 GB? ,o,
G 1 @ V x
 G ,oY <w=
G / @

`5-  - = ^ y> P ]^ f9


= )& x - ) 9b {1\64w&b - ) ,  9
1\ -  /0 % - 4 - 1\6b %w , 
- 
<  .
'[ , &9& = ')&
@  < u  = 
@ %Cmz4w - 64 <
% y -  V w %99b
@   4
 K 'S9

? )&% R b 64 - 
`5-  - =  y R z .9
, 9C -
 V  - 9&9 = - N_z4w
% {1\z4w

<  .9b91\z99 @  %b %
% , &9b&z9
<  .99 < 
 154 , 9
K !# 9b , 
- ) G / @

131

A.Broggi

132

APPENDICE G:
Tracce per la Risoluzione
di Alcune Prove Scritte

In questa Appendice sono riportati alcuni segmenti di codice relativi a problemi assegnati come prove scritte per lesame di Calcolatori Elettronici.
Tali risoluzioni sono da considerare solo a titolo di esempio, in
quanto nella maggioranza dei casi lenfasi stata posta sulla modularit e quindi chiarezza del codice, piuttosto che sullottimizzazione
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
` < V3a
, /s1 ? UY / ZcV
` < V3a

<>=#? 1h C

< V0a C ViZ =


`3
V_ZA` <

N_bn -

N ?A@B?

<
% -

4> .)

N X K ,oY 1

n^ j 

p ` ?B=q? p

<>=#? 1h C

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
` K
<
V_Zc`

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

1 < V3a

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
t

ub -

4

A.Broggi

134

C ? YZ

N @ $
/ 1
N X <wg
CD/cE
N X <wg
1 ? ,o,
1 ? ,o,
CD/cE
CD/cE
1 ? ,o,
CD/cE
1 ? ,o,
CD/cE
CD/cE
1 ? ,o,
1 ? ,o,

C ? YZ
1 ? , 1#/ , ?$r}K Y =
1 Y 1 , /L

1 ? , 1#/ , ?$r}K Y =
Y[ZcYbUY ? ,oYUU ? U2Y / ZAV

CD/cE
1 ? ,o,
@ V =
V_ZA` N

t Y 9bbu%m4 - ) - 9
 - b < V CN @ V
` <
?0GI ]]
t - )Q&6
'v4> %Q> -jkj 

?HG
t
Y[ZcYbU2Y ? ,YbU_U ? UY / ZBV
N @ V < VHZ =q?
U Y/ A
Z V
` gI 
`5, I '
< N3/ <w=q?sr 1 X A
@ < / @ V
t NH9&u.' )Q
9 9 .
%4w
t n - )&Q .9 wQ ` g `5,
?0GI , /$1 ? UY / ZAV
t 1 - &
- )kn - )' {4 - 9 -j  - 
<=q? CN ?sr g V G
t<  -j  - ?iG  jk-  9 - 4w f
>
` gI 
`5, I '
< N3/ <w=q?sr 1 X @A< / @ V
t @ & - 9
.
 .99'n t NH y)k j %v4>Q .9b %
1 ? , 1#/ , ?sr}K Y =
t  ?iG  .)Q %&9b K\G 
?0GILKMG
t 1 - &
- )kn - )&b {4 - 9 -j  - 
<=q? CN ?sr `FV 1
t <  -j  - ?0G  jl- v4> f
 jl- )'
t @ ' - ) <  9 jl- /3 % - &n

N @ /s1
Z0V ?A@
CD/cE
1 GJIlP
G / @
K\GJILKMG
<? ,
? , IQP
@ 1 ,
?3g$IQP
? ` 1
KMGI ]
1 Y1 , /
, / / N
@ V =
V_ZA` N
N @ /s1


@ V =
Y[ZcYbUY ? ,oYUU ? U2Y / ZAV
VoZA` N
N @ V < ViZ =q? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV

x2?A@


@ V =

N @ /$1
V_ZA` N

Z3V ?A@

Z0V ?A@

t 1iw - 
t ? u.u% % - )Q
w -  4>Q'
t @  -v- b - n %9b)D1 - b
t  P '4" ?0G
t< y)m1 - b p P%I 
 j .w -

K\G

La CPU Intel 8086: Architettura e Programmazione Assembly

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


< N3/ <w=#?sr 1 X @c< / @ V
<>=#? CON ?sr g V G
<>=#? CON ?sr g V G
<>=#? CON ?sr `FV 1
<>=#? CON ?sr `FV 1

1 < V3a


@ V =



@ V =



@ V =

N @ /$1

Z3V ?A@

V_ZA` N
N @ /$1

Z3V ?A@

VoZB` N
N @ / 1
V_ZA` N

VoZB` <
C ? YZ
VZA`

ZiV ?A@

135

A.Broggi

136

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
` < 3
V a
` < V3a

<>=#? 1h C

< V0a C ViZ =


V_ZA` <

N_bn N ?A@B?

<
% -

4> .) R ~

N X K ,oY 1

9 b j b

P ]

p ` ?B=q? p

<>=#? 1h C

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
` K
<
V_Zc`

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

1 < V3a

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
t

ub -

4

La CPU Intel 8086: Architettura e Programmazione Assembly

C ? YZ

C ? YZ
<>=#? CON ?sr `FV 1

`5XAV r 1 Y x|@ V 

<>=#? CON ?sr `FV 1


<>=#? CON ?sr 1 gA?A@

N @ $
/ 1
N X <wg
CD/cE
N X <wg
1 ? ,o,
1 ? ,o,
1 ? ,o,
1 ? ,o,
1 ? ,o,
1 ? ,o,
@ V =
V_ZA` N

x2?A@

tY
` <
?0GI ]]
t

?HG
t
Y[ZcYbU2Y ? ,YbU_U ? UY / ZBV
N @ V < VHZ =q? UY / ZAV
,ViaaFY r 1 gA?A@
<=q? CN ?sr 1 gc?A@
<=q? CN ?sr< N ? U2Y /
<=q? CN ?sr `FV 1
t@

N @ / 1
ZiV ?A@
G / @
?3gsI}?Ag
K , I] ?
CD/cE

K ,
Y[`AY E
CD/cE
` GJI?cG
? , I] ?
1MCON

T K
`5XAV r 1 Y x|@ V
G / @
?3gsI}?Ag
K ,
Y[`AY E
CD/cE
`5, I}?Ag
? `F`
? , I p ]p
<=q? CN ?sr 1 c
g ?A@
1 ? ,o,
? , I `F,
CD/cE
? ` `
? , I p ]^p
?

<
q
=
? CN ?sr 1 c
g ?A@
1 ,o,
? , I` g
CD/cE
? `F`
? , I p ]p
<=q? CN ?sr 1 c
g ?A@
1 ? ,o,
@ V =
V_ZA` N
N @ /s1
Z3V ?c@
?HG
N X <wg
?3gsI ] V
CD/cE

K , I]
CD/cE
P ]
Y[Z =

?0G
No/FN
@ V =

t`

t`
t?

t?
t@

137

9bbu%m4 - ) - 9
 - b < V CN @ V
- )Q&6
'v4> %Q> -k
j j 

t ,   >
-  -  . y ) y
t<  ->j  - )l
w %v4 ? ,
t<  ->j  - 9 - u%
t <  -j  - ? , 4> .
% jl- )
' - ) <  9 jl- /3 % - &n

? ,

t ? u%u % - )k % 9 ?0g


t <  - )l4'n 4w 47 P ] ` .
 jl- )' *;
n^ 9b&  -  %
t< - )&n - &9)& - Q ` G  %4
t 13m9 - 
) y
 .w' -  -z

t < y
m9 I 9 - )' -- n - w
t ? u%u % - )k % 9 ?0g
n^ 9b&  -  %
t < - )n - )l9b)& -  `5,  %4>
44'u.' - ) - 9 4 Q j % ?3< 1 YY
t<  ->j  - ) y
 .w& -  - 9 y f
.99 - '
t ` f
&
t ? 44w&u% - ) - 9 {4> Q j % ?3< 1 YY
t<  ->j  - ) y4> f
&
t X & - p
44'u.' - ) - 9 4 Q j % ?3< 1 YY
t<  ->j  - )  - p
' - )) - bz
 .4w -
 -jk- w


t< - )n - ?0G


t< . n^u K Y / <
t N - & -v- b&n -

' 1

t @  9& - 0
? G
t @ ' - )) - 
 bz
 .4w -

- %p

 -jk- w


A.Broggi

138
<>=#? CON ?sr 1 gA?A@
,V3a$a Y r 1 gA?c@

,V3a$a Y r 1 gA?c@
<>=#? CON ?sr< N ? UY /

<>=#? CON ?sr< N ? UY /


Y[ZcYbUY ? ,oYUU ? U2Y / ZAV
Y[ZcYbUY ? ,oYUU ? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV

1 < V3a

VoZA` N
? @
N @ / 1
Z0V A
?3gsI ]^
C /cE
D

R"P
Y[Z =

@ V =
V_Zc` N
N @ /s1
Z V ?c@
3
<
w
g
H
?
G
N X
? , I 
CD/cE
p p
<=q? CN ?sr 1 gc?A@
1 ? ,o,
?0G
No/FN
@ V =
VoZA` N



N @ /s1

Z3V ?A@

@ V =
VoZA` N


@ V =

N @ /$1
V_ZA` N

V ZB` <
o
C ? YZ
VZA`

Z0V ?A@

t < %n^u%& ` / < p @ - 45 . - 41 - 



t ' w V
p


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


t< - )n - ?0G


t 1 - 
-  ? ,  )l
b4&
% 4pp
t<  ->j  - ? ,
t @ 9& - 0
? G

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
` < 3
V a
` < V3a

<>=#? 1h C

< V0a C ViZ =


V_ZA` <

N_bn N ?A@B?

<
% -

4> .) R%R

N X K ,oY 1



P ]

p ` ?B=q? p

<>=#? 1h C

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
` K
<
V_Zc`

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

1 < V3a

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
t

ub -

4

A.Broggi

140

C ? YZ

C ? YZ
<>=#? CON ?sr K YZ
1 Y 1 , / rK YZ ?B@ Y /J

<>=#? CON ?sr K YZ


Y[ZcYbUY ? ,oYUU ? U2Y / ZAV
Y[ZcYbUY ? o
, YUU ? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV
,V3a$a Y r ZAX C V @ /
,V3a$a Y r ZAX C V @ /

N @ $
/ 1
N X <wg
CD/cE
N X <wg
1 ? ,o,
1 ? ,o,
1 ? ,o,
1 ? ,o,
C XA,
1 ? ,o,
@ V =
V_ZA` N

x2?A@

` <
?0GI ]]

?HG
Y[ZcYbU2Y ? ,YbU_U
N @ V < VHZ =q?
,ViaaFY r ZAX C
<=q? CN ?sr K
? ,
<=q? CN ?sr K

t Y b9 bu%m4 - ) - 9
 - b < V CN @ V
t - )Q&6
'v4> %Q> -jkj 
t
?
U Y / ZBV
U Y / ZAV

t Y )Q j %) (n -  ? ,


V @ /
t <  -j  - )k
b .w4 ? ,
Y Z
t 1 - )&
%) - )  - 4 - 
t <  -j  - )k
b .w4 ? ,
Y Z
t @ ' - ) <  9 jl- /3 % - &n

N @ / 1
Z0V ?A@
t 1i - b 4 Q&9
CD/cE
1 GJI ]

G / @
?3gI?Ag
t ? u%u . - )k . 9 ?0g
<"g ,
? , I] P
t < ' , 
 - < '9bb 

? ` 1
?3gI?Ag
t Y  ?0g 9Q )Q1 ?A@B@q
<=q? CN ?sr 1 Y x|@B?
t <  ->j  - ) -
'[ - > -  -  0
? g
1 ? ,o,
? @ Y/
t Y  . - & -
{1 G$ ]
1 Y 1 , / rK YZ B
, / / N

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

V_Zc` N



N @ /s1

Z3V ?A@

@ V =
VoZA` N



@ V =


@ V =

N @ /$1

Z0V ?A@

V_ZA` N
N @ /s1
VoZA` N

Z3V ?c@

La CPU Intel 8086: Architettura e Programmazione Assembly

<>=#? CON ?sr 1 Y x@B?


<>=#? CON ?sr 1 Y x@B?
1 < V3a



@ V =

N @ /s1
VoZA` N

V ZB` <
o
C ? YZ
VZA`

Z3V ?c@

141

A.Broggi

142

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
` < 3
V a
V_Z = V @
C ?cGr ,\XcZFa g
< V3W XcViZ U ? r P
< V3W XcViZ U ? rR
,XAZFa gsr N @ Y C ?$r <w=q@
` < V3a

<>=#? 1h C
<>=#? 1h C

1 < V3a

N_bn -

<
% -

4> .) e

&6

P  P

< 0
? =q? p
V a C ViZ = N ?A@B? N X K o
, Y 1 p` B
P e
VMWAX
]
V\W X
? Gr ,_XAZAa g h
t <  %u - 4"mC c
? Gr ,_XAZAa g
C B
` K
` X Nq7 ;
e
t < % u - 4> e  j % b
` K
` X NB7 ;
5
t ,  %u.u - b jl- 9b  `3


V_ZA` <

` K

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
V_Zc` <

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

ub -

 j %b

4

La CPU Intel 8086: Architettura e Programmazione Assembly


t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
C ? YZ

C ? YZ
,V =#= X @q?srP
1 Y 1 , /L

x YZAV r ,_V =#= X @q? 


,V =#= X @q?srP
,V =#= X @q?sr R

,V =#= X @q?sr R

N @ $
/ 1
N X <wg
CD/cE
N X <wg
1 ? ,o,
1 ? ,o,
1 ? ,o,
1 ? ,o,
1 ? ,o,
1 ? o
, ,
@ V =
V_ZA` N

143

x2?A@

t Y 9bbu%m4 - ) - 9
 - b < V CN @ V
` <
?0GI ]]
t - )Q&6
'v4> %Q> -jkj 

?HG
t
Y[ZcYbU2Y ? ,YbU_U ? UY / ZBV
N @ V < VHZ =q? UY / ZAV
t , .> ) -  jk- 9['6 ,V =#= X @q?sr P
#
=
=
q
@
s
?

r
R
t , .> ) - 9 .
4 - 9& ,V
X
t 13w[b - ) 4> {9[& 
1/ Z x|@ / Z = /

t )l&9)& - v ?0G
<=q? CN ?sr ZAX C V @ /
t <  -j  - )Q
w b4> ?iG
t @ ' - ) <  9 jl- /3 % - &n

N @ /$1
ZiV ?A@
K GJI ]
\
CD/cE
1 ? ,_,
, V3asa V r 1 gA?c@


t ? u%u.  - ) - )w .u%u 


t , % 
-  - b % 4 -  - 9' . t ) -  ? , 
? , I V_Z = V @
t , 
wb -
 V_Z = V @
1MCON
x YZcV r ,_V =#= X @q?
t 9 y %p VZ = V @ : % j & - ) - )  T*U
< V5WAXAV0ZFU ?sr P K5G IL? , t C j uu - )l
-  -  %
CD/cE
KMG
t Y 6
 j .w - ) - ) %u.u Y[Z 1

KMGJI C ?cGsr ,_XAZFa g
t 10wb - L9 y9Q pJ - &w 1MCON
t ) -j$- )w .uu - I  %' % 1 Y1 , /
T.ZAU

s
g
r
@
s
?
r}<=q@ ILK\G
CD/FE
N YC
,XAZFa
@ V =
VZA` N
N @ /$1
1 ? ,o,
CD/cE
1 ? ,o,
CD/cE
1 ? ,o,
CD/cE
@ V =
VZA` N

ZiV ?A@
,Viaa V r 1 gA?A@
< V5WAXAV0ZFU ?srR >] L
I ?
,Viaa V r 1 gA?A@
< V5WAXAV0ZFU ?srR P L
I ?
,Viaa V r 1 gA?A@
< V5WAXAV0ZFU ?srR R L
I ?

t , . 
, t C j 'u.u
t , . 
, t C j 'u.u
t , . 
, t C j 'u.u

 -  % ) y


- )Q
-  - b %b
 -  % ) y
- )Q
-  - b %b
 -  % ) y
- )Q
-  - b %b

? ,
? ,
? ,

A.Broggi

144

1/ Z x|@ / Z = /

N @ /$1
ZiV ?A@
?0GI ]
CD/cE
CD/cE
1 GJI ,6XcZFa gsr N @
< X K
1 GJIdR
K\GJI / x|x< V = <
CD/cE
1 Y 1 , / r 1q/ Z x@ / Z = / CD/AE
` GJI / @ `
1MCON
` GsIm K0G
T.ZAU
Z / Z r XAasX ? ,Y
CD/cE
` gIm < V3WFXAViZ U
1MCON
` g$Im K0G R
T.ZAU
Z / Z r XAasX ? ,Y
?0G
Y[Z 1
KMG
Z / Z rA
X a$X ? ,_Y 
Y[Z 1
1 Y 1 , / r 1q/ Z x|@ /
, / / N
@ V =
x @ / Z = /
1/ Z |
V_ZA` N
Y[ZcYbUY ? ,oYUU ? U2Y / ZAV
Y[ZcYbUY ? ,oYUU ? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV
<>=#? CON ?sr ZBX C V @ /
<>=#? CON ?sr ZBX C V @ /
,V3a$a$V r 1 gA?B@
,V3a$a$V r 1 gA?B@
1 < V3a



N @ /s1

Z3V ?A@

@ V =
VoZA` N


@ V =



@ V =



@ V =

N @ /$1

Z0V ?A@

V_ZA` N
N @ /$1

Z3V ?A@

V_ZA` N
N @ /$1
V_ZA` N

V ZB` <
o
C ? YZ
VZA`

Z0V ?A@

t Z  j %v4>Q
 %u%
Y C ?sr<w=#@ t Z  j .v4>m
-  -  .m4 -
w
t Z  j %v4m
w[bm4 - b9b .&b
V5W XBV0Z U ?$r P
N =q@ < V3WFXAViZ U ?sr}R
t 1i[w -  j  R  .9
t< - ) - 9 9v> - )'
?sr}R R
t 1iww - ) %u.b
t< - ) - 9 9v> - )'
t Y 
b j %w - )k j .v4>Q
b %u.
t ? n - u - ) - 9
- 9 4> < V5WAXAV0Z U ?$rP
Z = / t 1i - & -
1 GF ]


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 ottengono facendo circolare il dato precedente in un registro di 16 posizioni richiuso su se
stesso.

Traccia per la risoluzione

= Y = ,\V
` < 3
V a
` < V3a

<>=#? 1h C
<>=#? 1h C

1 < V3a

< V0a C ViZ =


V_ZA` <

` K

N_bn N ?A@B?

<
% -

4> .) P ))

N X K ,oY 1

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
V_Zc` <

P  P

p ` ?B=q? p

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

ub -

4

A.Broggi

146

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
C ? YZ

x2?A@
N @ /$1
N X <wg
` <
?0GI ]]
C /cE
D

?HG
N X <wg
1 ? ,o,
Y[ZcYbU2Y ? ,YbU_U
1 ? ,o,
N @ V < VHZ =q?
?
1 ,o,
,ViaaFY r N ?A@
CD/cE
1 GJIlP
1 Y 1 , / r N @ Y Z 1 Y N ? ,_V LN X <wg
1 G
<=q? CN ?sr g
1 ? ,o,
<"? ,
? , I'P
@ 1 ,
?3g$IP

C ? YZ
,V3a$a Y r N ?A@ / , ?

? ` 1
No/FN
, / / N
@ V =
V_ZA` N

t Y b9 bu%m4 - ) - 9
 - b < V CN @ V
t - )Q&6
'v4> %Q> -jkj 
t
? UY / ZBV
UY / ZAV
t , % y) -  - ) - ) -  
/ , ?
t 1iw - 
t < - )'n - 1 G
t<  -j  - )k
 .wv4 ?0G
V G
t < '[ - 94> ? ,

t @  -  - 94> ?0g 7)1 - 
t  %w -  %)Q>& j 9''
? , I ]
t Y )1 - 4> ?3g & %w -  ? ,
t @ '9bb - 1 G
1 G
1 Y 1 , / r N @ YZ 1 Y N ? ,_V
t @ ' - ) <  9 jl- /3 % - &n

? @
N @ $
/ 1
Z3V B
= ?F<w= /
1 ? ,o,
, ViaaFY r#

? G
H
N X <wg
= ?F<w= /
1 ? ,o,
,i
V aaFY r#
KMG
No/FN
CD/cE
1 , IJ~
<"g ,
K , I 1 ,
/ @
N X <wg
1 ? ,o,
N X <wg
1 ? ,o,
No/FN
CD/cE
<"g ,

K , IL? ,
KoG
,ViaaFY r =#?F<w= /
?HG
,ViaaFY r =#?F<w= /
KMG
1 , IJ~
K , I 1 ,

/ @
No/FN
CD/cE

? , ILK ,
KMG
?3gsILK ,

t ,   4 -  - 9b  -  y ? ,


t< - )n - ?0G
t ,  4 -  - 9b  -  y ? ,
t N  K ,  ) - 9 f
 %4 w
t < 9b -  % ~ '8pL9''
t )Q
z4w
 {4" %)Q j  - 9
t N|  K , J4"6
b4&
%
t< - )n y)l j  7 K , ;
t ,  4 -  - 9b  -  y ? ,
t< - )n - ?0G
t ,  4 -  - 9b  -  y ? ,
t N  K , ) - 9 f
 %4 w
t< 9b -  % ~ '8pL9''
t )Q
z4w
 {4" %)Q j  - 9
t N|  ? , 4 {
z4w

t @ 9 - KMG
t N  ?0G  ~
z4w


?0G

La CPU Intel 8086: Architettura e Programmazione Assembly

,V3a$a Y r N ?A@ / , ?
<>=#? CON ?sr g V G

<>=#? CON ?sr g V G


<>=#? CON ?sr g V Gr? ,

<>=#? CON ?sr g V Gr? ,


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

@ V =

147

V_Zc` N

N @ /$1
< g
?HG
N X w
? ,
CD/cE
<=q?
1 ? ,o,
?0G
No/FN
?HG
N X <wg
<=q?
1 ? ,o,
?
<=q?
1 ,o,
?0G
No/FN
@ V =
VoZB` N

Z3V ?A@

t< - )n - ?0G


t N| . -  -  %9 -j  -  ?3g
t<  -j  - ? ,  b9 - 
4 .
 jk- &)
t @ 9& - ?0G
t @ &9 - )n - ?HG
t<  -j  - ? ,
CN ?sr g V Gr ? ,
s
?
r
=
@
t< 6z9 - )l
b9b - )) -  - 9 
%

C N

V Z V
i
t @ 9& - ?0G

IL?0g
CN ?sr g V Gr ? ,

N @ /$1
Z3V ?A@
< g
?HG
t< - )n - ?0G
N X w
t N|b - ' ~ 4 ? ,  e.RP ]
CD/cE
1 , I~
<"gA@
? , I1 ,
t  %4] .k& ~
<=q? CN ?sr ZAX C V @ /
t <  -j  - )l j .bv ? ,
1 ? ,o,
?0G
t @ 9& - ?0G
No/FN
? ZA`
? , I ]]]] PPPP
t C - b % 9)&v>& e.RP ]4 ? ,
<=q? CN ?sr ZAX C V @ /
t <  -j  - )l j .bv ? ,
1 ? ,o,
@ V =
t @ '  - )) - bz
 .4w -
 -jk- w

VoZc` N

N @ $
/ 1
Z3V ?A@
?HG
N X <wg
? `F`
? , I p ]p
? , I p p P
1MCON
1 Y x|@q?sr ` V 1
T 1
? `F`
? , I p ? p p}wp P
?0gI ] V
1 Y x|@B?sr `FV 1A
C/cE

K , I]
CD/cE
P ]
Y[Z =

?0G
No/FN
@ V =
<>=#? CON ?sr ZBX C V @ /
V_ZA` N

t< - )n - ?0G


t ? 44'u.' - ) - 9 4 Q j % ?3< 1 YY
t< p j & 4>m I
t 9 - )& -- 1 Y x|@q?sr `FV 1
t ? )' j % - '69 -  %) ) ( .b
t< %bnu K Y / < p & 1 - %p

t N - & -v- b&n t @  9& - 0
? G
t @ ' - )) - 
 bz
 .4w -

 -jk- w


A.Broggi

148
,V3a$a Y r =#?F<w= /
@ ? 
1 Y 1 , / r\
, V =q= X B

N @ /s1
Z0V ?A@
?3g$I ]^
t < %n&u.' ` / < p @ - 4h % - 41 - 
CD/FE


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



? , I p}]wp
t< p j ' 4>p ]p
1MCON
t - ))& - &)& % y)Q
-  - b .
1 Y 1 , / r ,oV =q= X @B?
T 1
? , I p}wp P
t< pL
b j 6b .9b: - p ]pJ p p
1MCON
x YZcV r ,oV =q= X @B?
t - ))& -  . j & - ) - ) (b T 1
? , Ip? p
t< p p}wpJ p ? p
1MCON
t - ))& - &)& % y)Q
-  - b .
1 Y 1 , / r ,oV =q= X @B?
T 1
? , Ipx p P
t< p js- & 4>p x p
1MCON
t - )') - &)& . )k
-  - b %
1 Y 1 , / r ,oV =q= X @c?
T.Z 1
x YZAV r ,_V =#= X @q? 
< X K
? , I p ]p
t = )' vp ]p
? , IQP ]
t< y p j & y - )& -
1MCON
t  % j & - ) - )  1 Y x|@q?sr ` V 1 Y C ? ,\V
T 1
< X K
? , I p ? p p}wp P
t ? )' j %wQ)>b -  %)Q - 
@ V =
1 Y x|@B?sr `FV 1 Y C ? ,oV 
,V3a$a Y r =#?F<w= /
V_ZA` N
<>=#? CON ?sr VHZ = V @
<>=#? CON ?sr VHZ = V @

N @ /$1



@ V =

Y[ZcYbUY ? ,oYUU ? U2Y / ZAV

V_ZA` N

N @ /s1


@ V =
Y[ZcYbUY ? ,oYUU ? U2Y / ZAV
VoZA` N
N @ V < ViZ =q? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV
1 < V3a



@ V =

Z0V ?A@

Z3V ?A@

N @ /$1
V_ZA` N

V ZB` <
o
C ? YZ
VZA`

Z0V ?A@

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

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


` < 3
V a
P ]]
C ?cGr ZAX C r E ? , / @ Y
V\W X

,XAZFa gsr E ? , / @ V
V\WFX
P e
V_Z = V @
V WAX
M
P ]
,YZAV x V0VH`
V WFX
\
C V <<r YZ < V @ Y C V0Z = /
 9b %b y)k j % p
` K
V Z = V @$I ,Y ZAV x V0i

V ` I pY 6

A.Broggi

150
Y <w=#@ XFUY / ZBY

` K

` K

` K
` K
` K
,YZAV ?$r E X / =#?
E ? , / @ Y
Z3X C r E ? , / @ Y
` < V3a

<>=#? 1h C
<>=#? 1h C

1 < V3a

` K

` K

` K
` K
` K
V_ZA` <

VZ = V @$I ,YZAV x V0Vi` I ,YZAV x V0Vi`


p N| j   P  .9 .&b nn - ) I p
VoZ = V @ I ,6YZcV x V0Vi`
R  %9 -j  -  y) - )'9b - 4 %Q j %  I p
p
VoZ = V @ I ,6YZcV x V0Vi`
e  %9
%' {4 - )Q -jjl- 'p
p
V_Z = V @$I ,YZcV x ViV0` I p p
@ I ,YZAV x ViVi` ;
C ?cGr ZAX C r E ? , / @ Y`5X Nq7bp *>** p I VoZ = V

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
V_Zc` <

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
C ? YZ

N @ /$1
N X <wg
C /cE
D
N X <wg
1 ? ,o,
1 ? ,o,
CD/cE
1 ? ,o,
1 Y 1 , / r N @ Y Z 1 Y N ? ,_V 1 ? ,o,

x2?A@
t Y 9bbu%m4 - ) - 9
 - b < V CN @ V
` <
?0GI ]]
t - )Q&6
'v4> %Q> -jkj 

?HG
t
Y[ZcYbU2Y ? ,YbU_U ? UY / ZBV
N @ V < VHZ =q? UY / ZAV
` GJI / x|x< V = Y <w=#@ X UY / ZcY t<  -j  - ) }9u.'
<=q? CN ?sr<w=#@ YZFa ?
t , . ) - 9
%)& - 4 -  - 9 % ,Viaa Y r}< 1 VH, =#?
t  ) 96) -  ? ,
? , I pP p
t< )k - 9bv> %pQp P p I
1MCON
t - )') - 9 - )' T.ZAU
Z / r YZ < V @ Y C V0Z = /
t Nbz
% .4w - 4"Q9b .b j .w
1 ? ,o,
Y[Z < V @ Y C V0Z = /
t NHb
% .4w - 4>Q%4w& -j %
1 ? ,o,
/ @ `AYZ ? C ViZ = /
CD/cE
` GJI / x|x< V = Y <w=#@ X UY / ZcY t<  -j  - ) }9u.'
<=q? CN ?sr<w=#@ YZFa ?
1 ? ,o,
1 Y 1 , / r N @ YZ 1 Y N ? ,\V
T CON
? , I pR p
t< ) - 9v> pQp R p I
1MCON
Z / r YZ < V @ Y C i
V Z = /

ub -

4

La CPU Intel 8086: Architettura e Programmazione Assembly

X < 1 Y =q? 
C ? YZ
,V3a$a Y r< 1 V0, =q?
Z3X /AE ?$r ,_V =#= X @B? 

,V3a$a Y r< 1 V0, =q?

T.ZAU
1 ? ,o,
CD/cE
1 ? ,o,
T CON
@ V =
V_ZA` N

151

t - )&)& - 9b

X < 1 Y =#?
<=q? CN ?sr ,Y <w=q?
` GJI / x|x< V = Y <w=#@ X
U Y / ZcY t<  -j  - ) }9u.'
<=q? CN ?sr<w=#@ YZFa ?
1 Y 1 , / r N @ YZ 1 Y N ? ,\V t @  - )m

)&vb
%' - )
t @ '
  - ) < & 9b jk- /0 % - 'n

N @ $
/ 1
Z0V ?A@
?0gI ]
t< .n&u% ` / < p @ - 4h .^ - 41 - 
C/cE


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



? , IpP p
t 1ib)) - )k -  >L9 y p
1MCON
@ ?
t
 j  .9b: - p P pJ p e p I - )&)& T 1
Z0X /AE ?sr ,_V =#= X c
? , Ipe p P
t 9
 I - )' j .wQ' 1MCON
@ ?
t -yZiX /FE ?sr ,oV =q= X @c?
T.Z 1
Z3X /cE ?sr ,\V =q= X B
@ V =
V_ZA` N

Y[Z < V @ Y C ViZ = /

N @ /s1

Z V ?A@
0
K , Im ZBX C r E ? , / @ Y
K , I C ?cGr ZcX C r E ? , / @ Y t< y)l j %b4>Qn - )'Q p
x YZcV r YZ < V @ Y C ViZ = / t : b) n -  I b9
 9&
` GJI / x|x< V = C V <<r YZ < V @ Y C ViZ = /
<=q? CN ?sr<w=#@ YZFa ?
? , I ,XAZAa g$r E ? , / @ V
K ,
?iGJI / x|x< V = E ? , / @ Y
K\GJIL?0G
t Nw -- )Q j n - )& yn"
t , % )k9 . ) y ? ,
,ViaaFY r}< V3a Z /
KiG IL? ,
t ,  j j &u.u t Z  j %b4Q
'
1 GJI~
K\G
t ? ' - )kw - >
t ,  > -
'[ -  j %
,ViaaFY r 1 Y x|@B?
KiG IL? ,
t C j &u.u - ) -
&[ t 1iw& - ' -
{1 G$ ]
1 Y 1 , / r YZ < V @ Y C

K\F= V N =q@ ZqX C r E ? , / @ Y t ? & - )l j .4"Qn - )&

,V3a$a Y r< 0
V a$Z /
Z3X /AE$/ r < V3a Z /J

N @ / 1
CD/AE

CD/cE
1MCON
T*U
CD/cE
1 ? ,o,
CD/cE
C XA,
? `F`
CD/cE
1 ? ,o,
CD/cE
CD/cE
1 Y 1 , / r YZ < V @ Y C
Y[Z 1
1 ? ,o,
CD/cE
, / / N
Y[Z 1
x YZAV r YZ < V @ Y C VHZ = /J @ V =
[Y Z < V @ Y C ViZ = /
V_ZA` N

Z3V ?A@
?0gsI ]


t< .n^u

` / <

p @ - 45 .^6 - 41


- 

A.Broggi

152

x YZAV r}< V0a$Z /L

,V3a$a Y r < 0
V a$Z /
x @B?
,V3a$a Y r 1 Y |
Z3X /AE ?$r 1 Y x|@B? 

,V3a$a Y r 1 Y x|@B?
/ @ `AYZ ? C VHZ = /
/ @ `AYZ ? C VHZ = /
<>=#? CON ?sr ,Y <w=q?

Y[Z =
1MCON
T*U
1MCON
T.ZAU
N X <wg
CD/cE
CD/cE
Y[Z =
No/FN
@ V =
VoZA`

R"P

? , Ip p
x YZcV r< V3a Z /
? , Ip p
Z0X /AE$/ r< V0a$Z /
?0G
?3gsI ] R

`5, IL? ,
R"P

?0G


@ V =

t @ 9& -

)Q
w 6w4> ?iG

N @ / 1
C/AE

Y[Z =
1MCON
T 1
1MCON
T.Z 1
N X <wg
CD/cE
CD/cE
Y[Z =
No/FN
@ V =
V_Zc`

t ' w V
p


t 10w)') - 9 y)Q
-  - b % pQp p
t 9 ) %p . j & - 
t 10w)') - 9 )l
-  -   pQp p
t 9 ) p I & 
t < - )n - )l % 9 ?iG
t < %n^u%& ` / < p1 -  -
 %/3w%p

t 1 -  - b . 4 - 9[ -j  - b

Z0V ?A@
?igI ]

R"P

? , I p}]wp
Z X /AE ?sr 1 Y x|@B?
0
? , I p}wp P
Z3X /cE ?sr 1 Y x|@c?
?HG
?3gsI ] R

`5, IL? ,
R"P

?0G

t< % bnu ` / < p @ - 45 % - 41 - 



t ' w V
p


t 1ib)) - )k -  >L9 y p
t
 j  f9b: - p ]^pJ p p I - )&)& t 9
 I - )' j .wQ' t -Z0X /cE ?sr 1 Y x@B?
t< - )n - )k .&9b ?0G
t < %n^u%& ` / < p1 -  -
 %/3w%p

t 1 -  - b . 4 - 9[ -j  - b
t @ 9& -

)Q
w 6w4> ?iG

N @ / 1

Z3V ?A@

V_ZA` N

N @ s
/ 1
Z3V ?A@
CD/cE
` GJI / x|x< V =
< =q? CN ?sr<w=#@

1 ? ,o,
CD/cE
` GJI / x|x< V =
? , Im ZqX C r E ?
CD/cE
K , I ,6XAZca g$r E
CD/cE
K ,
C XA,
K\J
G I ` G
CD/cE

= ?
, YZcV ?sr E X / #

t<  - j  - > YZFa ?
E ? , / @ Y
, / @ Y
? , / @ V

)& -

 - 
-

La CPU Intel 8086: Architettura e Programmazione Assembly

<>=#? CON ?sr ,Y <w=q?

? F
K GJI?0G
M
` `
CD/cE
1 , Im K0G
Ko
= V N =#@ K3G
CD/cE
<=q? CN ?sr<w=#@ Y ZFa
1 ? ,o,
KiG I 1 ,
CD/cE
@ V =
VoZA` N

153

t NH -- )l % j & {4" %)) - 9[ t < - )&n - )l


bw %v4 K0G
I p p t< . - ) - )k % j & > %) ?
t z
 %4 - 4>m9 -j  t @ '9bb - )l
 .wv4> K3G

<>=#? CON ?sr<w=#@ YZFa ?

? @
N @ / 1
Z3V A
?3gsI ]
CD/cE

=
"
R
P
[Y Z

@ V =
<>=#? O
C N ?sr<w=#@ YZFa ?
V_Zc` N
N @ /s1
Z3V ?A@
? GId< Via ` < V3a
0
CD/cE
CD/cE
` <IL?0G
ZqX C r E ? , / @ Y I ]
CD/cE
@ V =
Y[ZcYbUY ? ,oYUU ? 2
U Y / ZAV
VoZA` N

t < %n^u%&

` / <

p NH'

< &p

Y[ZcYbUY ? ,oYUU ? U2Y / ZAV

N @ V < ViZ =q? U2Y / ZAV


N @ V < ViZ =q? U2Y / ZAV

1 < V3a



@ V =

N @ /$1
V_ZA` N

VoZB` <
C ? YZ
VZA`

Z0V ?A@

t Z  j %v4Qn - )&Q9 %'

A.Broggi

154

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 dellinserimento e della stampa il programma deve ripetere le operazioni previste


al punto 2.

Traccia per la risoluzione

= Y = ,\V

N_bn -

< V0a C ViZ = N A


? @B?
` < 3
V a
P ]]
C ?cGr ZAX C r N ?c@ / ,_V
V\W X
SP R
C ?cGr ,\XcZFa gsr N ?B@ / , ?
VoW X
P ]
,XAZFa gsr N ?A@ / , ?
V\WFX
P e
V_Z = V @
V WAX
M
P ]
,YZAV x V0VH`
V WFX
\

<
% -

4> .) P

N X K ,oY 1

9 b j b

? =q? p
p` B
t ` n 99b 

P  P

j '6b 4" R

La CPU Intel 8086: Architettura e Programmazione Assembly


C V <<r YZ < V @ Y C V0Z = /
` K
< =#@ XFUY / ZBY
Yw
` K
` K
` K
` K
` K
` K
,YZAV ?$r E X / =#?
` K
N ?A@ / ,\V
` K
,XAZFa g V0UU8V
? @ / ,oV
Z3X C r N A
` < V3a

<>=#? 1h C
<>=#? 1h C

1 < V3a

` K
` K
V_ZA` <

` K

155

VZ = V @$I ,YZAV x V0Vi` I p Y 69b %b y) -  - b) -  p


V Z = V @$I ,YZAV x V0Vi` I ,YZAV x V0Vi`

p N| j   P  .9 .&b  -  - ) - I p
VoZ = V @ I ,6YZcV x V0Vi`
R  %9 -j  -  y) - )'9b - 4 %)&)&  - )& I p
p
VoZ = V @ I ,6YZcV x V0Vi`
e  %9
%' {4 - )Q -jjl- 'p
p
V_Z = V @$I ,YZcV x ViV0` I p p
C ?cG$r ZAX C r N ?A@ / ,oV`5X Nq7 ,XAZFa g$r N ?A@ / , ?
VZ = V @ I ,YZAV x V0V0` ;
C ?qGr ZAX C r N ?A@ / ,oV`5X Nq7p p ;

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
V_Zc` <

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
C ? YZ

N @ $
/ 1
N X <wg
CD/cE
N X <wg
1 ? ,o,
1 ? ,o,
1 Y 1 , / r N @ Y Z 1 Y N ? ,_V 1 ? ,o,
1 CON
M
T.ZAU
1 ? ,o,
1 ? ,o,
CD/cE
1 ? ,o,
T CON

x2?A@

`5X Nq7bpQp ; I

t Y 9bbu%m4 - ) - 9
 - b < V CN @ V
` <
?0GI ]]
t - )Q&6
'v4> %Q> -jkj 

?HG
t
Y[ZcYbU2Y ? ,YbU_U ? UY / ZBV
N @ V < VHZ =q?
U Y/ A
Z V
= ?
t , . ) - 9
%)& - 4 -  - 9 % ,Viaa Y r}< 1 H
V , #
t  ) 96) -  ? ,
? , I pP p
t< )k - 9bv> %pQp P p I
t - )') - 9 - )' Z / r YZ < V @ Y C V0Z = /
t Nbz
% .4w - 4"Q9b .b j .w
Y[Z < V @ Y C V0Z = /
t NHb
% .4w - 4>Q%4w& -j %
/ @ `AYZ ? C ViZ = /
` GJI / x|x< V = Y <w=#@ X UY / ZcY t<  -j  - ) }9u.'
<=q? CN ?sr<w=#@ YZFa ?
1 Y 1 , / r N @ YZ 1 Y N ? ,\V

ub -

4

A.Broggi

156
Z / r YZ < V @ Y C ViZ = /

X < 1 Y =q? 
C ? YZ
,V3a$a Y r< 1 V0, =q?
Z3X /AE ?$r ,_V =#= X @B? 

,V3a$a Y r< 1 V0, =q?

? , I pR p
1MCON
t
T.ZAU
X < 1 Y =#?
<=q? CN ?sr ,Y <w=q?
1 ? ,o,
CD/cE
` GJI / x|x< V = Y <w=#@
<=q? CN ?sr<w=#@ YZFa ?
1 ? ,o,
1 Y 1 , / r N @ YZ 1 Y N ? ,\V
T CON
@ V =
t@
V_ZA` N

t< ) - 9v> pQp R p I


- &) )& - 9b

X UY / ZcY t<  -j  -

) }9u.'

t @  - )m

)&vb
%' - )
' - ) < &9b jk- /0 % - 'n

N @ $
/ 1
Z0V ?A@
?0gI ]
t< .n&u% ` / < p @ - 4h .^ - 41 - 
C/cE


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



? , IpP p
t 1ib)) - )k -  >L9 y p
1MCON
@ ?
t
 j  .9b: - p P pJ p e p I - )&)& T 1
Z0X /AE ?sr ,_V =#= X c
? , Ipe p P
t 9
 I - )' j .wQ' 1MCON
@ ?
t -yZiX /FE ?sr ,oV =q= X @c?
T.Z 1
Z3X /cE ?sr ,\V =q= X B
@ V =
V_ZA` N

Y[Z < V @ Y C ViZ = /

N @ /s1
Z0V ?A@
K , Im ZBX C r N ?c@ / ,_V
CD/cE
K , I C ?cGr ZcX C r N ?A@ / ,oV t< y)l j %b4>Q - ) y %p
1MCON
x YZcV r YZ < V @ Y C ViZ = / t : b) n -  I b9
 9&
T*U
CD/cE
` GJI / x|x< V = C V <<r YZ < V @ Y C ViZ = /
<=q? CN ?sr<w=#@ YZFa ?
1 ? ,o,
? , I C ?cGr ,_XAZFa gsr N ?A@ / , ?
CD/cE
K ,
C XA,
? `F`
?iGJI / x|x< V = N ?A@ / ,_V
K\GJIL?0G
t Nw -- )) - b jk-  - >) - n" CD/cE
t , % y -  - ) 1 ? ,o,
,ViaaFY r N ?A@ / , ?
K , I ZAX C r N ?A@ / ,_V t N  K , )l j 4"Q - )
CD/cE
G / @
KMgILK|g
t ? u.u% % - ?3g j j 'u.u - ) - )w u.u 
/ x|x< V = ,XBZFa g V5UU2V KMG I `5, t 4> )) -  - ) - 9b %b& CD/cE
K\F= V N =q@ ZqX C r N ?B@ / ,_V t ? & - )l j .4"Q - )
Y[Z 1
x YZAV r YZ < V @ Y C VHZ = /J @ V =
[Y Z < V @ Y C ViZ = /
V_ZA` N
,V3a$a Y r N ?A@ / , ?
Z3X /AE ?$r ,_V =#= 

N @ /$1

Z3V ?B@
g r N ?A@ / , ? t Y u% - )&&u%u - )Q
 - 
-  -   %b
CD/cE
1 GJI ,_XAZFa s
?0gI ]
t < .bn&u% ` / < p @ - 45 .^ - 
C/cE
4 1 - 


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




La CPU Intel 8086: Architettura e Programmazione Assembly

x YZAV r ,_V =#= X @q? 


,V3a$a Y r N ?A@ / , ?
/ @ `AYZ ? C VHZ = /

1 Y 1 , / r/

Z / r< 1 ? C

x Y ZAV r / @
/ @ `AYZ ?
< 1 ? C K Y/

? , I V_Z = V @
1MCON
x YZcV r ,_V =#= X @q?
T*U
? , I pQp
1MCON
T 1
Z0X /AE ?sr ,_V =#=
?HG
N X <wg
?3gsI ] R
CD/cE

CD/cE
`5, IL? ,
R"P
Y[Z =

?0G
No/FN
KiG IL? ,
CD/cE
KMG
Y[Z 1
, / / N
Z3X /cE ?$r ,_V =#=
CD/FE
` GJI ,XAZFa gsr N
< X K
` GJI 1 G
@ V =
V_Zc` N

157

t < y)k - 9bv pJ w % I


t  . j & - ) - )  t 10w)') - )k -  L9  %p
t n - )&4w I )' .  - )'b - 9
t< - )n - )k .&9b ?0G
t < %n^u%& ` / < p1 -  -
 %/3w%p

t 1 -  - b . 4 - 9[ -j  - b
t @ 9& - )Q
w 6w4> i
? G
t C j &u.u - ) - 9
t ? & - )kw - 
t @ %&b . - & -
{1 G$ ]

?A@ / , ? t 1 - )
) -  ` G ) - )w
  .u%u 
t  - ) - 9b %b& -

4 %)&) -

N @ / 1
Z3V ?A@
? , Im ZqX C r N ?c@ / ,_V
? ,
t ` f
b j .w - ? ,
x YZcV r / @ `AYZ ? C VHZ = / t < ? , b - P%I  . j & - ) - z
 %4 1 , I C ?cGr ,\XBZFa gsr N ?c@ / , ?
1 ,
< Y I / x|x< V = N ?A@ / ,\V t < Y w -- )')p&'u.& -  -  - )'
t 1i - 4 )Qw - 
`3Y Id< Y
t `cY w -v- ))p&u%)' jk-  - ) `3Y IL?0G
K\GJILKMG
t 13> -  y - )&
@ `FYZ ? C
t 10w - )  - )& w - b {4 - < Y
1 ? ,o,
1H/ Z x|@ / Z = /
t `3Y  < yn - v9
-j  -  y&b t 9 %b - 4)) - 1 - b
t < > I 9 - ) -  - )9
-j 6'
T.Z 1
Z / r< 1 ? C K Y /
< 1 ? C K Y/
t N|z
% %4w - 4>m9
-j 'v - b)
1 ? ,o,
K Y /
KMG
t Y 
 j %w -
w - b  - )
Y[Z 1
? `F`
< Y I C ?cGsr ,oXAZFa gsr N ?A@ / , ?
< Y I `3Y
t< )k
bw[w p: % j  - 
1MCON
t '6 Q) - z
.4 1 Y 1 , / r / @ `AYZ ? C
T.ZAU
`AYZ ? C ViZ = /J @ V =
C VHZ = /
V_ZA` N
CD/cE
`5V 1
T*U
CD/cE
C XA,
CD/cE
CD/cE
? `F`
G / @

N @ /s1
Z3V ?c@
< g
< Y
N X w
N X <wg
`3Y

A.Broggi

158
1 Y 1 , / r}< 1 ? C K Y /L

? , ILKo = V N =#@ < Y t ,  )kz99 j v


-  - b %b
C/cE
? , I V_Z = V @
t < - )l:  j & {4> )) -  - ) 1 CON
M
< 1 ? C K Y / r ,_XAZAa g
t : % j  - )9
-j &
T*U
?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
CD/cE
t Y 6
 j % - )kw -  `3Y
Y[Z 1
`3Y
< Y
t Y 6
 j .w - )k -  < Y
Y[Z 1
t @  Q . - )'b
-  -  %b
1 Y 1 , / r< 1 ? C K Y /
T CON
< 1 ? C K Y / r ,_XAZFa g 
? , Im / x|x< V = ,6XAZFa g V5U8U2V KMG t NHb jQ- ) %u.u%u C/cE

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

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

1/ Z x|@ / Z = /
<>=#? CON ?sr ,Y <w=q?

CD/cE
N X <wg
CD/cE
G / @
1MCON
No/FN
@ V =

N @ /$1
ZiV ?A@
? , Im / x|x< V =
, XcZFa g V5UU2V KMG t Nb jl- )  . u%u%u 
KoG
K , Im ZBX C r N ?c@ / ,_V
KMgILK|g
? , Im / xHx< V = ,A
X ZFa g 0
V UU8V P K5G t < .
4 - )  . u%u 
KMG
V_ZA` N

N @ s
/ 1
Z3V ?A@
CD/cE
` GJI / x|x< V = ,YZcV ?sr E X / =#?
< =q? CN ?sr<w=#@ YZFa ?

t<  -j  - > - )& -  - 
1 ? ,o,
CD/cE
` GJI / x|x< V = N ?A@ / ,oV
? , Im ZqX C r N ?c@ / ,_V
CD/cE
K , I C ?cGsr ,_XAZFa gsr N ?A@ / , ?
CD/cE
K ,
C XA,
K\J
G I ` G
CD/cE
? `F`
KMGJ
I ?0G
t NH -- )l % j & {4" %)) - 9[ I K0G
t < - )&n - )l
bw %v4 K0G
CD/cE
1 , m

La CPU Intel 8086: Architettura e Programmazione Assembly

<>=#? CON ?sr ,Y <w=q?

159

Ko = V N =#@ K3G I p p t< . - ) - )k % j & > %) CD/cE


< =q? CN ?sr <w=#@ Y ZFa ?

t z
 %4 - 4>m9 -j  1 ? ,o,
KiG I 1 ,
t @ ' 9bb - )l
 .wv4> K3G
CD/cE
@ V =
VoZA` N

<>=#? CON ?sr<w=#@ YZFa ?

? @
N @ / 1
Z3V A
?3gsI ]
CD/cE

R"P
[Y Z =

@ V =
<>=#? O
C N ?sr<w=#@ YZFa ?
V_Zc` N
N @ /s1
Z3V ?A@
? GId< Via ` < V3a
0
CD/cE
CD/cE
` <IL?0G
ZqX C r N ?B@ / o
CD/cE
, V I ]
@ V =
Y[ZcYbUY ? ,oYUU ? 2
U Y / ZAV
VoZA` N

t < %n^u%&

` / <

p NH'

< &p

Y[ZcYbUY ? ,oYUU ? U2Y / ZAV

N @ V < ViZ =q? U2Y / ZAV

N @ V < ViZ =q? U2Y / ZAV

1 < V3a

t Z  j %v4l - )& 9b %'

? @
N @ /$1
Z0V A
x < V = Y <w=#@ X UY / ZcY t<  -j  CD/cE
` GJI / x|
<=q? CN ?sr <w=#@ YZFa ?
1 ? ,o,
@ V =
V_ZA` N

V ZB` <
o
C ? YZ
VZA`

) }9u.'

A.Broggi

160

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 dellinserimento e della richiesta il programma deve ripetere le operazioni previste al punto 2.

Traccia per la risoluzione

= Y = ,\V

< V0a C ViZ =


` < 3
V a
C ?cGr ZAX C r V0Z =#@c?c= V
V\WAX
,XAZFa gsr X = ViZ = V
V\WFX
,XAZFa gsr= Vi,oV x / Z /
VMWAX
C ?cGr ,\XcZFa gsr V0Z =q@c?B=q? VMWAX
,XAZFa gsr V0Z =#@B?A=#?
V\WAX

N_bn -

<
% -

4> .) R"P



P  P

N ?A@B? N X K ,oY 1 p ` ?B=q? p


P ]]
t ` %n b99b . j  4> R
P
PR
,XcZFa gsr X = V0Z = V ,XAZAa g r = V0,_V x / Z /
,XAZFa gsr X = V0Z = V ,6XcZFa gsr}= Vi,\V x / Z /

La CPU Intel 8086: Architettura e Programmazione Assembly


V_Z = V @
VMWAX
,YZAV x V0VH`
V\WFX
Y[Z < V @ Y C r X = ViZ = V
` K
Y[Z < V @ Y C r}= Vi,oV x / Z /
` K
C V <<r@ Y 1 V @ 1 ?
` K
Z / Z r =#@ /cE ?A= /
` K
=@ /AE ?A= /
` K
Y <w=#@ XFUY / ZBY
` K
` K
` K
` K
` K
` K
,YZAV ?$r E X / =#?
` K
V_Z =#@B?A= V
` K
@ Y1 V @ 1 s
? r V0Z =#@c?c=#?
` K
= @B?A= V
Z X C r0
3
V Z #
` K
` < V3a
V_ZA` <

<>=#? 1h C

Pe
P ]

V_Z = V @$I ,YZAV x VHV0` I p Y 9 %b y j > %  p


V_Z = V @$I ,YZAV x ViVi` I p Y 9 %b  j %v4l .)' %[ p
V_Z = V @$I ,YZAV x VHV0` I p Y 9 %b " % 4 -
b %
- b  p
V_Z = V @$I ,YZAV x VHV0` I p Z  j n -  p
VZ = V @$I ,YZAV x ViV0` I p Z  j .v4>l: ) [w p
VZ = V @$I ,YZAV x V0Vi` I ,YZAV x V0Vi`
p N| j   P  .9 .&b > %b I p
VoZ = V @ I ,6YZcV x V0Vi`
R  %
 %
-  >> b I p
p
=

@
I
VoZ V
,6YZcV x V0Vi`
e  %9
%' {4 - )Q -jjl- 'p
p
V_Z = V @$I ,YZcV x ViV0` I p p
C ?BGr ZBX C r V0Z =#@B?A= V3 P
`5X NB7 ,XAZFa gsr V0Z =#@B?A=#? `5X Nq7pQp; I p p ;
,XAZFa gsr V0Z =#@B?A=#? `5X NB7bpQp ; I p p

<>=#? 1h C

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
` K
V_Zc` <

1 < V3a

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K 
, Y 1 p 15/ ` V p

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
C ? YZ

N @ $
/ 1
N X <wg
CD/cE
N X <wg
1 ? ,o,
1 ? ,o,
1 Y 1 , / r N @ Y Z 1 Y N ? ,_V 1 ? ,o,
1MCON

161

x2?A@

t Y 9bbu%m4 - ) - 9
 - b < V CN @ V
` <
?0GI ]]
t - )Q&6
'v4> %Q> -jkj 

?HG
t
Y[ZcYbU2Y ? ,YbU_U ? UY / ZBV
N @ V < VHZ =q?
U Y/ A
Z V
= ?
t , . ) - 9
%)& - 4 -  - 9 % ,Viaa Y r}< 1 H
V , #
t  ) 96) -  ? ,
? , I pP p
t< )k - 9bv> %pQp P p I

ub -

4

A.Broggi

162
T.ZAU
Z / r YZ < V @ Y C V0Z = /
1 ? ,o,
Y[Z < V @ Y C V0Z = /
CD/cE
` GJI / x|x< V = Y <w=#@
<=q? CN ?sr<w=#@ YZFa ?
1 ? ,o,
1 Y 1 , / r N @ YZ 1 Y N ? ,\V
T CON
? , I pR p
1MCON
Z / r YZ < V @ Y C i
V Z = /
t
T.ZAU
X < 1 Y =#?
@ Y1 V @ 1 ?
1 ? ,o,
CD/cE
` GJI / x|x< V = Y <w=#@
<=q? CN ?sr<w=#@ YZFa ?
1 ? ,o,
1 Y 1 , / r N @ YZ 1 Y N ? ,\V
T CON
<
=
q
?
@
=
t@

X 1 Y
V
C ? Y Z
V_ZA` N
,V3a$a Y r< 1 V0, =q?
Z3X /AE ?$r ,_V =#= X @B? 

,V3a$a Y r< 1 V0, =q?


Y[Z < V @ Y C ViZ = /

t - )') - 9 - ')  t Nbz


% .4w - "4 Q9b .b j .w
X UY / ZcY t<  -j  - ) }9u.'
t< ) - 9v> pQp R p I
- &) )& - 9b

X UY / ZcY t<  -j  -

) }9u.'

t @  - )m

)&vb
%' - )
' - ) < & 9b jk- /0 % - 'n

N @ $
/ 1
Z0V ?A@
?0gI ]
t< .n&u% ` / < p @ - 4h .^ - 41 - 
C/cE


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



? , IpP p
t 1ib)) - )k -  >L9 y p
1MCON
@ ?
t
 j  .9b: - p P pJ p e p I - )&)& T 1
Z0X /AE ?sr ,_V =#= X c
? , Ipe p P
t 9
 I - )' j .wQ' 1MCON
@ ?
t -yZiX /FE ?sr ,oV =q= X @c?
T.Z 1
Z3X /cE ?sr ,\V =q= X B
@ V =
V_ZA` N
N @ s
/ 1
Z0V ?A@
K , Im ZBX C r V0Z =#@c?c= V
CD/cE
K , I C ?cGr ZcX C r V0Z =#@B?A= V t< )l j .4"Q b -  p
1MCON
x
T*U
YZcV r YZ < V @ Y C ViZ = / t : b) n -  I b9
 9&
? , I C ?cGr ,_XAZFa gsr V0Z =#@B?A=#?
CD/cE
K ,
C XA,
? `F`
?iGJI / x|x< V = VZ =q@q?A= V
K\GJIL0
? G
t Nw -- )) - b jk-  - >) - n" CD/cE
KoG
t< - )n - )w - b - )') - b -  N X <wg
CD/cE
` GJI / x|x< V = Y[Z < V @ Y C r X = V0Z = V
<=q? CN ?sr<w=#@ YZFa ?
1 ? ,o,
t , . > %w
1 ? ,o,
,ViaaFY r X = V0Z = V
KMG
t @ 9 - )k -  - )&)p .w
No/FN
? `F`
KMGJI ,_XAZFa gsr X = ViZ = V t ) - w -  - )l: %)& 
x < V = Y[Z < V @ Y C r = Vi,oV x / Z /
CD/cE
` GJI / x|
<=q? CN ?sr <w=#@ YZFa ?
1 ? ,o,
t , . )k j %v4l .)' %[
1 ? ,o,
,ViaaFY r= V0_
, V x / Z /
K\F= V N =q@ ZqX C r V0Z =q@c?B= V t ? & - )k j %v4>Q - )&
Y[Z 1

La CPU Intel 8086: Architettura e Programmazione Assembly

163

x YZAV r YZ < V @ Y C VHZ = /J @ V =


Y[Z < V @ Y C i
V Z = /
V_ZA` N
,V3a$a Y r X = V0Z = V
Z3X /AE ?$r ,_V =#= 

x Y ZAV r ,_V #
= = X q
@ ? 
,V3a$a Y r X = V0Z = V
,V3a$a Y r = V0,_V x / Z /

N @ /$1

Z0V ?A@
g rX = 0
CD/cE
1 GJI ,_XAZFa s
V Z = V t Y 'u. - )&&u.u - )l
w - b {
-  - b %
?0gI ]
t< .bn&u% ` / < p @ - 45 .^ - 41 - 
C/cE


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



? , I V_Z = V @
t < y)k - 9bv pJ w % I
1MCON
x YZcV r ,_V =#= X @q?
t  . j & - ) - )  T*U
? , I pQp
t 10w)') - )k -  L9  %p
1MCON
s
?
r
#
=
=
t n - )&4w I )' .  - )'b - 9
T 1
Z0X /AE
,_V
?HG
t < - )n - )k .&9b ?0G
N X <wg
?3gsI ] R
t < %n^u%& ` / < p1 -  -
 %/3w%p
CD/cE


t 1 -  - b . 4 - 9[ -j  - b
CD/cE
`5, IL? ,
R"P
Y[Z =

?0G
t @  9& - )Q
w 6w4> ?iG
No/FN
KiG IL? ,
t C j &u.u - ) - 9
CD/cE
KMG
t ? 
 & - )kw - 
Y[Z 1
t @ %&b . - & -
{1 G$ ]
, / / N
Z3X /cE ?$r ,_V =#=

@ V =
V_ZA` N

N @ / 1
ZiV ?A@
CD/cE
1 GJI ,_XAZFa gsr= V0,\V x / Z / t Y u - )'u%u -
w - b
-  -  %
?3gI ]
t< %n&u%' ` / < p @ - 4#  - 41 - 
CD/AE
Z3X /AE ?$r ,_V =#=qR 


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



? , I V_Z = V @
t < y)k - 9bv pJ w % I
1MCON
x YZcV r ,_V =#= X @q?FR
t :  j & - ) - ) b T*U
? , I p}]wp
t 1ib)) - )k -  >L9 y p
1MCON
t
 j  f9b: - p ]pJ yp ^p I
T 1
Z0X /AE ?sr ,_V =#=BR
? , I p}wp P
t - ))> - &)& % y - )' - 9
1MCON
T.Z 1
Z3X /cE ?sr ,\V =q=qR
?HG
t< - )n - )k .&9b ?0G
N X <wg
?3gsI ] R
t < %n^u%& ` / < p1 -  -
 %/3w%p
CD/cE


t 1 -  - b . 4 - 9[ -j  - b
CD/cE
`5, IL? ,
R"P
Y[Z =

?0G
t @ 9& - )Q
w 6w4> ?iG
No/FN
KiG IL? ,
t C j &u.u - ) - 9
CD/cE
KMG
t ? & - )kw - 
Y[Z 1
t @ %' % - '6 -
{1 G$ ]
, / / N
Z3X /cE ?$r ,_V =#=qR

x YZAV r ,_V =#= X @q?FR 
@ V =
,V3a$a Y r = V0,_V x / Z /
VZA` N

A.Broggi

164

@ Y1 V @ 1 ?

1 Y1 , /

1/ Z x|@

x YZAV r @
@ Y1 V @

N @
/ 1
Z3V ?A@
? , Im ZqX C r V0Z =#@c?c= V t <  pL9 - v9 %' .99
CD/cE
? , I]
t > %b I - ))& - 9 - ) -v- )l: % j 
1MCON
x YZcV r @ Y 1 V @ 1 ?
t 4> .)') - 
 %
T*U
CD/cE
` GJI / x|x< V = C V <<r @ Y 1 V @ 1 ?
<q
= ? CN ?sr<w=#@ YZFa ?
t<  -j  -j .99 - v4>Q
 %
1 ? ,o,
K\J
G I / x|x< V = @ Y 1 V @ 1 ?sr ViZ =q@B?c=q?
CD/cE
?
t , . > %w
1 ,o,
,Vi
a aFY r X = V0Z = V
I KMG
CD/cE
1 GJJ
< X K
1 GJI / x|x< V = @ Y 1 V @ 1 ?sr V0Z =#@B?A=#? t < y %pJ9 - v> j wv9)&
x YZcV r @ Y 1 V @ 1 ?
t V_Z = V @$I  % j  - ) - 
 .
- 
T*U
1 ,_`
K , Im ZBX C r V0Z =#@c?c= V
CD/cE
x x< V = V_Z =q@B?c= V
CD/cE
`3Y I / |
r@ Y 1 V @ 1 ? 
t < - )n - ) - )w %uu - 4> )) - 9 N X <wg
1 G

N X <wg
`3Y
< Y I / x|
x < V = @ Y 1 V @ 1 ?sr V0Z =q@c?B=q?
CD/cE
@ V N
t 10[w - ) y9'6 4Qz .9
1MCN <K

1H/ Z x|@ / Z = / r /
T.V
t @ & 9& - w -  > w
No/FN
`5Y
t @ '9bb - ) %u.u - 9[ No/FN
1 G

? `F`
`3Y I C ?BGr ,oXAZAa g$r ViZ =q@B?A=#?
K ,
t ` f
 j .w -
w - b
w
`5V 1
t 10w& - ) - 
 %
- 9 K , ]
1 Y 1 , / r}@ Y 1 V @ 1 ?
T.ZAU
CD/cE
` GJI / x|x< V = Z / Z r}=q@ /FE ?c= /
?

<
=q? CN ?sr<w#
= @ YZFa ?
t<  -j  - 9[' - p Z  = bn - p
1 ,o,
x YZcV r}@ Y 1 V @ 1 ?
t = % j  - ) - &
% %
T CON
/ Z = / r /Fd
CD/FE
` GJI / x|x< V = =H@ /AE ?A= /
<=q? CN ?sr<w=#@ YZFa ?
t<  -j  - 9[' - p = n - p
1 ? ,o,
t N|6w - w&u.' %w :bn - 
No/FN
` G
No/FN
1 G
? `F`
` GJI ,oXAZca g$r X = V0Z = V t NHw -- )m96 j . .)' %[

<=q? CN ?sr<w=#@ YZFa ?
t )9 -j  1 ? ,o,
@ V =
Y1 V @ 1 ? 
1 ?
V_Zc` N

<>=#? CON ?sr<w=#@ YZFa ?

C /cE
D
Y[Z =

N @ / 1
Z3V ?A@
?3gsI ]

R"P


t < %n^u%&

` / <

p NH'

< &p

La CPU Intel 8086: Architettura e Programmazione Assembly

<>=#? CON ?sr<w=#@ YZFa ?

Y[ZcYbUY ? ,oYUU ? U2Y / ZAV

@ V =

V_Zc` N

N @ /s1
CD/cE
CD/cE
CD/cE
CD/cE
@ V =
?
?
Y[ZcYbUY ,oYUU U2Y / A
Z V
VoZA` N
N @ V < ViZ =q? U2Y / ZAV

N @ V < ViZ =q? U2Y / ZAV

1 < V3a

165

Z3V ?A@
?0GId< Via ` < V3a
` <IL?0G
V <IL?0G
ZqX C r V0Z =q@c?B= V I ]

t Z  j %v4>Q .wQ9b &

? @
N @ /$1
Z0V A
x < V = Y <w=#@ X UY / ZcY t<  -j  CD/cE
` GJI / x|
<=q? CN ?sr <w=#@ YZFa ?
1 ? ,o,
@ V =
V_ZA` N

V ZB` <
o
C ? YZ
VZA`

) }9u.'

A.Broggi

166

CALCOLATORI ELETTRONICI
Prova scritta
25 novembre 1991

Scrivere un programma in assembler in grado di gestire unagenda giornaliera. Lagenda 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 linserimento di nuovi impegni e al termine la visualizzazione degli stessi.
Permettere la cancellazione di tutti gli impegni.
Permettere di uscire dal programma.

Limpegno orario e rappresentato da un stringa alfanumerica (max 50 caratteri).

Traccia per la risoluzione

= Y = ,\V
` < V3a
,V0Z r Y CN 0
V asZ /
,V0Z r}<=q@ Y ZFa ?
Z3X C r Y CN i
V asZBY
V_Z = V @

N_bn -

< V0a C ViZ = N ?A@B?


VoW X

V\W X
]

V\WFX
Pe
VMWAX

<
% -

4> .) R

N X K ,oY 1

n j 

p ` ?B=q? p
t , 6


P  P

u%u -

4"Q -

9['6 -

La CPU Intel 8086: Architettura e Programmazione Assembly


,YZAV x V0VH`
? a V0Zc` ?
Y CON V0a$ZcY

` K
` K
` K

V\WFX
` K
` K

` K
` K
` K
` K
` K
` K
` K
Y <w=#@ XFUY / ZBY

` K
` K

` K

` K
` K
` K

` K
C V <<r YZ < V @ Y C 0
V Z = /
` K
` K
` < V3a
V_ZA` <

<>=#? 1h C
<>=#? 1h C

1 < V3a

` K

P ]
V_Z = V @$I ,YZAV x V0VH`

? a V0ZA` ? ahY / @ Z ? ,oYV @c? p


p
V Z = V @ I ,6YZcV x V0Vi`
o
pA>]]p I ,V0Z r<w=#@ YZAa ? `5X NB7bp&&p}; I VZ = V @$I ,YZAV
p P ]w]]p I ,V0Z r <w=q@ YZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YZAV x
p P>P ]]p I ,V0Z r <w=q@ YZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YZAV x
p P.R ]]p I ,V0Z r <w=q@ YZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YZAV x
p P%e ]]p I ,V0Z r <w=q@ YZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YZAV x
p P~ ]]p I ,V0Z r <w=q@ YZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YZAV x
p P ]]p I ,V0Z r <w=q@ YZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YZAV x
p P% ]]p I ,V0Z r <w=q@ YZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YZAV x
p P ]]p I ,V0Z r <w=q@ YZFa ? `5X NB7bp'p}; I V_Z = V @$I ,YZAV x
t = % j & {9[' p p
VZ = V @$I ,YZAV x V0Vi` I V_Z = V @ I VoZ = V @sI VZ = V @
p N| j  4 - pp ? p&p - pp Y pp %9 %& t p
VoZ = V @ I ,6YZcV x V0Vi`
p
pp T p'pJ %
- 6
 %)&) - b t p I V0Z = V @$I ,YZAV x ViVi`
p
ppLppJ> %9
b p I VoZ = V @ I ,6YZcV x V0Vi`
VoZ = V @ I p <
% )& -  p
VZ = V @$I ,YZAV x V0Vi`
p < b& - 4 - 9b %b  p

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
V_Zc` <

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
C ? YZ

167

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

?HG
t
N X <wg
1 ? ,o,
Y[ZcbY U2Y ? ,YbU_U ? UY / ZBV

x ViV0`
VHV0`
VHV0`
VHV0`
VHV0`
VHV0`
VHV0`
VHV0`
VHV0`

ub -

4

A.Broggi

168
1 ? ,o,
N @ V < VHZ =q? UY / ZAV
<=q? CN ?sr E Y`FV ?A=#?
1 Y 1 , / r N @ YZ 1 Y N ? ,_V
 1 ? o
, ,
t , . ) - 9
 %)& - 4 -  - 9 % 1 ? ,o,
, ViaaFY r}< 1 VH, =#?

t  ) 96) -  ? ,


? , I pT p
t< )d - 9v p p T p I - ))> 1MCON
t - )&)& - 9Q9b .b9

T.Z 1
Z / r YZ < V @ Y C VHZ = /
t Nbz
% .4w - 4"Q9b .b j .w
1 ? ,o,
Y[Z < V @ Y C V0Z = /
1 Y 1 , / r N @ YZ 1 Y N ? ,_V
T N
t< y)k - 9bbv mp Jp I 9

Z / r YZ < V @ Y C ViZ = /
T.Z U
X < 1 Y =#?
1 ? ,o,
1 ? Z 1 VH,\, ? UY / ZAV
1 Y 1 , / r N @ YZ 1 Y N ? ,\V
T CON
<
q
=
?
@
=
t @ ' - ) < &9b jk- /0 % - 'n

X 1 Y
V
C ? YZ
V_ZA` N
,V3a$a Y r< 1 V0, =q?
Z3X /AE ?$r ,_V =#= X @B? 

,V3a$a Y r< 1 V0, =q?


Y[Z < V @ Y C ViZ = /

1 Y 1 , / r YZ < V @ Y C

N @ $
/ 1
Z0V ?A@
g ?A@
1 ? ,_,
,6V0asa$Y r 1 A
? ZA`
? , I ] ` x
t @ &b --yj$- '9b
)

? , Ip? p
t 1iw)) - )l -  >L9 y p
1MCON
t
 j  .9b: - p ? p yp Jp I - )&)& T 1
Z0X /AE ?sr ,_V =#= X @c?
? , Ip, p
t 9
 I - )&b j %l' 1MCON
t -yZiX /FE ?sr ,oV =q= X @c?
T.Z 1
Z3X /cE ?sr ,\V =q= X @B?
@ V =
V_ZA` N
N @ /s1
Z0V ?A@
?HG
t< - )n - ?0G
N X <wg
C /cE
D
` GJI / x|x< V = C V <<r YZ < V @ Y C ViZ = /
?

<
=q? CN ?sr<w=#@ YZFa ?
t<  -j  -j .99 - &
 .9 - 9b . j 
1 ,o,

?0G
t @ 9& - ?0G
No/FN
K\GJI / x|x< V = Y CON V3a$ZcY t N|w - b - )') --  %4 CD/cE
< X K
? , I p? p
t ? ,  j %v4> .)&) - 9
% %)& CD/cE
1 , I ,ViZ r Y CN 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@ YZAa ? t 10w -  4> j$-
-  -  %
t , . 
-  - b . y ) y ? ,
1 ? ,_,
,V0asa$Y r 1 gA?A@
? , I V_Z = V @
t < 9l j V_Z = V @ I
1MCON
x YZcV r YZ < V @ Y C
t 9l . j & - )p9b .b j .w
T*U
KiG IL? ,
t C j &u.u - )l
-  -  %
CD/cE
KMG
t Y 6
 j .w - )w - 
Y[Z 1
t 1iw& - ' -
{1 G$ ]
1 Y 1 , / r YZ < V @ Y C
, / / N


La CPU Intel 8086: Architettura e Programmazione Assembly


x YZAV r YZ < V @ Y
C 
Y[Z < V @ Y C i
V Z = /

169

@ V =
V_ZA` N

1 ? Z 1 V0,_, ? UY / ZcV

N @ / 1
Z0V ?A@
K\GJI / x|x< V = Y CON V3a$ZcY t Y &u%ub - 4 j j  CD/cE
CD/cE
1 GJI Z3X C r Y CON V0a$ZcY t 10 - b  j %v4Q j  %
? ` `
KMGJIL
t < 9b - w&u%v4) %
1 Y 1 , / r 1 ? Z 1 VH,\, 
CD/cE
` GJI ,V0Z r <w=q@ YZca ? t 1iw - b )w %u%u - 9' 
K\ = V N =q@ KiG I pp t 1 - 
%)) - 
-  -  %
1 Y 1 , / r 1 ? Z 1 r}R 
CD/FE
KMG
t Y 6
 j .w - )w - 
Y[Z 1
G
t ` f
 j  -
w -  9& `5V 1
`
t Y   - 9 
& .9
1 Y 1 , / r 1 ? Z 1 r}R
T.ZAU

? `F`
KMGJIJR
t ?  - )l> - 
t 1i& - ' -
1 G ]
1 Y 1 , / r 1 ? Z 1 V0,_,
, / / N

@ V =
1 ? Z 1 V0,_, ? UY / ZcV
VZA` N
<>=#? CON ?sr E Y`FV ?A=q?

N @ / 1
ZiV ?A@
?0GI ].>]]
t Y n^z
- )p10)' -  <
 . % < %n
% >p
CD/cE

t x & .9 - 4 -
- 6
 %)) -  1 G ` G
CD/cE
1 GJI ]%]]]

t 4w
- v)
494 %)m
-  -  .b
CD/cE
` GJIQP ]

KMgI
t ? &wv
-  - b %b
CD/cE
P ]
t  - )& - 9  - 99 - 4"
Y[Z =

?3gsI ] R
t Y nz
- )p < 1\9N_9'&8p
CD/cE

KMgI ]%]
t N - & - nf 4w % - &n CD/cE

G / @
t ? u.u% % -` G
` GJI ` G
P ]
Y[Z =

CD/cE
` GJI / x|x< V = ? a$V0ZA` ? t N|w -- )&) - 9& <=q? CN ?sr<w=#@ Y ZFa ?
t 4 %)&Q j  %Q ) - 9 -j  1 ? ,o,
CD/cE
` GJI / x|x< V = Y <w=#@ X UY / ZcY
<=q? CN ?sr<w=#@ YZFa ?
t<  -j  - ) }9u%&
1 ? ,o,
@ V =
<>=#? O
? r E Y`FV ?A=q?
C N s
VZA` N
<>=#? CON ?sr<w=#@ YZFa ?

? @
N @ / 1
Z3V A
?3gsI ]
CD/cE

R"P
[Y Z =

@ V =
<>=#? O
C N ?sr<w=#@ YZFa ?
V_Zc` N

t < %n^u%&

` / <

p NH'

< &p

A.Broggi

170
,V3a$a Y r 1 gA?c@

,V3a$a Y r 1 gA?c@

? @
N @ / 1
Z0V A
?3gsI ] P
C /cE
D

R"P
Y[Z =

@ V =
V_Zc` N

Y[ZcYbUY ? ,oYUU ? U2Y / ZAV

N @ /s1
Z3V ?A@
? GId< Via
0
CD/cE
CD/cE
` <IL?0G
@ V =
?
?
Y[ZcYbUY ,oYUU U2Y / ZAV
VoZA` N
N @ V < ViZ =q? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV

1 < V3a



@ V =

N @ /$1
V_ZA` N

VoZB` <
C ? YZ
VZA`

Z0V ?A@

` < V3a

t < %n^u%&

` / <

p @ - 45 . - 41


- %p

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
` < 3
V a
`3Y C r C
C ?A=#@
C ?A=#@
C ?A=#@
` < V3a

?A=
Y 1 V r?
Y 1 V rK
Y 1 V r1

<>=#? 1h C
<>=#? 1h C

N_bn -

<
% -

4> .) P ] % - '

< 0
V a C ViZ = N ?A@B? N X K ,oY 1 p `
e
V\WAX
? = `3Y C r C
` K
`3Y C r C A
K
r
A
?
= 3
C
C
`
`3Y
` Y C rC
` K
`3Y C r C ?c= 3
` Y C rC
V_ZA` <

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
` K
V_Zc` <

?B=q?
t@
?B=
?c=
?A=

P  R

p
&9)v> .)m
- 9b
`5X NB7 ;
`5X NB7 ;
`5X Nq7 ;

e e

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

ub -

4

A.Broggi

172

1 < V3a

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
C ? YZ

C ? YZ
CD/ , = Y N ,_Y 1 ? UY / ZAV

1 Y 1 , / &r P 
1 Y 1 , / }r R 

1 Y 1 , / re 

N @ $
/ 1
N X <wg
CD/cE
N X <wg
1 ? ,o,
1 ? ,o,
CD/cE
1 ? ,o,
CD/cE
1 ? ,o,
1 ? ,o,
CD/cE
1 ? ,o,
@ V =
V_ZA` N

CD/cE
CD/cE
CD/cE
CD/cE
C/cE
C/cE
N X <wg
N X <wg
G / @
C/cE
C XA,
? `F`
Y[Z 1
? `F`
`5V 1
T.ZAU
No/FN

x2?A@

t Y 9bbu%m4 - ) - 9
 - b < V CN @ V
` <
?0GI ]]
t - )Q&6
'v4> %Q> -jkj 

?HG
t
Y[ZcYbU2Y ? ,YbU_U ? UY / ZBV
N @ V < VHZ =q? UY / ZAV
K\GJI / x|x< V = C ?A=#@ Y 1 V r}?
t , % ) -  jl-js- 

,ViaaFY r C ?c=q@ Y 1 V
K\GJI / x|x< V = C ?A=#@ Y 1 V r}K
t , % ) - 9 .
4 -j$- 

,ViaaFY r C ?c=q@ Y 1 V
C/ , = Y N ,_Y 1 ? U2Y / ZAV t C)')&
- ) y4 j$- 

K\GJI / x|x< V = C ?A=#@ Y 1 V r 1
<=q? CN ?sr C ?A=#@ Y 1 V
t <  -j  - ) -j$- &
% y 96) -  
t @ ' - ) <  9 jl- /3 % - &n

N @ /s1
Z3V ?A@
< Y I / x|x< V = C ?A=#@ Y 1 V r ?
`3Y I / x|x< V = C ?A=#@ Y 1 V r K
K\GJI / x|x< V = C ?A=#@ Y 1 V r 1
t 10w -  ' y1 ,
1 , I `3Y C r C ?A=

t 1iw - 
) 1 g
1 gsI `3Y C r C ?c=
t 1i -  4 %)') -j )')&
- u
` gsI `3Y C r C ?c=
< Y
`3Y
t ? u.u% % - )k 9)& - bv - u - )&  `5,
`5, I `5,
? , Im < Y
t 1 - &
- ) j %v4 ?
Ko = V N =#@ `cY
t C)'&)'
-  % )' j %w4> K
t<  jkjl- )k&9)& - v - bu% - )&
`5, IL? ,
< Y
t Y 6
 j .w - w -  j$- 
 ?
t Y 
 j  -  -  js- 
 K
`3Y I `3Y C r C ?c=
t ` f
 j  - )l
b -  4 %)m

)
` g
t 4 j )'&)&
- u.'6
1 Y 1 , / r}e
`5Y

La CPU Intel 8086: Architettura e Programmazione Assembly


< Y
No/FN
Y[Z 1
`3Y
CD/cE
` <  K3G I 5
` ,
KMG
Y[Z 1
1 g
`5V 1
1 Y 1 , / rR
T.ZAU
? `F`
< Y I `3Y C r C A
? =
< X K
`3Y I `3Y C r C ?A=
1 Y 1 , / r&P
, / / N
@ V =
C / , = YN _
D
, Y 1 ? UY / ZAV
VoZA` N

173

t? 
 '9 - > -  j$- 
K
t C j bu%u - ) 9)w - 
t Y 6
 j .w - w - b j$- 
 1
t ` .
%b j % -
bw - 
)'
t? 
 9 t ?  &9b -

> 6w -  js- b 


?
 -   $
j -  &
% K

,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 - 
t , % y)l> j . ) y
1 Y 1 , / r\
1 ? ,\,
, V =q= X @B? 
,6V3asa V r ZAX C V @ /
KiG IL? ,
t C j &u.u - ) - )  CD/cE
KMG
t Y 6
 j .w - )w - 
Y[Z 1
t 10 - & -
1 GF ]
1 Y 1 , / r ,\V =q= X @B?
, / / N

@ 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 - 
? , Im K3G
t , % y)k j %
1 Y 1 , / r}<=q? CN ? 
CD/FE
<=q? CN ?sr ZAX C V @ /
t <  -j  - )Q
w b4> ? ,
1 ? ,o,
KMG
t Y 6
 j .w - )w - 
Y[Z 1
t 10w - & -
1 G$ ]
1 Y 1 , / r}<=q? CN ?
, / / N

@ V =
<>=#? O
? r C ?A=#@ Y 1 V
C N s
VZA` N
,V3a$a$V r ZAX C V @ /
@ ? 
Z3X /AE ?$r ,_V =#= X B

x YZAV r ,_V =#= X @q? 


,V3a$a$V r ZAX C V @ /

Y[Z =
1MCON
T 1
1MCON
T.Z 1
< X
@ V =

N @ / 1
Z3V ?A@
?0gI ]^
t< .n&u% ` / < p @ - 4h .^ - 41 - 
C/cE


R"P
t ' w V
p



? , I p}]wp
t< )k - 9bv> j bv %p p ]p
@ ?
t )  y - )& - 9
Z0X /AE ?sr ,_V =#= X c
? , I p}wp P
t< )k - 9b %p p pJ y) 
@ ?
t > - )'
Z3X /cE ?sr ,\V =q= X B
K
? , I p ]p
t < > - ) - 9 4> .Q j .bQ ?5< 1 YY
V_Zc` N

A.Broggi

174

Y[ZcYbUY ? ,oYUU ? U2Y / ZAV

N @ /s1
Z3V ?A@
? GId< Via
0
CD/cE
CD/cE
` <IL?0G
@ V =
Y[ZcYbUY ? ,oYUU ? U2Y / ZAV
VoZA` N
<>=#? CON ?sr ZBX C V @ /
<>=#? CON ?sr ZBX C V @ /
N @ V < ViZ =q? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV

1 < V3a



@ V =



@ V =

N @ /$1

Z3V ?A@

V_ZA` N
N @ /$1
V_ZA` N

VoZB` <
C ? YZ
VZA`

Z0V ?A@

` < V3a

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 -

< V0a C ViZ


VMWFX
VoW X
` K
` K
` K
V_ZA` <

<>=#? 1h C

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
` K
V_Zc` <

<>=#? 1h C

? @B?
N A
~ ]]

4> .) P

` < V3a
Z3X C r Y = V @B? UY / ZBY
G ]
?
K
@ ?
C ?F< 1 g V B
` < V3a

<
% -

N X K ,oY 1

 % - '

P  R

p ` ?B=q? p

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

ub -

4

A.Broggi

176

1 < V3a

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
C ? YZ

N @ /$1
N X <wg
C /cE
D
N X <wg
1 ? ,o,
1 ? ,o,
1 ? ,o,
CD/cE
1 ? ,o,
CD/cE
CD/cE
CD/cE
1 Y 1 , / r N @ Y Z 1 Y N ? ,_V LN X <wg
N X <wg
1 ? ,o,
No/FN
C XA,
? `F`
No/FN
, / / N
@ V =
?
C
Y Z
V_ZA` N
<>=#? CON ?sr ?qG

<>=#? CON ?sr ?qG

x2?A@
t Y 9bbu%m4 - ) - 9
 - b < V CN @ V
` <
?0GI ]]
t - )Q&6
'v4> %Q> -jkj 

?HG
t
Y[ZcYbU2Y ? ,YbU_U ? UY / ZBV
N @ V < VHZ =q? UY / ZAV
t , % y j % ) y ? ,
,ViaaFY r ZAX C V @ /
? IL? ,
t ,  j j 'u.u -  ?
t , % y j % ) y ? ,
,ViaaFY r ZAX C V @ /
K IL? ,
t ,  j j bu%u -  K
? , IJG ]
t Y u% - )&u%u - G ] ? ,
1 GJI Z3X C r Y = V @q? U2Y / ZcY t 13> - 
t < - )'n - 1 G
1 G
?HG
<=q? CN ?sr ?cG
t <  -j  - )l j .bv ? ,
?0G
Ko = V N =#@ ?
tA?0G ? >? ,
? , ILK\F= V N =q@ K tL? , 77 ? >? , ; K ; j z4 R
t @ '9bb - 1 G
1 G
1 Y 1 , / r N @ YZ 1 Y N ? ,_V
t @ ' - ) <  9 jl- /3 % - &n

N @ /$1
Z3V ?A@
<=q? CN ?sr K Y ? Z 1#/
t <  -j
1 ? ,o,
G / @
?3gsI}?Ag
t ? u%u % C ?F< 1 g V @c? I ]
t ? uu. % CD/cE
CD/cE
1 , IQP ]]
<=q? CN ?sr 1 ?c@c?A=h=
1 ? ,o,
CD/cE
1 , IQP ]
<=q? CN ?sr 1 ?c@c?A=h=
1 ? ,o,
C ?F< 1 g V @c? I&P
CD/cE
<=q? CN ?sr ZAX C V @ /
1 ? ,o,
@ V =
t @ '
  V_ZA` N

 - )k j

-  - b %  - 

? g
)k % 9 0
) -js- 9b
. 

)) -

bz
 .4w -

 -jk- w


La CPU Intel 8086: Architettura e Programmazione Assembly

? @
N @ / 1
Z V A
0
?HG
N X <wg
1 ,
Y[`AY E
C ?F< 1 g V B
@ ? IL? ,
tZ 
/ @
  - 
  . - ? , %pL4"n^ %9v4 t )- C F
? < 1 g V @q? "4 n w - p w]>p
<=q? CN ?sr ZAX C V @ /
t <  -j  - ? ,
A
1 ? ,o,
C XA,
1 ,
K , IL? ,
CD/cE
?0G
No/FN
< X K
? , ILK ,
@ V =
<>=#? CON ?sr 1 ?A@c?B=q=
V_ZA` N

177

<>=#? CON ?sr 1 ?A@c?B=q=

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

] I

N @ /$1
Z3V ?A@
?HG
t < - )n - ?0G
N X <wg
K , IL? ,
t < ? , ) - C ?c< 1 g V @B? 9] I
C /cE
D
K , I C ?F< 1 g V @c?
t 9 -j  -  - 
%v b4 9b
 
/ @
<"=q? CON ?sr ZcX C
T.ZAU
<=q? CN ?sr K Y ? Z 1#/
1 ? ,o,
x YZcV r <w=q? CON ?
T N
<>=#? CON ?sr ZBX C
? ` `
? , I p}]wp
t ,_- 9b 4 -
Q - b& pQp ]p
<=q? CN ?sr 1 gc?A@
t <  ->j  - )l
-  -    ? ,
1 ? ,o,
x YZAV r}<=q? CN ? 
?0G
t @  9& - ?0G
NM/FN
@ V =
<>=#? CON ?sr ZBX C V @ /
V_ZA` N
<>=#? CON ?sr K Y ? Z 1h/

<>=#? CON ?sr K Y ? Z 1h/


<>=#? CON ?sr 1 gA?A@

? @
N @ /s1
Z0V A
?HG
N X <wg
? , I plp
CD/cE
<=q?
1 ? ,o,
C N ?sr 1 gc?A@
?0G
No/FN
@ V =
V_ZA` N

N X <wg
C /cE
D
CD/cE
CD/cE

N @ /s1
Z3V ?c@
1 G
?3gsI ] V

K , I]
1 GJI ]]] P


t< - )n - ?0G


t 1 - 
-  ? , )l
b4&
% 4pp
t<  ->j  - )l
-  -    ? ,
t @ 9& - 0
? G

t< - )'n - 1 G
t< .n^u K Y / < p  ' 1 - %p

t N - & -v- b&n t <  ->j  - 9)v
-  - b %b

A.Broggi

178

<>=#? CON ?sr 1 gA?A@

Y[Z =
No/FN
@ V =

P ]

1 G

t @ ' 9bb - 1 G
t @ ' - )) - 
 bz
 .4w -

VoZA` N

Y[ZcYbUY ? ,oYUU ? U2Y / ZAV

N @ /s1
Z3V ?A@
? GId< Via
0
CD/cE
CD/cE
` <IL?0G
@ V =
Y[ZcYbUY ? ,oYUU ? U2Y / ZAV
VoZA` N
,V3a$a Y r ZAX C V @ /
,V3a$a Y r ZAX C V @ /
N @ V < ViZ =q? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV

1 < V3a



@ V =



@ V =

N @ /s1

Z3V ?c@

VoZA` N
N @ /$1
V_ZA` N

VoZB` <
C ? YZ
VZA`

Z0V ?A@

` < V3a

 -jk- w


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
` < 3
V a
Z3X C V @ /
` < V3a

<>=#? 1h C

< V0a C ViZ =


`5
V_ZA` <

N_bn ? @B?
N A

<
% -

4> .)D

N X K ,oY 1

- ')

P  R

p ` ?B=q? p

<>=#? 1h C

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
` K
<
V_Zc`

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

1 < V3a

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
t

ub -

4

A.Broggi

180

C ? YZ

N @ $
/ 1
N X <wg
CD/cE
N X <wg
1 ? ,o,
1 ? ,o,
1 ? ,o,

x2?A@

CD/ , = Y N ,_Y 1 ? UY / ZAV

? @
N @ s
/ 1
Z3V A
? G
H
N X <wg
? GI ` G
0
C /cE
D
C XA,
Z0X C V @ /
G 1 g a
G I 1 G
` 
G 1 g a
K\GJL
I ?0G
?0G
No/FN
C XA,
Z0X C V @ /

t Y 9bbu%m4 - ) - 9
 - b < V CN @ V
` <
?0GI ]]
t - )Q&6
'v4> %Q> -jkj 

?HG
t
Y[ZcYbU2Y ? ,YbU_U ? UY / ZBV
N @ V < VHZ =q?
U Y/ A
Z V
t , % y)k j . ) j j bu%u ,ViaaFY r ZAX C V @ /
t  .)Q %&9b ?iG 
t C j &u%u - )k j %
CD/cE
Z3X C V @ / IL?iG
t ? u%u%  - ) -  - b - ) - 4" . e%R '
CD/cE
` GJI ]
t ` G  ?BG  ) -j ))&
- u 
<=q? CN ?sr ZAX C V @ /
t <  -j  - )k j . ` G  ?cG 
1 Y 1 , / r N @ Y Z 1 Y N ? ,_V 1 ? o
, ,
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 
1 Y 1 , / r N @ YZ 1 Y N ? ,oV
T*U
@ V =
t @ ' - ) <  9 jl- /3 % - &n
C ? Y Z
V_ZA` N

CD/ , = Y N ,_Y 1 ? UY / ZAV

? `F`

` GJILKMG

? ` 1

1 GJI ]

@ V =

VoZA` N

t< - )n -  P '4> ?0G 9))& <  -



t C)'&)&
-  P 'pL9&'
t
- bnQ> %) Z3X C V @ / [ ` G  ?BG
t N )9b)' - v1 G  ?cG
t N| )l9)' - 1 G  K3G
t @ 9& -  P ' j %v9&&
t ) j )')&
-  % Z3X C V @ / I  
t  .4w)k 9)& - bv ` G  ?cG
t Y )Q9)' - ' - ) - 64w - pJ
t
` G  ?BG

1 G  K5G
t::
t
1 G  ` G  ?cG
t < 1 G pJ> - ) - u % I  )
t U %b x ) -  - 4 . %' % - b

La CPU Intel 8086: Architettura e Programmazione Assembly

Y[ZcYbUY ? ,oYUU ? U2Y / ZAV

N @ /s1
Z3V ?A@
? GId< Via
0
CD/cE
CD/cE
` <IL?0G
@ V =
Y[ZcYbUY ? ,oYUU ? U2Y / ZAV
VoZA` N
N @ V < ViZ =q? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV
,V3a$a Y r ZAX C V @ /
,V3a$a Y r ZAX C V @ /
<>=#? CON ?sr ZBX C V @ /
<>=#? CON ?sr ZBX C V @ /
1 < V3a


@ V =


@ V =



@ V =

N @ /$1

Z0V ?A@

V_ZA` N
N @ /s1

Z3V ?c@

VoZA` N
N @ /$1
V_ZA` N

V ZB` <
o
C ? YZ
VZA`

Z3V ?A@

` < V3a

181

A.Broggi

182

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 trasformazione 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

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


? =q? p
` < 3
V a
P
C ?cGr ZAX C r}x|?A=q= / @ Y
VMWAX
C ?qGr ZcX C }r x|?A=#= / @ Y5
` ?A= Y
`
3
` X NB7 ;
` < V3a
V ZA` <
_

<>=#? 1h C
<>=#? 1h C

1 < V3a

` K

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
V_Zc` <

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

ub -

4

A.Broggi

184

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
C ? YZ

C ? YZ

N @ /$1
N X <wg
C /cE
D
N X <wg
1 ? ,o,
1 ? ,o,
1 ? ,o,
1 ? ,o,
1 ? ,o,
@ V =
V_ZA` N

x2?A@
tY
` <
?0GI ]]
t

?HG
t
Y[ZcYbU2Y ? ,YbU_U ? UY / ZBV
N @ V < VHZ =q? UY / ZAV
,ViaaFY r ZAX C V @ /
< 1q/ACON5/ ZBY
<=q? CN ?sr / X = N X =
t@

9bbu%m4 - ) - 9
 - b < V CN @ V
- )Q&6
'v4> %Q> -k
j j 

t , %  y)k j . ) y


t <
% j  ?iG
t<  -j  - )l9b)& - 
' - ) <  9 jl- /3 % - &n

< 1#/ CON5/ ZcY

?0G

t ,  j '  ] ?0G  e
N @ / 1
ZiV ?A@
K\GJI / x|x< V = ` A
? = Y t N|6w -v- )')p&&u%&vub - 4 - 
CD/cE
t Nb j  -  4 -
w)') - 
1 GIdR
Z3X /AE ?$r< 1 ? Z < Y / ZcV  C/cE
G / @
t ? u%u%  - ) -  - b - ) - 4" .)m4>n^ 4w .4w
1 Y 1 , / r}< 1q/ACON5/ ZqY 
` GJI ` G
?HG
t< - )n - )k j 
N X <wg
t ` n^ 4w  .)d - bb
1 G
`3Y E
t < y) - 4"n&9' 4 -  .9b)&) I
1MCON
` GsI ]
x ?A=#=
t n -
)z99b j  - >
N @ / << Y C/ r |
T.ZAU
KiG I 1 G
t C j uu - ) - 
CD/cE
? `F`
KMGJIJR
t ?  - )l> - 
t = )' {4 - ))'9 -
%4 - 
No/FN
` G
t &8pL9'6
- n^
?0GJIQP
t @ . % - ) - 
% .4w - 9)&9
1MCON
T.ZAU
Z0X /AE ?$r < 1 ? Z < Y / ZcV tA?0G pL4'n %94 - P
x YZcV r < 1q/FCN3/ < YbU
T CON
?0G
t @ 9' - )k4&n 4w %64w
N @ / << Y C/ r}x|?A=h= 
N\/AN
t NHbn -
)kbz99b j  - 
1 G
Y[Z 1
t @ %' . - ) - bz
 .4w 1 Y 1 , / r< 1#/ CON3/ ZcY
T CON
x YZAV 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

,V3a$a Y r ZAX C V @ /

@ V =

185

VoZA` N

<>=#? CON ?sr / X = N X =

N @ / 1
Z0V ?A@
K\GJI / x|x< V = ` ?A= Yb Rt Nw - b - )) - u> - 4 -  R
CD/cE
t , % y)k j  - 
CD/cE
` GJIm KiGcR
t NH - 4 P ) -j )' %)&
' - p
CD/cE
1 gIQP
Z3X /AE ?$r C/ , = V N , 
?0GsIm K3G
t , % y)k - b
1 Y 1 , / r ,\V =q= X @B? 
CD/FE
? `F`
KMGJIJR
t Nw -- )Qz99 j  - b
?0GJI ` G
t , v
[w -
) .
 f4w w 
1MCON
r
|
x
A
?
#
=
=
t 9 4>&n .9 I n -v- 9 -j  - 
T.ZAU
Z0X /AE$/
t <  - ) I 
J) -j )' %)&
 - p
1 g
Y[Z 1
t  %&  - ) - z
 .4 1 Y 1 , / r ,_V =#= X @B?
T CON
<>=#? CN ?$r x|?A=#= / @ V
t <  -j  - Qp ` G 71 g ;p
1 ? ,_,
Z3X /AE$/ r}x|?A=q= 
t N| )kn^v - b  ` G
CD/cE
` GJIL?iG
t< y p - )l % j  4> %m4 -  I
1MCON
` GsI ]
t  %' . - ) - bz
 .4 T.ZAU
Z0X /AE ?$r C/ , = V N ,
@ V =
t - )& j .wQ 9

<>=#? CON ?sr / X = N X =
V_ZA` N
<>=#? CON ?sr x|?B=q= / @ V
<>=#? CON ?sr x|?B=q= / @ V


@ V =

N @ /$1

Z3V ?A@

VoZB` N

Y[ZcYbUY ? ,oYUU ? U2Y / ZAV

N @ /s1
Z3V ?A@
?
0

G
Id< Via
CD/cE
CD/cE
` <IL?0G
@ V =
Y[ZcYbUY ? ,oYUU ? U2Y / ZAV
VoZA` N
N @ V < ViZ =q? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV

1 < V3a


@ V =

t ` G
b>b % y)k j %v4 t j .w {1 g ) -j ) %)'
' - p

N @ /$1
V_ZA` N

V ZB` <
o
C ? YZ
VZA`

Z0V ?A@

` < V3a

9 -j  - 

A.Broggi

186

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

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
` < V3a
V_Z = V
,YZAV x
Z3X C V
V @B@ /
@

Y[Z < V @Fr K5?F< V


`

Y[Z < V @Fr ZAX C V @ /

` < V3a

<>=#? 1h C
<>=#? 1h C

1 < V3a

N_bn -

<
% -

4> .) P 9 b j b

`
`

` K

< V3a C ViZ = N A


? @q? <"=q? 5
1
~ `5X NBb7 p PfRe~ p ;
V_Zc` <

& p

p <=#? 5
1 p t Eq % - )&)&z
-  -  t j j 
 b -  .) <  -
%6J
t :wb ~> ^ .9

ub -

?0<< X C V 1 <  1 < V0a I ` <  ` < Via I <6<  <w=q? 15 C


< V3a C V0Z = N ?AB
@ ? N X K ,Y 1 p 15/ ` V p

t :::::::::::t
t
1\vb
& - ) 4 %)Q -jkjlt :::::::::::t
C ? YZ

P  R

< 0
V a C ViZ = N ?A@B? N X K ,oY 1 p ` ?B=q? p
P e
VMWAX
P ]
V\WFX
`5

` K
VoZ = V @ I ,YZAV x ViVi` I ,YZcV x ViV0`
K
p Y )Q j %9 %b&v p'p js- & 4> P
` K
VZ = V @ I ,YZAV x V0VH` I ,YZcV x ViV0`
K
p Y 69b %b ) - 9 > p
` K
VoZ = V @sI ,YZBV x V0Vi` I ,YZAV x V0VH`
K
p Y 69b %b ) j % p
` K
V_Z = V @sI ,YZAV x ViV0` I ,YZAV x V0VH`
K
p Y )Q j %v
bn .&v pp p
V_ZA` <

V0VH`
@ /
@ V

C V <<r / X = N X =

N @ /$1
N X <wg
C /cE
D
N X <wg
1 ? ,o,
1 ? ,o,
1 ? ,o,
1 ? ,o,

x2?A@
` <
?0GI ]]

?HG
Y[ZcYbU2Y ? ,YbU_U
N @ V < VHZ =q?
,ViaaFY rKh?F<
,ViaaFY r ZAX C

t Y b9 bu%m4 - ) - 9
 - b < V CN @ V
t - )Q&6
'v4> %Q> -jkj 
t
?
U Y / ZBV
U Y / ZAV

t , . - 9b t  y9b)'%J ? ,


V
t , % y)k j . %)&) V @ /
- 9b

?3g

4

A.Broggi

188
t
<>=#? CN ?sr V @B@ / @ V
ZqX C V @ /c IL?HG
,ViaaFY rKh?F< V
<=q? CN ?sr ZAX C V @
x YZcV
<>=#? CON s
? rV c
@ @ / @ V 
C/cE
` GI / x|x< V =
<=q? CN ?sr<w=#@ YZFa
1 ? ,o,
x YZAV 
@ V =
C ? YZ
V_ZA` N
T 1
C /cE
D
1 ? ,o,
1 ? ,o,
T CON

96 %
&[
-  - 4 - ? , )  ?0G
t< P '9 -j  -  4 9
%
t C j bu%u%)k j %
t , . ) - 9b y )  ? ,
t <  -j  - ZBX C V @ /Bm .)') /
- 9b 4w
-  t  ? , 4 b9

V @B@ / @ V t C %99 - v4>Q 
?
t<  -j  - ) j .99 - '
t @ ' - ) <  9 jl- /3 % - &n

,V3a$a Y r Kh?A< V

N @
/ 1
Z0V ?A@
CD/cE
` GJI / x|x< V = Y[Z < V @$rK#?F< V
<=q? CN ?sr<w=#@ YZFa ?
t<  -j  -j .99 - v4>Q9 . j .w
1 ? ,o,
t ,  j ' 98L
-  -   ) b CD/cE
1 , I p Jp P
t , %m
-  - b %b {
) j &
1 ? ,_,
Z3X /AE$/ r 1 ?B@c?A=h= 
,V0asa$Y r 1 ?A@q?A=q=
? , I V_Z = V @
t < y %pJ9 -  j w V_Z = V @
1MCON
t ) Q - )&
-  - b .
T*U
Z0X /AE / r 1 ?A@B?A=#=
? , I pR p
t< ) 1MCON
- 9 y4w
-  - p R
t ) Q - )&b
-  -  .b
T 1
Z0X /AE / r 1 ?A@B?c=q=
<=q? CN ?sr 1 ?c@c?A=h=
t<  -j  - )Q
-  - b . y) 
1 ? ,o,
@ V =
,V3a$a Y r Kh?A< V
VZA` N
,V3a$a Y r 1 ?A@B?A=#=
1 Y 1 , / r\
, V =q= X @B? 

N @ /s1
Z3V ?A@
?3g$I ]
t < %n&u.' ` / < p @ - 4h % - 41 - 
CD/FE


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



? , I p p P
t< )k - 9b %p p p I - ))' 1MCON
t 9 - )' - ) -
n %9  js- &
 9
)&
T 1
Z / r 1#/ Z E V @A< Y / ZAV
? ZA`
? , I ] ` x
t 13n^ .b y j$- 9b
%)&

? , I V_Z = V @
t < 9Q j VoZ = V @ I
1MCON
Z / r 1#/ Z E V @c< Y / ZBV 
x YZcV r ,_V =#= X @q?
t  . j & - ) - )  T*U
? , I p}]wp
t< p j ' 4>p ]p
1MCON
t - ))& - &)& % y)Q
-  - b .
1 Y 1 , / r ,oV =q= X @B?
T 1
? , I 1 ,
t , v
[w -
)) j 
1MCON
t z91 ,
1 Y 1 , / r ,oV =q= X @c?
T.Z 1
? , I p}wp P
t< pL
b j 6b .9b: - p ]pJ p p
1MCON
x YZcV r ,oV =q= X @B?
t - ))& -  . j & - ) - ) (b T 1
? , Ip? p
t< p p}wpJ p ? p
1MCON
t - ))& - &)& % y)Q
-  - b .
1 Y 1 , / r ,oV =q= X @B?
T 1
? , I 1 ,
t , v
[w -
)) j 
1MCON
t z91 ,
1 Y 1 , / r ,oV =q= X @c?
T.Z 1

La CPU Intel 8086: Architettura e Programmazione Assembly

189

? , I1 ,
t< p js- & 41 ,
1MCON
t - )') - &)& . )k
-  - b %
1 Y 1 , / r ,oV =q= X @c?
T.Z 1
x YZAV r ,_V =#= X @q? 
?3gIL? ,
t N  ?ig )l9b)& -  jlCD/FE
< X K
?3gsI p ]p
t   ?5< 1 YY td< b - p ]p
?3gIQP ]
t < y %p j & yy - ) -
1MCON
t  % j & - ) - )  1 Y x|@q?sr ` V 1 Y C ? ,\V
T 1
< X K
?3gsI p ? p pwp bP
t ? )&b  j bQ)b -  .)Q - 
@ V =
1 Y x|@B?sr `FV 1 Y C ? ,oV 
,V3a$a Y r 1 ?A@B?A=#=
VoZA` N
<>=#? CON ?sr 1 ?A@c?B=q=

<>=#? CON ?sr 1 ?A@c?B=q=


,V3a$a Y r ZAX C V @ /

1 Y 1 , / r ZAX C V @ /J

N X <wg
C /cE
D
CD/cE
Y[Z =
No/FN
@ V =

N @ / 1
Z0V ?A@
?HG
?3gsI ] R
`5, IL? ,
R"P

?0G

t < - )n - )l


bw b4 ?HG
t< . n&u% ` / < p1 -  -
( %/5wp

t Y 64w
- )Q
-  -  % 4 - 9 -j  - 
t<  -j  t @ 9& - ?0G

V_ZA` N

N @ s
/ 1
Z3V ?c@
? G
H
t< - )n - )l
bw b4 ?HG
N X <wg
C /cE
D
` GJI / x|x< V = Y[Z < V @$r ZAX C V @ /
<q
= ? CN ?sr<w=#@ YZFa ?
t<  -j  -j .99 - v4>Q9 . j .w
1 ? ,o,
?0G
t @ 9& - ?0G
No/FN
G IJ?0G
t ,  j & 98L
-  -  .b ) b CD/cE
1 J
t  ? , n - )' 4> %)) - 9b  ?3g
G / @
K\GJILKMG
t ? u.u% % - )l9b)& - v - u. - )&
?
r
A
?
B
@
A
?
#
=
=
t , % y
-  -  %b {4 -  - 9& . 1 ,\,
,6V0asa Y 1
<=q? CN ?sr 1 ?c@c?A=h=
t<  -j  - )Q
-  - b . y) 
1 ? ,o,
? , I V_Z = V @
t < y %pJ9 -  j w V_Z = V @sI  . j ' 1MCON
x YZcV r ZAX C V @ /
t ) - )  - b4 9
9 %u - 1 - b
T*U
G 1 g a
?iGJILKMG
t<
-j  - ?0G KMG > %) -j )''6)'
- u
K , IL?0g
t < - )n - ) -  - b - ) - 4 %)Q&9)& - 
CD/cE
t ?qG 1 g "? ,
C XA,
1 g
t< - )&n - ) 96) -  - u - )'  ` G
CD/cE
` GJIL?iG
? , ILK ,
t 1 - &
- ) -  - b - ) - 4> .)Q&9)& - 
CD/cE
t ?qG 1 g "?Ag
C XA,
1 g
? `F`
t N|  ` G )k&9)& - ' - )
` gIL? ,
x YZcV r ZAX C V @ /
t < js- ' 4> P & I : . j & T 1
?3gIQP
t < ?0g pL4>n^ .9bv4 - u % I 4> n
1MCON
t 9
&
)D1 -  - 4 P
1MC1
x YZcV r ZAX C V @ /
t < js- ' 4> P & I : . j & T 1

A.Broggi

190

x YZAV r ZAX C V @ /L


,V3a$a Y r ZAX C V @ /

? `F`
`5, ILKMg
? ` 1
` gI ]
K\GJI ` G
CD/cE
1 Y 1 , / r ZcX C V @ /
T.Z 1
?iGJIJKMG
CD/FE
@ V =
VoZA` N

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

N @ $
/ 1
Z3V ?A@
?HG
N X <wg
CD/cE
` GJI / x|x< V = C V
<=q? CN ?sr<w=#@ Y ZFa
1 ? ,o,
?0G
N /FN
o

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

? @
N @ / 1
Z3V A
?3gsI ]
CD/cE

R"P
[Y Z =

@ V =
<>=#? O
C N ?sr<w=#@ YZFa ?
V_Zc` N
Y[ZcYbUY ? ,oYUU ? U2Y / ZAV

N @ /s1
Z3V ?A@
? GId< Via
0
CD/cE
CD/cE
` <IL?0G
@ V =
Y[ZcYbUY ? ,oYUU ? U2Y / ZAV
VoZA` N
N @ V < ViZ =q? U2Y / ZAV
N @ V < ViZ =q? U2Y / ZAV

1 < V3a


@ V =

N @ /$1
V_ZA` N

V ZB` <
o
C ? YZ
VZA`

Z0V ?A@

t <  jkjk- K|g - )Q9%J - bu% - )& ` G 


t 
  -  - 64w)D1 - 
t N )k9b)' - v K\G
t 10%n .[)! I 9
 4 - )&) - 
 &
t NH y ?iG )k 9)& - b

t< - )n - )l


bw b4 ?HG
<<r / X = N X =
?
t<  -j  -j .99 - v4>Q%w
t @ 9& - ?0G

t < %n^u%&

` < V3a

` / <

p NH'

< &p

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 allintero 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.

A.Broggi

192

CALCOLATORI ELETTRONICI
Prova scritta
6 aprile 1993/1

Scrivere un programma in assembler che muova di una posizione un cursore (qualsiasi) sullo schermo 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 apostrofi).
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 allutilizzatore 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.

A.Broggi

194

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 unaltezza 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 determino i numeri di ricorrenze parziali formate da solo 3 caratteri e 2 caratteri nellordine 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 unagenda 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 lora e il tipo di impegno.
Modificare e/o inserire nuovi impegni per ogni singola ora della ora giornata.

A.Broggi

196

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

A.Broggi

198

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 nellordinamento.

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.

A.Broggi

200

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. Successivamente 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

A.Broggi

202

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 cursore 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+9330+08=
Uscita: 4+9330+08= 102

A.Broggi

204

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 loperazione
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

A.Broggi

206

CALCOLATORI ELETTRONICI
Prova scritta
29 Novembre 1995

Scrivere un programma in Assembly che:


1. Accetti in ingresso due date (giorno/mese/anno) nel formato:
variabilit :
%
] P e ]
varia da a
PSR
] P
j j
varia da
a

-% ]
varia da a

% jkj  --

, dove lintervallo di

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 leffettiva lunghezza dei mesi, e gli anni formati da 365 giorni.

Esempio:
N jl- 4 -  - 
< f
4 - 4 -  - 
a l - 9
9

] PPSR ~
PeP ]
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:


1. Accetti in ingresso due orari (ore/minuti/secondi) nel formato: 
di variabilit per i minuti e i secondi :
]%]
j j

varia da
a
]]
99

varia da a

 jkj }99

, dove lintervallo

2. calcoli e stampi il numero di secondi intercorsi tra i due orari.


Determinare inoltre lintervallo 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  - 
< f
4w% - b
< f
4wl - 9
9

P ]w R
] e ]
Pe  R  ]
P%P ]^

A.Broggi

208

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
lunica 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 dellanno 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 lintroduzione dei dati e per la visualizzazione del risultato.

Esempio per il primo caso:


a 
Cl f9b 

R
R

Y )Q%'4" %)) -

9  jl-  -

C - b .4w

E3  %4

Esempio per il secondo caso:


a 
Cl f9b 
? 

R
R
P 

Y )Q%'4" %)) -

9  jl-  -

A.Broggi

210

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 lultimo, che deve essere stampato sotto il penultimo.
&&&&&&&'&&&''[
_
mS*

_&&&&&&&'&&&''[
_&&&&&&&'&&&''[
(*

_&&&&&&&'&&&''[
_&&&&&&&'&&&''[
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 lInterrupt 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.
&&&&&&&'&&&''[
_
mS*S*

_&&&&&&&'&&&''[

Esempio di risoluzione
S



 
 : 
 :(

  
   
S
- 

 

 




! (M

 
!#"#$%'&)( *+&)% ,

.! /%0213/%0214

- 

( 5 6 66 (7 98 ;:


#
!#(\

%o*7 

(M=< ?>f=< -  @
>)02A< B
} 


} 
I S 

.! C!%#D%E!7#5GFH*09)0/"(D
- J
L
K'
M
 M >_ M

-N O


O
-N
M
  
I
P M >Q 6SRT T6SRT
 

- < I
P M >VU

 
XW
O


B


I
P >YU  Z  W
B
[W
I
P  >VU 

6
I
P
? >
ZB

- < I
P  >  J  @
U W




O
- 

A.Broggi

212
  
 
I4-

I S 

& B

 

 \>]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







-  


B*
 -

:
- 
  
-N O M
I

P M > b 6 666


}
@<

 

-
- M

B


*
:

 c&

  - J
 
fO >VU B  Z W
f  >VU  :(
[W
I4-   >#Q 6
^ _`
  
  

  O
 :   W > 
I
PdU 
 :(
[W > 6
I
PdU 
^ I4- K 

  @<
I4-  O > T
^ _`
T  
  

  O

 :   W > 6
I
PdU 
 :(
[W > 6 efefO
I
PdU 
^ I4- K 

T  @<
I4-   > 6egefO
^ _`
Sb(  
  
  O

 :   W > 6egefO
I
PdU 
 :(
[W > 6
I
PdU 
^ I4- K 

Sb(  @<
I4-  O > 6egefO
^ _ K 
  
  O
 :   W > 6
I
PdU 

La CPU Intel 8086: Architettura e Programmazione Assembly


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
I
D
P > 6
 6O
-
- M
-
- M

 -  O  *



} 

  
- J

I
P M > 
I
P  >o M
aW > 6
I
P
U

@
U B  Z W > 6
I
P
I
P
U B
 W > 

B*
 !#(\
!#( I S 

213

A.Broggi

214

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:
?0K 1 `FV
N jl- 9['6 - 
< f
4 - 9b& -  PSRP.~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 lAlto;


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

 %  % % 

  (\ 

 5 
7  I Q
  : _ 
 <
 %  % % 


 H (M 

 5 

A.Broggi

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 allinterno della stringa di una posizione;
nel caso la posizione successiva sia gi occupata dallaltra 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 dallutente.

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 

A.Broggi

218

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 posizione per ogni iterazione. Il carattere partir dallangolo 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 landamento descritto precedentemente. Quando il
carattere raggiunge lutlima posizione dello schermo (angolo in basso a destra), riprender dalla posizione iniziale.

Inserire allinterno del ciclo due procedure che permettano allutente 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 lInterrupt numero 16h (servizi 0 e 1).

Successivamente introdurre altre due procedure che permettano allutente 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 lalto
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      @<
K

 N O ^  N 
N


-  - -

O N ^

O N ^ S j
 N  ^ O N K N O -  -@-

A.Broggi

220

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 eliminando 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      @<
p <
`T <
 b<
rq <
`s <

ege % e
egege
egege
egege


B% %# egege !%0!K

B egege !20!K
 egege !mK
 egege K

% %#% %
% %#% %o;0

%#% % %o;02!
%#% % o
% ;02! egegegegefe K
% % %#_
% 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 immissione 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 linserimento della lettera di controllo e creare 5 colonne, una per ogni vocale.

Esempio:

* @   N      @<90
I4- J
40  B
 J
    J 
 
* @   N  Z   @
<,
R
I - J

0
Y
0 
 S 

Z J 
 }
Z  J
 }
* @   N      @<90
I4- J
40  B
 J
    J 
 
R

0 
 J



0
S

R
Z  J
 }
 J 
 

R
0
I4- 

0
I4- 


0
I4- 

0 
 S

0 
 S

 J 
 30 
 J

Z  J
 }
Z  J
 }

A.Broggi

222

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 approssimazione).
In un primo tempo assumere che il range di variabilit dellistogramma sia tra 0 e 1000; successivamente determinare 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 dellalfabeto maiuscole e minuscole, 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 dallalto al basso in modo che le due stringhe si incrocino in corrispondenza 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
"

A.Broggi

224

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 lultima 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 linsieme delle lettere che dividono la stringa iniziale sia definibile da utente.

Esempio:

_ M P%@b S*   kK  O ^aj  I 
* @  r     @<
* @  r
 |   -  ZP%   @


< Kk
N

_&&&&&&&'&&&''&&[
_ M P%@

b S*   Kk O ^aj  I 
_
M P%@

bQ(*   Kk O ^aj  I 


_
M B P%@

b (*   Kk O ^aj  I 
_
M P%@

b
(*   Kk O ^aj  I 
_
^aj  I 
M P%@

b
(*   Kk O
_



O
^aj  I
M B P}

b
(* Kk
_



O
^aj  I
M P%@

b
(* Kk
_



O
^aj  I
M P%@ b
(* Kk
_&&&&&&&'&&&''&&[





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. Allinterno 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 leffetto di eliminare le corrispondenti ricorrenze nella stringa iniziale (come sopra), mentre la pressione di
tasti corrispondenti a lettere maiuscole abbiano leffetto opposto, ovvero di reinserire le lettere eliminate in precedenza.

Esempio:

* @   N      @<

S*% %_~0/05G52

S"B% %_~0/05G52
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
 J )0# :
8
-
 - J Z

S"B% %_~0/05G52

A.Broggi

226

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 lalto 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 limmissione di una quarta stringa d; ogni volta
che si incontra una ricorrenza di un carattere di questultima 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:

* @
* @
* @
* @

_ M BP






r - I  J   @<
r  B
*  J   @<
r k  _     <
r N  :  J  <

K
b(% 
 O

^aj 

I 

_ M P%@b %   kK  O ^aj  I 

%P
O
K

Potrebbero piacerti anche