C86 32
C86 32
C86 32
FACOLTA` DI INGEGNERIA
DIPARTIMENTO DI INGEGNERIA DELL'INFORMAZIONE
PAOLO CORSINI
IL CALCOLATORE C86/32
struttura e manuale d'uso
PREFAZIONE
RETE di INTERCONNESSIONE
INTERFACCE
MEMORIA
PROCESSORE
PRINCIPALE
DISPOSITIVI
SOTTOSISTEMA
di
INGRESSO/USCITA
1 In accordo con la più consolidata delle tradizioni, anche in questo testo i bit
saranno indicati con i simboli 0 e 1
2 CAPITOLO I
0x00000000
0x00000001
0x00000002
0x00000003
0x0000
0x0001
0xFFFE
0xFFFF
0xFFFFFFFE
0xFFFFFFFF
AX
EAX EIP
AH AL
BX
EBX EF
BH BL
Registri di Stato
CX
ECX
CH CL
DX
EDX
DH DL
BP
EBP
SI
ESI
DI
EDI
SP
ESP
Registri Generali
Processore
OF SF ZF CF
Fig. 3 - Il registro dei flag F.
La funzione di questi quattro flag è di norma la seguente:
OF (Overflow Flag): quando contiene 1 indica che durante l’esecuzio-
ne dell’ultima istruzione si è avuto un traboccamento: se l’istruzione
operava su numeri interi, questa situazione indica che il risultato
dell’operazione realizzata dall’istruzione non è rappresentabile.
8 CAPITOLO I
MOVE
Operandi Esempi
Memoria, Registro Generale MOV 0x00002000,%EDX
Registro Generale, Memoria MOV %CL,0x12AB1024
Registro Generale, Registro Generale MOV %AX,%DX
Immediato, Memoria MOVB $0x5B,(%EDI)
Immediato, Registro Generale MOV $0x54A3,%AX
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 19
LEA
Operandi Esempi
Memoria, Registro Generale a 32 bit LEA (,%ESI,2),%EDX
20 CAPITOLO I
PUSH
Operandi Esempi
Memoria PUSHW 0x3214200A
Immediato PUSHL $0x4871A000
Registro Generale PUSH %BX
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 21
PUSHF
FORMATO: PUSHF
AZIONE: Salva nella pila corrente una copia del contenuto del
registro dei flag F.
PUSHA
FORMATO: PUSHA
AZIONE: Salva nella pila corrente una copia del contenuto degli 8
registri generali a 16 bit, rispettando il seguente ordine: AX, CX, DX,
BX, SP, BP, SI, DI.
PUSHAD
FORMATO: PUSHAD
AZIONE: Salva nella pila corrente una copia del contenuto degli 8
registri generali a 32 bit, rispettando il seguente ordine: EAX, ECX,
EDX, EBX, ESP, EBP, ESI, EDI.
POP
Operandi Esempi
Memoria POPW 0x02AB2000
Registro Generale POP %BX
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 25
POPF
FORMATO: POPF
AZIONE: Rimuove dalla pila corrente una word e con i bit n. 11, 7, 6
e 0 di essa, rinnova il contenuto dei corrispondenti flag del registro
F.
POPA
FORMATO: POPA
POPAD
FORMATO: POPAD
EXCHANGE
Operandi Esempi
Memoria, Registro Generale XCHG 0x00002000,%DX
Registro Generale, Memoria XCHG %AL,0x000A2003
Registro Generale, Registro Generale XCHG %EAX,%EDX
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 29
INPUT
OUTPUT
ADD
Operandi Esempi
Memoria, Registro Generale ADD 0x00002000,%EDX
Registro Generale, Memoria ADD %CL,0x12AB1024
Registro Generale, Registro Generale ADD %AX,%DX
Immediato, Memoria ADDB $0x5B,(%EDI)
Immediato, Registro Generale ADD $0x54A3,%AX
32 CAPITOLO I
Operandi Esempi
Memoria, Registro Generale ADC 0x00002000,%EDX
Registro Generale, Memoria ADC %CL,0x12AB1024
Registro Generale, Registro Generale ADC %AX,%DX
Immediato, Memoria ADCB $0x5B,(%EDI)
Immediato, Registro Generale ADC $0x54A3,%AX
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 33
INCREMENT
Operandi Esempi
Memoria INCB (%ESI)
Registro Generale INC %CX
34 CAPITOLO I
SUBTRACT
Operandi Esempi
Memoria, Registro Generale SUB 0x00002000,%EDX
Registro Generale, Memoria SUB %CL,0x12AB1024
Registro Generale, Registro Generale SUB %AX,%DX
Immediato, Memoria SUBB $0x5B,(%EDI)
Immediato, Registro Generale SUB $0x54A3,%AX
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 35
Operandi Esempi
Memoria, Registro Generale SBB 0x00002000,%EDX
Registro Generale, Memoria SBB %CL,0x12AB1024
Registro Generale, Registro Generale SBB %AX,%DX
Immediato, Memoria SBBW $0x255B,(%EDI)
Immediato, Registro Generale SBB $0x54A3,%AX
36 CAPITOLO I
DECREMENT
Operandi Esempi
Memoria DECB (%EDI)
Registro Generale DEC %CX
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 37
NEGATE
Operandi Esempi
Memoria NEGB (%EDI)
Registro Generale NEG %CX
38 CAPITOLO I
COMPARE
Operandi Esempi
Memoria, Registro Generale CMP 0x00002000,%EDX
Registro Generale, Memoria CMP %CL,0x12AB1024
Registro Generale, Registro Generale CMP %AX,%DX
Immediato, Memoria CMPB $0x5B,(%EDI)
Immediato, Registro Generale CMP $0x45AB54A3,%EAX
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 39
MULTIPLY
Operandi Esempi
Memoria MULB (%ESI)
Registro Generale MUL %ECX
40 CAPITOLO I
INTEGER MULTIPLY
Operandi Esempi
Memoria IMULB (%ESI)
Registro Generale IMUL %ECX
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 41
DIVIDE
Operandi Esempi
Memoria DIVB (%ESI)
Registro Generale DIV %ECX
42 CAPITOLO I
INTEGER DIVIDE
Operandi Esempi
Memoria IDIVB (%ESI)
Registro Generale IDIV %ECX
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 43
NOT
Operandi Esempi
Memoria NOTL (%ESI)
Registro Generale NOT %CX
44 CAPITOLO I
AND
Operandi Esempi
Memoria, Registro Generale AND 0x00002000,%EDX
Registro Generale, Memoria AND %CL,0x12AB1024
Registro Generale, Registro Generale AND %AX,%DX
Immediato, Memoria ANDB $x5B,(%EDI)
Immediato, Registro Generale AND $0x45AB54A3,%EAX
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 45
OR
Operandi Esempi
Memoria, Registro Generale OR 0x00002000,%EDX
Registro Generale, Memoria OR %CL,0x12AB1024
Registro Generale, Registro Generale OR %AX,%DX
Immediato, Memoria ORB $0x5B,(%EDI)
Immediato, Registro Generale OR $0x45AB54A3,%EAX
46 CAPITOLO I
XOR
Operandi Esempi
Memoria, Registro Generale XOR 0x00002000,%EDX
Registro Generale, Memoria XOR %CL,0x12AB1024
Registro Generale, Registro Generale XOR %AX,%DX
Immediato, Memoria XORB $0x5B,(%EDI)
Immediato, Registro Generale XOR $0x45AB54A3,%EAX
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 47
FORMATO: CBW
FORMATO: CWD
FORMATO: CDQ
FORMATO: CWDE
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0
CF
Operandi Esempi
Immediato, Registro Generale SHL $1,%EAX
Immediato, Memoria SHLB $7,0x00002000
Registro CL, Registro Generale SHL %CL,%BX
Registro CL, Memoria SHLL %CL,(%EDI)
52 CAPITOLO I
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0
CF
Operandi Esempi
Immediato, Registro Generale SAL $1,%EAX
Immediato, Memoria SALB $7,0x00002000
Registro CL, Registro Generale SAL %CL,%BX
Registro CL, Memoria SALL %CL,(%EDI)
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 53
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0
CF
Operandi Esempi
Immediato, Registro Generale SHR $1,%EAX
Immediato, Memoria SHRB $7,0x00002000
Registro CL, Registro Generale SHR %CL,%BX
Registro CL, Memoria SHRL %CL,(%EDI)
54 CAPITOLO I
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
CF
Operandi Esempi
Immediato, Registro Generale SAR $1,%EAX
Immediato, Memoria SARB $7,0x00002000
Registro CL, Registro Generale SAR %CL,%BX
Registro CL, Memoria SARL %CL,(%EDI)
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 55
ROTATE LEFT
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
CF
Operandi Esempi
Immediato, Registro Generale ROL $1,%EAX
Immediato, Memoria ROLB $7,0x00002000
Registro CL, Registro Generale ROL %CL,%BX
Registro CL, Memoria ROLL %CL,(%EDI)
56 CAPITOLO I
ROTATE RIGHT
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
CF
Operandi Esempi
Immediato, Registro Generale ROR $1,%EAX
Immediato, Memoria RORB $7,0x00002000
Registro CL, Registro Generale ROR %CL,%BX
Registro CL, Memoria RORL %CL,(%EDI)
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 57
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
CF
Operandi Esempi
Immediato, Registro Generale RCL $1,%EAX
Immediato, Memoria RCLB $7,0x00002000
Registro CL, Registro Generale RCL %CL,%BX
Registro CL, Memoria RCLL %CL,(%EDI)
58 CAPITOLO I
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
CF
Operandi Esempi
Immediato, Registro Generale RCR $1,%EAX
Immediato, Memoria RCRB $7,0x00002000
Registro CL, Registro Generale RCR %CL,%BX
Registro CL, Memoria RCRL %CL,(%EDI)
MODELLO DEL CALCOLATORE E SET DI ISTRUZIONI DEL PROCESSORE 59
JUMP
CALL
RETURN
FORMATO: RET
NO OPERATION
FORMATO: NOP
HALT
FORMATO: HLT
1 GENERALITÀ
.GLOBAL _main
variable1: ...
...
...
variableM: ...
# Sezione codice
_main: ...
...
cycle: istruzione
...
IL LINGUAGGIO ASSEMBLER GAS 77
start_label:
porzione di dati o di codice da misurare
end_label:
Il nome simbolico del numero di locazioni occupate è pertanto
definibile tramite la direttiva .set, come segue:
.set numero_locazioni_occupate, end_label - start_label
File utility
inbyte: ...
...
RET
outbyte:...
...
RET
.GLOBAL _main
IL LINGUAGGIO ASSEMBLER GAS 79
# Sottoprogramma principale
# Prelievo del byte e suo trasferimento in DL
_main: CALL inbyte
MOV %AL,%DL
# Elaborazione del byte e costruzione
# del risultato in AL
MOV $0,%AL
cycle: CMP $0,%DL
JE send
SHL $1,%DL
ADC $0,%AL
JMP cycle
# Emissione del risultato
send: CALL outbyte
RET
.INCLUDE "utility"
1 GENERALITÀ
1 A meno che non siano stati o commessi errori di sintassi nel predisporre il file
sorgente
2 Occorre comunque evidenziare che non è data la possibilità di assemblare
separatamente più file sorgenti e collegarli insieme in un secondo momento
per ottenere un unico file eseguibile finale.
86 CAPITOLO III
2 IL DEBUGGER GDB
Comando run
Sintassi: r
Azione: Mette in esecuzione il programma.
Comando step
Sintassi: s enne
Azione: Mette in esecuzione le enne istruzioni successive a quella
eseguita per ultima. Omettere enne equivale a specificarlo pari a 1.
Comando next
Sintassi: n
Azione: Da usarsi esclusivamente se la prossima istruzione da esegui-
re è l’istruzione CALL. Mette in esecuzione l’intero sottoprogramma.
Comando continue
Sintassi: c
Azione: Mette in esecuzione il programma a partire dall’istruzione
successiva a quella eseguita per ultima.
Comando info registers
Sintassi: info reg
Azione: Mostra il contenuto dei registri.
Comando print register
Sintassi: p $registro
Azione: Mostra il contenuto del registro indicato. Il nome de registro
va scritto con lettere minuscole e non va fatto precedere dal carattere %.
Comando examine memory
Sintassi: x /numerotipo variabile
Azione: Visualizza il valore della variabile riferita. Il parametro
numero indica quante componenti della variabile si intendono esami-
nare; il parametro tipo indica il tipo della variabile (nessun spazio
va inserito tra i due parametri). Le indicazioni di tipo, diverse da
quelle del linguaggio assembler, sono: b per il tipo byte, h per il tipo
word e w per il tipo long. Omettere il parametro numero equivale a
specificarlo come 1; omettere il parametro tipo equivale a specificar-
lo come w. Non si possono tuttavia omettere entrambi i parametri.
88 CAPITOLO III
Comando quit
Sintassi: quit
Azione: Provoca la terminazione del debugger ed il ritorno al
sistema operativo Windows.
3 I SOTTOPROGRAMMI DI UTILITÀ
File utility
inbyte: ...
...
...
RET
outbyte: ...
...
...
RET
.GLOBAL _main
L'AMBIENTE DI SVILUPPO 89
Nome: input
Azione
Attende che dalla tastiera arrivi, tramite l’interfaccia di ingresso, la
codifica ASCII di un carattere. Quando ciò avviene immette tale co-
difica nel registro AL.
Nome: output
Azione
Invia al monitor, tramite l’interfaccia di uscita, la codifica ASCII di
un carattere.
Note
Se AL non contiene una codifica ASCII, il simbolo che eventualmente
compare sul monitor è privo di significato.
92 CAPITOLO III
Nome: newline
Azione
Invia al monitor prima il byte 0x0D (codifica ASCII del carattere
Ritorno Carrello) e poi il byte 0x0A (codifica ASCII del carattere
Avanzamento Linea), provocando lo spostamento del cursore dalla
posizione attuale al margine sinistro della linea successiva.
Struttura
Utilizza il sottoprogramma output.
newline: PUSH %AX
MOV $0x0D,%AL
CALL output
MOV $0x0A,%AL
CALL output
POP %AX
RET
L'AMBIENTE DI SVILUPPO 93
Nome: pauseN
Azione
Invia al monitor il messaggio:
Note
Il sottoprogramma pause0 ha anche, come nome alternativo, pause.
94 CAPITOLO III
Nome: inline_eco
Azione
Preleva le codifiche ASCII man mano che arrivano dalla tastiera, le
rinvia (eco) al monitor e le immette in una serie di locazioni conse-
cutive di memoria (buffer). Termina quando riceve il byte 0x0D
(codifica ASCII del carattere Ritorno Carrello), immettendo nel
buffer prima il byte 0x0A (codifica ASCII del carattere
Avanzamento Linea) e poi il byte 0x0D stesso. Il byte 0x08 (codifica
ASCII del carattere Backspace) viene interpretato dal sottopro-
gramma come l’ordine di eliminare dal buffer l’ultima codifica
ASCII che vi è stata immessa.
Note
Se il numero delle codifiche ASCII ricevute prima di ricevere il byte
0x0D è maggiore del numero specificato in CX diminuito di 2, alcune
codifiche vengono perse.
L'AMBIENTE DI SVILUPPO 95
Nome: outline
Azione
Invia al monitor le codifiche ASCII contenute in una serie di
locazioni consecutive di memoria (buffer), fino a che non trova ed
emette il byte 0x0D (codifica ASCII del carattere Ritorno Carrello).
Note
Se nel buffer non viene trovata la codifica ASCII del carattere
Ritorno Carrello, non viene segnalato alcun errore, ma il sottopro-
gramma entra in un ciclo in cui emette all’infinito il contenuto di
tutte le locazioni della memoria.
96 CAPITOLO III
EMISSIONE DI UN MESSAGGIO
Nome: outmess
Azione
Invia al monitor le codifiche ASCII contenute in una serie di
locazioni consecutive di memoria (buffer).
Note
Se il numero delle codifiche ASCII da emettere è maggiore del
numero delle locazioni del buffer non viene segnalato alcun errore,
ma il sottoprogramma emette anche byte casuali.
L'AMBIENTE DI SVILUPPO 97
Nome: inDA1_eco
Azione
Attende che dalla tastiera arrivi la codifica ASCII di una cifra
decimale (cioè appartenente all’insieme 0, 1, 2, 3, 4, 5, 6, 7, 8, 9), e
quando ciò avviene immette tale codifica nel registro AL e la rinvia
(eco) al monitor.
Struttura
Utilizza i sottoprogrammi input ed output e tratta le codifiche
ASCII come se fossero numeri naturali a 8 bit. Accetta pertanto le
codifiche ASCII che stanno nel range da 0b00110000 (codifica ASCII
di 0) a 0b00111001 (codifica ASCII di 9).
Nome: inHA1_eco
Azione
Attende che dalla tastiera arrivi la codifica ASCII di una cifra
esadecimale (cioè appartenente all’insieme 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A,
B, C, D, E, F). Quando ciò avviene immette tale codifica nel registro
AL e la rinvia (eco) al monitor. Utilizza i sottoprogrammi input ed
output.
Struttura
Utilizza i sottoprogrammi input ed output e tratta le codifiche
ASCII come se fossero numeri naturali a 8 bit. Accetta le codifiche
ASCII che stanno nel range da 48 (codifica ASCII di 0) a 57 (codifica
ASCII di 9) e nel range da 65 (codifica ASCII di A) a 70 (codifica
ASCII di F).
inHA1_eco: CALL input
CMP $48,%AL # '0'=48=0x30=0b00110000
JB inHA1_eco
CMP $70,%AL # 'F'=70=0x46=0b01000110
JA inHA1_eco
CMP $57,%AL # '9'=57=0x39=0b00111001
JBE eco
CMP $65,%AL # 'A'=65=0x41=0b01000001
JB inHA1_eco
eco: CALL output
RET
L'AMBIENTE DI SVILUPPO 99
Nome: B4HA1
Azione
Trasforma i 4 bit meno significativi del byte contenuto in AL nella
codifica ASCII della cifra esadecimale che li esprime in forma
compatta (vedi la Tabella a pag. 3 e la Tabella in Appendice).
4 bit da elaborare
Struttura
Dopo aver azzerato i 4 bit più significativi di AL e guardando ai vari
byte come a numeri naturali, deve compiere le seguenti
trasformazioni:
da 0b00000000 a 0b00110000 cioè, in decimale, da 0 a 48
...
da 0b00001001 a 0b00111001 cioè, in decimale, da 9 a 57
e
da 0b00001010 a 0b01000001 cioè, in decimale, da 10 a 65
...
da 0b00001111 a 0b01000110 cioè, in decimale, da 15 a 70
Compie pertanto la prima trasformazione sommando 48 e la
seconda sommando 55.
Nome: B8HA2
Azione
Trasforma gli 8 bit contenuti in AL nelle codifiche ASCII delle 2 cifre
esadecimali che esprimono gli 8 bit in forma compatta (vedi la
Tabella a pag. 3 e la Tabella in Appendice).
Struttura
Utilizza il sottoprogramma B4HA1.
B8HA2: PUSH %CX
# Salvataggio del contenuto di AL in CH
MOV %AL,%CH
# Elaborazione dei 4 bit più significativi
SHR $4,%AL
CALL B4HA1
MOV %AL,%AH
# Elaborazione dei 4 bit meno significativi
MOV %CH,%AL
CALL B4HA1
POP %CX
RET
L'AMBIENTE DI SVILUPPO 101
EMISSIONE DI UN BYTE
(da 8 bit alle codifiche ASCII di 2 cifre esadecimali
con emissione delle codifiche ASCII, ovvero B8HA2out)
Nome: outbyte
Azione
Trasforma gli 8 bit contenuti in AL nelle codifiche ASCII delle 2 cifre
esadecimali che esprimono gli 8 bit in forma compatta (vedi la
Tabella a pag. 3 del Capitolo 1 e la Tabella in Appendice) ed invia al
monitor le 2 codifiche ASCII.
Struttura
Il sottoprogramma utilizza i sottoprogrammi B8HA2 e output.
Nome: HA1B4
Azione
Trasforma la codifica ASCII di una cifra esadecimale nei 4 bit che
essa esprime in forma compatta (vedi la Tabella a pag. 3 del Capitolo
1 e la Tabella in Appendice) e deposita i 4 bit così ottenuti nella parte
bassa di AL
Note
Se AL non contiene la codifica ASCII di una cifra esadecimale il
risultato è inattendibile.
Struttura
Compie le trasformazioni inverse rispetto al sottoprogramma
B4HA1.
HA1B4: CMP $57,%AL
JA sub_55
sub_48: SUB $48,%AL
RET
sub_55: SUB $55,%AL
RET
L'AMBIENTE DI SVILUPPO 103
Nome: HA2B8
Azione
Trasforma le codifiche ASCII di 2 cifre esadecimali negli 8 bit che
esse esprimono in forma compatta (vedi la Tabella a pag. 3 del Capi-
tolo 1 e la Tabella in Appendice) e deposita il byte così ottenuto in
AL.
Note
Se AH e AL non contengono codifiche ASCII di cifre esadecimali il
risultato è inattendibile.
Struttura
Utilizza il sottoprogramma HA1B4.
HA2B8: PUSH %CX
# Salvataggio del contenuto di AL in CH
MOV %AL,%CH
# Elaborazione della codifica della cifra più significativa
MOV %AH,%AL
CALL HA1B4
MOV %AL,%AH
ROL $4,%AH
# Elaborazione della codifica della cifra meno significativa
MOV %CH,%AL
CALL HA1B4
OR %AH,%AL
POP %CX
RET
104 CAPITOLO III
Nome: inbyte
Azione
Attende che dalla tastiera arrivino le codifiche ASCII di 2 cifre
esadecimali. Quando ciò avviene trasforma le 2 codifiche ASCII negli
8 bit che le due cifre esprimono in forma compatta (vedi la Tabella a
pag. 3 del Capitolo 1 e la Tabella in Appendice) e deposita il byte
così ottenuto in AL. Oltre a ciò fa l’eco sul monitor delle codifiche
ASCII delle 2 cifre esadecimali prelevate.
Struttura
Il sottoprogramma utilizza i sottoprogrammi inHA1_eco e HA2B8.
inbyte: PUSH %BX
MOV %AH,%BH
# Prelievo con eco delle due codifiche ASCII
CALL inHA1_eco
MOV %AL,%AH
CALL inHA1_eco
# Conversione in binario con risultato in AL
CALL HA2B8
MOV %BH,%AH
POP %BX
RET
L'AMBIENTE DI SVILUPPO 105
Nome: B16DAN_out
Azione
Interpreta il contenuto di AX come un numero naturale binario, lo
esprime in base dieci su più cifre e poi invia al monitor le codifiche
ASCII delle cifre stesse.
Struttura
Detto A il numero da esprimere in base dieci e dn-1, dn-2, ..., d0
le cifre (incognite) che lo esprimono in tale base, allora:
A = ((dn-1 · dieci + dn-2) · dieci + ... d1) · dieci + d0
Posto:
A[0] = A e A[1] = (dn-1 · dieci + dn-2) · dieci + ... d1
si ha
A[0] = A[1] · dieci + d0
da cui:
d0 = A[0] modulo dieci , A[1] = A[0]/dieci
Iterando, si ricava il seguente algoritmo:
di = A[i] modulo dieci , A[i+1] = A[i]/dieci
per i = 0, 1, ..., m-1 e A[0] = A
Nome: inDANB16_eco
Azione
Attende che dalla tastiera arrivino più codifiche ASCII di cifre
decimali. Quando ciò avviene interpreta le cifre come l’espressione
in base dieci di un numero naturale, esprime tale numero in base due
su 16 bit e lo deposita in AX. Oltre a ciò, fa l’eco sul monitor delle
codifiche ASCII delle cifre decimali prelevate.
Note
Se il numero decimale supera 65535 non sono segnalati errori, ma il
risultato della conversione è inattendibile.
Struttura
Detto A il numero da esprimere in base due e dn-1, dn-2, ..., d0
le cifre (note) che lo esprimono in base dieci, allora:
A = ((0 · dieci + dn-1) · dieci + dn-2) · dieci ... + d0
Posto
A[0] = 0
A[1] = 0 · dieci + dn-1
= A[0] · dieci + dn-1
A[2] = (0 · dieci + dn-1) · dieci + dn-2
= A[1] · dieci + dn-2
...
108 CAPITOLO III
BS CAN ( 8 H X h x 1000
HT EM ) 9 I Y i y 1001
LF SUB * : J Z j z 1010
VF ESC + ; K [ k { 1011
FF FS , < L \ l | 1100
CR GS - = M ] m } 1101
SO RS . > N ^ n ~ 1110
SI US / ? O _ o DEL 1111
110 APPENDICE