Ciao a tutti.
Mi sto "approcciando" ad Assembly e , dopo aver consultato alcune slides, sto provando un esercizio ma, in fase di esecuzione rileva un errore già alla prima istruzione ( un semplice mov).
Potreste aiutarmi a capire dove sbaglio ?
Traccia:
1. Scrivere un programma Assembly per generare un file .COM nel quale siano dichiarate alla fine del
programma quattro variabili come segue:
• Una variabile di nome A, tipo Word, valore iniziale 1234 (esadecimale);
• Un array B, tipo Byte, valore iniziale [12,34] (esadecimali);
• Un array D, tipo Byte, lunghezza 2, valore iniziale indefinito.
• Una stringa C, valore iniziale ‘ciao’ con tappo ‘$’ finale.
2. Notare la differenza tra le variabili A, B, D e C in fase di esecuzione del programma.
3. Scrivere il codice necessario per copiare il contenuto di A in D, in modo da riportare il byte più
significativo di A nel primo elemento di D.
4. Modificare il byte meno significativo di A ponendolo uguale a zero.
5. Dichiarare una costante di valore 25 (esadecimale) e nome XXV.
6. Memorizzare il valore di XXV nel primo elemento di B.
7. Scrivere le istruzioni necessarie per scambiare i contenuti delle variabili B e D (si possono utilizzare
diverse strategie e diversi tipi di istruzione).
8. Azzerare il contenuto di AL mediante un indirizzamento immediato.
9. Duplicare il contenuto di AL in AH utilizzando un indirizzamento a registro.
10. Caricare in BX l’indirizzo della variabile A.
11. Memorizzare il contenuto di AX nelle locazioni di memoria il cui indirizzo iniziale è specificato in
BX. (Di quale tipo di indirizzamento si tratta?)
12. Scrivere il codice necessario per stampare a video il contenuto della variabile C senza invocare
interrupt. Per farlo occorre impostare:
• per la stampa del primo carattere: il segmento della memoria video (pari a b800h), un offset
all’interno del segmento (per esempio, pari a 15eh);
• per la stampa di ogni successivo carattere: incrementare l’offset di due byte.
La stampa di ogni singolo carattere si ottiene copiando nel segmento della memoria video (all’offset
specificato) il codice ASCII e il codice di colore (per esempio, pari a 01011111) del carattere.
13. Ripetere la stampa a video del contenuto della variabile C utilizzando l’interrupt 21h con sottofunzione
09h.
14. Definire una variabile di nome Stringa, tipo byte, da utilizzarsi per memorizzare 4 caratteri letti
da tastiera (array con primo elemento pari a 5, secondo elemento non inizializzato, seguito da 5
elementi non inizializzati).
15. Leggere da tastiera utilizzando l’interrupt 21h con sottofunzione 0Ah e memorizzare la stringa
digitata (per esempio, ‘ciao’) nella variabile Stringa.
16. Dichiarare una costante di nome TAPPO e valore ‘$’.
17. Utilizzando la costante TAPPO e indirizzando opportunamente la variabile Stringa, effettuare la
stampa a video della stringa digitata da tastiera, tramite l’interrupt 21h con sottofunzione 09h.
Cosa verrebbe stampato a video se non si utilizzasse il tappo e/o se si indicizzasse la variabile
Stringa a partire dal suo primo elemento?
#make_com#
org 100h
mov ax,a
mov bx,d
mov bh,ah
mov d,bx
mov ax,xxv
mov b[0],ax
mov ax,d
mov bx,b
xchg ax,bx
mov b,bx
mov d,ax
mov al,0
lea al,bx
mov ah,[bx]
lea a,bx
mov [bx],ax
mov ah,09h
lea dx,c
int 21h
mov ah,0Ah
lea dx,stringa
int 21h
mov ah,09h
lea dx,stringa
int 21h
mov dx,tappo
int21h
mov al,0
ret
;Specifica variabili
dw a 1234h
db b [12,34]h,dup('')
db d 2,?,2 dup('')
db c 'ciao$'
db stringa 5,?,5 dup('')
xxv equ 25
tappo equ $