Istruzione "XLAT" [RISOLTO]

di il
22 risposte

Istruzione "XLAT" [RISOLTO]

Salve a tutti.

Sto cercando di approfondire il linguaggio Assembly 8086 in quanti mi ha colpito parecchio e anche perchè abbiamo fatto solamente le cose base.
Facendo varie ricerche ho scoperto dell'esistenza dell' istruzione "XLAT" ma non ho ben capito come si usa...

Ho capito che permette di gestire facilmente le tabelle di conversione e che somma il contenuto di AL e BX. In AL termina l'offset se non ho capito male.

Qualcuno se ha voglia potrebbe spiegarmi meglio questa istruzione? Grazie in anticipo

22 Risposte

  • Re: Istruzione "XLAT" [RISOLTO]

    E' semplice ...

    Con la XLAT ottieni nel registro AL il valore contenuto in memoria all'indirizzo DS: [BX+AL]

    Cosa non capisci? L'hai provato?
  • Re: Istruzione "XLAT" [RISOLTO]

    Quindi in pratica in BX ho il vero valore mentre in AL l'indirizzo di quel valore?

    Sinceramente no perchè non saprei cosa fare per chiarirmi le idee
  • Re: Istruzione "XLAT" [RISOLTO]

    No ... no ...

    Hai una tabella di byte, ad esempio

    0: 53
    1: 88
    2: 75
    3: 100
    4: 20
    5: 19

    In BX hai l'indirizzo iniziale della tabella (ovvero l'indirizzo del primo numero della tabella) e in AL hai l'indice del valore che vuoi ottenere (ad esempio 2).

    In questo caso, se esegui XLAT avrai in AL il valore 75
  • Re: Istruzione "XLAT" [RISOLTO]

    Ma gli indirizzi non sono a 20bit?

    Sarebbero da 20 ma è tramite la tecnica dell'offset che riesce a "far stare tutto" in 16 bit se non erro...
  • Re: Istruzione "XLAT" [RISOLTO]

    Che c'entra questo? Hai capito la xlat?
  • Re: Istruzione "XLAT" [RISOLTO]

    Mi sa di aver fatto confusione!
    L'indirizzo ad esempio per il numero "53" è 0? è questo che intendi?
  • Re: Istruzione "XLAT" [RISOLTO]

    L'indirizzo non è importante. Con l'8086 un indirizzo è sempre nel formato segmento:offset e quindi l'indirizzo iniziale della tabella sarà in DS:BX
    Quello che importa è che il valore si ottiene a partire da quell'indirizzo+AL
  • Re: Istruzione "XLAT" [RISOLTO]

    In pratica XLAT è nata per gestire facilmente tabelle di conversione. Ad esempio potresti avere una tabella che preso un numero tra 1 e 26 (o tra 0 e 25) ti restituisce la lettera dell'alfabeto corrispondente.
    In tal caso, prima ti crei un vettore di byte con le lettere (eventualmente inizi con un byte vuoto, se vuoi usare la numerazione a partire da 1), poi ne memorizzi l'offset in BX, dopodiché in AL metti il numero della lettera che vuoi recuperare. Applichi la XLAT e ti ritrovi in AL la lettera desiderata.
    il vantaggio rispetto alla semplice lettura del valore dal vettore è dovuto sia alla brevità della sintassi sia (soprattutto) alla maggiore efficienza, perché xlat usa operatori predefiniti (BX e AL) e non deve capire il modo di indirizzamento che stai usando, ma semplicemente deve sommare i 2 registri e accedere alla memoria con quell'offset.

    L'indirizzo del segmento non ti interessa, tanto la xlat va sempre a cercare nel segmento dati.
  • Re: Istruzione "XLAT" [RISOLTO]

    Grazie per le spiegazioni

    In questi giorni proverò a fare questo esercizio!
  • Re: Istruzione "XLAT" [RISOLTO]

    Allora ho provato a fare il programma di associare a ogni numero da 1 a 26 la rispettiva lettera, ma non funziona correttamente, ovvero se digito 1 o 5 ad esempio mi viene fuori sempre la lettera A e solo andando sui numeri a due cifre inizia a farmi vedere le altre lettere...
    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 "A,B,C,D,E,F,G,H,I,J"
    		DB "K,L,M,N,O,P,Q,R,S,T"
    		DB "U,V,W,X,Y,Z" ;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
    
    MOV AH,01H ;richiesta input di un carattere
    INT 21H ;interrupt che permette di ricevere in input un carattere
    SUB AL,30H ;conversione
    MOV NUM,AL ;salvo il valore digitato 
    
    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
  • Re: Istruzione "XLAT" [RISOLTO]

    Ma le , che c'entrano?

    La tabella deve essere una sequenza di byte

    ABCDEFGH

    e così via ...

    E soprattutto, perché utilizzi la SUB INPUT se hai fatto l'input nel programma?
  • Re: Istruzione "XLAT" [RISOLTO]

    Se scrivo così mi da errore quando compilo con il tasm
    TAB DB ABCDEFGHIJKLMNOPQRSTUVWXYZ
    MI ero dimenticanto di togliere quelle istruzioni perchè successivamente avevo pensato di fare una procedura che si occupasse dell'input essendo anche possibile a più cifre.
  • Re: Istruzione "XLAT" [RISOLTO]

    Ho risolto mettendo la serie di lettere fra singoli apici, ma è sorto un secondo problema...
    Non ho capito come debba fare per lasciare il primo byte vuoto perchè altrimenti associa
    il numero 1 a B e così via...
  • Re: Istruzione "XLAT" [RISOLTO]

    Hai due scelte mi pare ... anche se mi sembrano così ovvie ...

    1) decrementi AL prima della XLAT

    oppure

    2) fai iniziare la tabella con uno spazio
Devi accedere o registrarti per scrivere nel forum
22 risposte