Ho optato per la seconda opzione cioè quella di lasciare uno spazio nella tabella, in quanto mi sembrava la cosa più semplice.
Ecco qui il codice:
DATA SEGMENT PUBLIC
DESCR DB "Digita un numero e ti compare la relativa lettera dell'alfabeto!",10,13,'$'
DOM1 DB "Digita un numero [1 a 26]: ",'$'
SOLUZIONE DB "Lettera trovata: ",'$'
ACAPO DB 10,13,'$'
TAB DB ' ABCDEFGHIJKLMNOPQRSTUVWXYZ';tabella con le lettere dell'alfabeto
NUM DB ?
DIECI DB 10
CONTA DB 0
LETTERA DB ?
DATA ENDS ;fine del segmento dei dati
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
INIZIO:
MOV AX,DATA
MOV DS,AX
STAMPA MACRO FRASE
MOV AH,09H
LEA DX,FRASE
INT 21H
ENDM ;fine della macro
STAMPA DESCR ;richiamo la macro per la stampa della frase
STAMPA ACAPO ;richiamo la macro per la stampa della frase
STAMPA DOM1 ;richiamo la macro per la stampa della frase
CALL INPUT
STAMPA ACAPO ;richiamo la macro per la stampa della frase
LEA BX,TAB ;copio l'offset di TAB in BX
MOV AL,NUM
XLAT ;eseguo l'istruzione XLAT basandosi sui valori contenuti in BX e AL
MOV LETTERA,AL ;salvo il contenuto di AL in "LETTERA"
STAMPA SOLUZIONE ;richiamo la macro per la stampa della frase
MOV AH,02H ;richiesta stampa di un carattere
MOV DL,LETTERA ;metto il carattere in DL
;ADD DL,30H ;conversione
INT 21H ;interrupt per la stampa del carattere
;restituisco il controllo al DOS
MOV AH,4CH
INT 21H
INPUT PROC NEAR ;PROCEDURA PER L'INPUT DI UN NUMERO A 1 O PIù CIFRE
MOV BX,0
CICLO:
MOV AH,01H ;richiesta input di un carattere
INT 21H ;interrupt che permette di ricevere in input un numero
CMP AL,13 ;compare fra il contenuto di AL e 13(TASTO INVIO)
JE FINECICLO ;se il valore premuto è INVIO allora esco dal ciclo
MOV AH,00H ;azzero la parte alta di Ax
PUSH AX ;metto AX nello stack
MOV AX,BX ;copio BX in AX (nel primo caso BX è uguale a zero quindi il risulato sarà zero)
MUL DIECI ;moltiplico per 10 il registro AX
MOV BX,AX ;copio in BX il valore di AX
POP AX ;riprendo l'ultimo numero messo nello stack e lo metto in AX
SUB AL,30H ;conversione
ADD BX,AX ;sommo il contenuto di BX con AX
JMP CICLO ;salto incondizionato e torno all'inizio del ciclo
FINECICLO:
MOV NUM,BL ;metto in "NUM" il valore di BX
RET ;return
ENDP ;fine della procedura
CODE ENDS ;fine del segmento del codice
END INIZIO ;chiudo l'etichetta che indica l'inizio del programma
Ho però un dubbio che non ho capito:
Se ci sono più elementi non devo definire il numero di elementi presenti nella tabella come nel caso della dichiarazione di un vettore?