Esercizio Assembly

di il
2 risposte

Esercizio Assembly

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 $

2 Risposte

  • Re: Esercizio Assembly

    Scusa, non avro' il tempo di rispondere a tutto.
    Il punto piu' importante: ogni variabile che usi deve essere dichiarata PRIMA nella sezione .data

    Perché usi il .com? Non funzionerà su Windows 64-bit. Se vuoi un consiglio: Vai per 32-bit e masm32.com
  • Re: Esercizio Assembly

    Il make com è una direttiva che il nostro professore ci ha detto di usare, so a malapena a cosa si riferisce.
Devi accedere o registrarti per scrivere nel forum
2 risposte