Programmazione Assembly Note su Microsoft...

254
Programmazione Assembly Note su Microsoft Assembler Giacomo Fiumara [email protected] Anno Accademico 2012-2013 1 / 254

Transcript of Programmazione Assembly Note su Microsoft...

Page 1: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Programmazione AssemblyNote su Microsoft Assembler

Giacomo [email protected]

Anno Accademico 2012-2013

1 / 254

Page 2: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Microsoft Assembler

Masm32.com

installare

configurare path perche contenga la directory bin di Masm32

2 / 254

Page 3: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Microsoft AssemblerStrumenti

Editor di testo (anche Notepad)

emulatore DOS

Assemblatore (ml)

Link a 16 bit (link16)

3 / 254

Page 4: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Microsoft AssemblerDocumentazione

Documentazione Intel

Debugger

K. R. Irvine, Assembly language for Intel-based computers,4th or 5th edition

J. T. Streib, Guide to Assembly Language, Springer

L. B. Das, The x86 Microprocessors, Pearson

4 / 254

Page 5: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Codice Assembly embedded in programmi C

Uno degli elementi di maggiore difficolta dellaprogrammazione Assembly e rappresentata dalla gestionedell’I/O

Per evitare queste difficolta, nei primi tempi, e possibileeffettuare l’embedding di porzioni di codice Assembly inprogrammi C

La compilazione deve essere effettuata tenendo conto dellapresenza di codice Assembly

Per esempio, nel caso di un compilatore gcc (consigliato), ilcomando di compilazione e:

gcc -fasm-blocks nome_programma.c -o nome_programma.x

5 / 254

Page 6: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Codice Assembly embedded in programmi C /2

Si consideri il seguente codice C:

#include stdio.h

int main() {

int num1, num2;

num1 = 5;

num2 = num1;

printf("%s%d\n", "Valore di num2: ", num2);

return 0;

}

6 / 254

Page 7: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Codice Assembly embedded in programmi C /3

Si modifica come segue:

#include stdio.h

int main() {

int num1, num2;

num1 = 5;

__asm{

mov eax, num1

mov num2, eax

}

printf("%s%d\n", "Valore di num2: ", num2);

return 0;

}

7 / 254

Page 8: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

RegistriIntroduzione

Una delle cose piu importanti di un processore e l’insieme deiregistri

Quelli accessibili al programmatore sono detti generalpurpose

Nel caso delle architetture x86 sono presenti, per motivi dicompatibilita, registri a 8, 16, 32 bit

8 / 254

Page 9: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Registri

E la situazione dei registri eax, ebx, ecx, edx

Ognuna della porzioni puo essere considerata un registro veroe proprio

Ognuna delle porzioni puo essere utilizzata indipendentemente(e contemporaneamente) dalle altre

9 / 254

Page 10: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Registri

Registri a 32 bit Nome 16/8 bit Descrizioneeax Accumulator ax, ah, al Arithmetic and Logicebx Base bx, bh, bl Arraysecx Counter cx, ch, cl Loopsedx Data dx, dh, dl Arithmeticsesi Source Index si Strings and arraysedi Destination Index di Strings and arraysesp Stack Pointer sp Top of stackebp Base Pointer bp Base of stackeip Instruction Pointer ip Points to next instructioneflags Flag flag Status and control flag

10 / 254

Page 11: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Registro eflags

Si tratta di un registro particolare, nel senso che ogni singolobit che lo compone puo essere riferito indipendentementedagli altri

Ogni bit controlla un’operazione della CPU o fornisceinformazioni sul risultato dell’operazione

Si tratta comunque di un registro che puo essere acceduto inlettura e scrittura:

In lettura per verificare, come detto, il risultato diun’operazioneIn scrittura per impostare lo stato di un flag del processore

11 / 254

Page 12: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Registro eflags /2

Il registro eflags e un registro a 16 bit

7 bit non sono utilizzati

6 flag condizionali (contengono informazioni sullo stato delleoperazioni della CPU):

Carry Flag (CF)Zero Flag (ZF)Parity Flag (PF)Sign Flag (SF)Auxiliary Carry Flag (AF)Overflow Flag (OF)

3 flag di controllo:

Direction Flag (DF)Interrupt Flag (IF)Trap Flag (TF)

12 / 254

Page 13: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Registro eflags /3Flag condizionali

Carry Flag (CF)Viene settato se si verifica un riporto sul bit piu significativodurante un calcolo. Il riporto puo verificarsi sul bit 7 (operazioni a8 bit) oppure sul bit 15 (operazioni a 16 bit)Zero Flag (ZF)Viene settato quando il risultato di un’operazione logico-aritmeticae zero. Per esempio: quando si decrementa il contenuto di unregistro (di solito il registro CX, che viene usato come contatore),il contenuto del registro sara zero. In quel momento ZF vienesettato. Un altro caso e rappresentato dal confronto tra duenumeri.Parity Flag (PF)Quando questo flag viene settato, si ha un numero pari di bit nelbyte meno significativo del registro destinazione. Non viene moltousato.

13 / 254

Page 14: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Registro eflags /4Flag condizionali /2

Sign Flag (SF)Viene settato se il risultato di un’operazione logico-aritmetica enegativo. Di fatto contiene il MSB (most significant bit) delrisultato, ovvero il bit di segno nelle operazioni aritmetiche consegno.Auxiliary Carry Flag (AF)Identico a CF, salvo il fatto che viene settato quando si produceriporto sul bit 3, cioe quando si produce riporto sui 4 bit menosignificativi.Overflow Flag (OF)Viene settato se:

si produce overflow nel MSB con riporto

si produce overflow senza riporto

14 / 254

Page 15: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Registro eflags /5Flag di controllo

Direction Flag (DF)Controlla la direzione (sx-dx o viceversa) nella manipolazione dellestringhe. Quando e settato, le operazioni che auto-incrementano iregistri sorgente e destinazione (SI e DI) incrementano entrambi iregistri e il flusso dei caratteri che compongono le stringhe avvieneda sinistra verso destra. Quando e posto uguale a zero, il flussoavviene da destra verso sinistra.Interrupt Flag (IF)Quando viene settato da programmi con sufficienti privilegi, gliinterrupt hardware mascherabili possono essere gestiti.Trap Flag (TF)Viene settato per scopi di debug: i programmi vengono eseguitiun’istruzione per volta e si arrestano. Ovviamente, questo consentedi esaminare lo stato dei registri.

15 / 254

Page 16: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Registri di segmentoArchitettura della memoria

Il processore 8086 ha un bus degli indirizzi a 20 bit

Questo significa che la memoria indirizzabile ammonta a220 = 1.048.576 byte

Cioe dall’indirizzo 00000H all’indirizzo fffffH

La memoria e vista come suddivisa in quattro segmenti:

Segmento datiSegmento codiceSegmento stackSegmento extra

16 / 254

Page 17: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Registri di segmento /2

Ognuno dei segmenti e accessibile mediante l’indirizzocontenuto nel corrispondente registro di segmento

Ogni registro memorizza l’indirizzo base (di partenza) delsegmento corrispondente

Considerata la differenza di dimensione (indirizzo a 20 bit,registro a 16), nei registri vengono memorizzati i 16 bit piusignificativi dell’indirizzo

L’indirizzo fisico (a 20 bit) di un dato viene calcolato a partiredall’indirizzo base (contenuto nel registro)

Per esempio, l’indirizzo logico 2222H : 0016H diventa22220H + 0016H = 22236H

Si noti che il registro DS (Data Segment) contiene il valore2222H, e che la quantita 0016H viene detta scostamento(offset)

17 / 254

Page 18: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Registri di segmento /3

Segmento di CodiceIl segmento di codice (Code Segment, CS) e l’area di memoria checontiene soltanto il codice di un programma. L’offset rispetto alsegmento di codice e fornito dall’Instruction Pointer (IP), chepunta sempre all’istruzione successiva. L’indirizzo logico di unaistruzione e pertanto CS:IPSegmento di StackIl segmento di stack (Stack Segment, SS) e l’area di memoria checontiene lo stack. E gestita seconda la logica last-in-first-out. Ilregistro Stack Pointer punta alla cima dello stack. Un indirizzologico 4466H : 0122H significa che il registro SS contiene il valore4466H e che il registro IP 0122H: l’indirizzo fisico si ottiene come44660H + 01220H = 44782H.

18 / 254

Page 19: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Registri di segmento /4

Segmento Dati e Segmento ExtraContengono entrambi dati, ma in alcuni casi particolari (quando sigestiscono stringhe) puo essere necessario gestirli in segmentiseparati. I registri corrispondenti sono DS (Data Segment) e ES(Extra Segment).

19 / 254

Page 20: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Struttura della memoria

20 / 254

Page 21: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Struttura della memoria /2

21 / 254

Page 22: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Mappa della memoria

Disposizione del codice eseguibile e dei dati in memoria:

StackDati non inizializzatiDati del programmaCodice eseguibilePrefisso del segmento del programma (PSP, Program SegmentPrefix

22 / 254

Page 23: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Modelli di memoria

I programmi eseguibili presentano di norma segmenti separatiper i dati, il codice, lo stack

ogni segmento non puo occupare piu di 64kB di memoria

il modello di memoria e il modo in cui un programma indirizzale differenti aree della mappa di memoria

Modello Num. segmenti codice Num. segmenti dati

small 1 1

compact 1 piu di 1

medium piu di 1 1

large piu di 1 piu di 1

23 / 254

Page 24: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

InterruptIntroduzione

Sono il mezzo con cui i circuiti esterni al microprocessorecomunicano il verificarsi di un evento

i microprocessori possono rispondere ad interrupt hardwaree/o software

un dispositivo hardware puo produrre un segnale di interruptche viene elaborato dal PIC (Programmable InterruptController) e da questi trasmesso al processore

gli interrupt software vengono generati mediante la funzioneINT

l’effetto di un interrupt e che il processore arresta la suanormale attivita ed esegue una routine residente in memoria(gestione di interrupt)

al termine, il microprocessore riprende la sua attivita dalpunto in cui l’interrupt l’aveva fermato

24 / 254

Page 25: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

InterruptGestione degli interrupt 8086

La famiglia di processori 80x86 gestisce fino a 256 interruptdifferenti (da 00H fino a FFH), dove H sta per esadecimale

ad ogni interrupt e associata una routine

l’indirizzo di ognuna delle 256 routine e memorizzato in unatabella, detta tabella dei vettori di interrupt

ogni vettore di interrupt occupa 4 byte, quindi l’indirizzo diogni vettore di interrupt puo essere ottenuto moltiplicando per4 il numero dell’interrupt

25 / 254

Page 26: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

InterruptInterrupt software

Quando il processore esegue l’istruzione:

INT 12H

vengono caricati sullo stack i contenuti correnti:

del registro dei flagdel registro del codice (CS)del registro IP (Instruction Pointer)

il controllo viene trasferito alla routine di gestionedell’interrupt, mediante l’indirizzo 48H

il processore esegue la routine di gestione dell’interrupt

la routine termina con l’istruzione IRET, che scarica dallostack i contenuti dei registri della routine interrotta

il controllo viene restituito al programma interrotto

26 / 254

Page 27: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

InterruptInterrupt del DOS

Interrupt Descrizione

20H (32D) Arresto del programma21H (33D) Servizi generali del DOS22H (34D) Indirizzo di terminazione23H (35D) Indirizzo del gestore del Ctrl-C24H (36D) Indirizzo gestore errori critici25H (37D) Lettura disco assoluta26H (38D) Scrittura disco assoluta27H (39D) TSR (Terminate and Stay Resident)28H (20D) Interrupt stato d’attesa DOS2FH (47D) Interrupt Multiplex

27 / 254

Page 28: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

InterruptL’interrupt int21h

Uno degli interrupt piu utilizzati e INT 21H

Nell’elenco alcune funzioni:

Funzione Descrizione

00H (00D) Termina01H (01D) Input di un carattere con eco02H (02D) Output di un carattere05H (05D) Output della stampante08H (08D) Input dalla console senza eco09H (09D) Output di una stringa0FH (15D) Apertura file10H (16D) Chiusura file

28 / 254

Page 29: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

InterruptL’interrupt int21h

Esempio di utilizzo di una delle funzioni dell’interrupt int21h:

mov ah, 1h

int 21h

Nell’esempio:

il valore 1h viene caricato nel registro ah (viene selezionata lafunzione di input carattere con eco)viene invocato l’interruptil carattere digitato da tastiera viene memorizzato nel registroal

29 / 254

Page 30: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Struttura di un programma assembly

.model small

.stack 100h

.data

.code

start:

...

mov ax, 4c00h

int 21h

end start

30 / 254

Page 31: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Esempi di programmazione assembly

; prog1.asm

; stampa il carattere ’a’ a schermo

;

.model small

.stack 100h

.code

start:

mov dl, ’a’

mov ah, 2h

int 21h

mov ax, 4c00h

int 21h

end start

31 / 254

Page 32: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Esempi di programmazione assembly / 2

; legge un carattere da tastiera e lo stampa a video

.model small

.stack 100h

.code

start:

mov ah, 1h

int 21h

mov dl, al

mov ah, 2h

int 21h

mov ax, 4c00h

int 21h

end start

32 / 254

Page 33: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Esempi di programmazione assembly / 3

; legge un carattere da tastiera

; lo stampa a video

; viene visualizzato un prompt

.model small

.stack 100h

.code

start:

mov dl, ’>’

mov ah, 2h

int 21h

mov ah, 1h

int 21h

mov bl, al

mov dl, ’ ’

mov ah, 2h

int 21h

mov dl, bl

mov ah, 2h

int 21h

mov ax, 4c00h

int 21h

end start

33 / 254

Page 34: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Esempi di programmazione assembly / 4

; prog4.asm

; legge un carattere da tastiera

; mostra CR, LF e il carattere inserito

;

.model small

.stack 100h

.code

start:

mov dl, ’>’

mov ah, 2h

int 21h

mov ah, 1h

int 21h

mov bl, al

mov dl, 13d

mov ah, 2h

int 21h

mov dl, 10d

mov ah, 2h

int 21h

mov dl, bl

mov ah, 2h

int 21h

mov ax, 4c00h

int 21h

end start

34 / 254

Page 35: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Esempi di programmazione assembly / 5

; prog5.asm

; visualizza una stringa a video

;

.model small

.stack 100h

.data

stringa db ’Ciao a tutti’, 13, 10, ’\$’

.code

start:

mov ax, @data

mov ds, ax

mov dx, offset stringa

mov ah, 9h

int 21h

mov ax, 4c00h

int 21h

end start

35 / 254

Page 36: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni e Metodi di Indirizzamento

L’architettura 8086 richiede l’esistenza di uno o due operandi

Per esempio uno shift richiede un operando, un’addizione due

Come esempio si consideri l’istruzionemov destination, source

Gli operandi (destination e source) possono esserespecificati nei seguenti modi:

Indirizzamento mediante registriIndirizzamento immediatoIndirizzamento direttoIndirizzamento indiretto mediante registriIndirizzamento relativo mediante registriIndirizzamento indicizzatoIndirizzamento indicizzato relativo

36 / 254

Page 37: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni e Metodi di IndirizzamentoIndirizzamento mediante registri

In questo caso, destination e source sono entrambi registri

Per esempio:

mov al, ah

mov si, ax

mov ax, bl

; errore (un dato a 8 bit viene copiato in un registro a 16 bit)mov bl, ax

; errore (un dato a 16 bit viene copiato in un registro a 8 bit)

37 / 254

Page 38: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni e Metodi di IndirizzamentoIndirizzamento immediato

In questo caso, source e un dato costante

Per esempio:

mov al, 33h

mov cx, 1234h

mov al, ’c’

mov var1, 44

38 / 254

Page 39: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni e Metodi di IndirizzamentoIndirizzamento diretto

In questo caso, destination o source sono indirizzi (offsetrispetto al valore di DS) di memoria

Per esempio:

mov ax, [1234h]

mov [5678h], al

mov var1, al

mov bx, var2

39 / 254

Page 40: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni e Metodi di IndirizzamentoIndirizzamento indiretto mediante registri

In questa modalita di indirizzamento, l’indirizzo di un dato ememorizzato in un registro, che si comporta come se fosse unpuntatore al dato. I registri permessi in questa modalita sonoBX, SI, DI

mov al, [bx]

; il contenuto della locazione il cui indirizzo e

puntato da bx viene copiato in al

mov [si], cl

; il contenuto di cl viene copiato nella locazione il

cui indirizzo e puntato da si

40 / 254

Page 41: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni e Metodi di IndirizzamentoIndirizzamento relativo mediante registri

In questa modalita il registro (quelli permessi sono BX, SI,DI, BP) contiene l’indirizzo di un dato; a questo vieneaggiunto uno scostamento

mov cl, 10[bx]

mov cl, [bx+10]

mov cl, [bx]10

41 / 254

Page 42: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni e Metodi di IndirizzamentoIndirizzamento indicizzato

In questa modalita l’indirizzo del dato viene ottenutosommando il contenuto di due registri: un registro base e unregistro indice

mov al, [bx][si]

mov [bx][di], cx

42 / 254

Page 43: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni e Metodi di IndirizzamentoIndirizzamento indicizzato relativo

In questa modalita l’indirizzo del dato viene ottenutosommando il contenuto di due registri ed uno scostamento

mov dl, 5[bx][di]

mov 5[bp][si], ax

43 / 254

Page 44: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni e Metodi di IndirizzamentoEsempio - Indirizzamento relativo mediante registri

.model small

.data

array db 10h, 20h, 30h, 40h, 50h

.code

start:

mov di, 0

mov al, array[di]

add al, 07h

add di, 05h

mov array[di], al

mov ax, 4c00h

int 21h

end start

44 / 254

Page 45: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni e Metodi di IndirizzamentoEsempio - Indirizzamento indicizzato

.model small

.data

array db 34h, 87h, 56h, 05h, 07h

.code

start:

mov bx, offset array

mov di, 0

mov al, [bx + di]

add al, 35h

mov di, 05

mov [bx + di], al

mov ax, 4c00h

int 21h

end start

45 / 254

Page 46: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Tipi di dati

Gli operandi numerici possono essere espressi in notazionedecimale, binaria, esadecimale e ottale

la convenzione utilizzata dall’assemblatore e che un operandoviene espresso in base 10 a meno che non sia presente unsuffisso che indichi il contrario

i suffissi utilizzabili sono:

H (hexadecimal)D (decimal)B (binary)O o Q (octal)nessuno (decimale)

46 / 254

Page 47: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Tipi di dati /2

Tipo Descrizione

BYTE Intero senza segno a 8 bitSBYTE Intero con segno a 8 bitWORD Intero senza segno a 16 bitSWORD Intero con segno a 16 bitDWORD Intero senza segno a 32 bitSDWORD Intero con segno a 32 bitFWORD Intero a 48 bitQWORD Intero a 64 bitTBYTE Intero a 80 bitREAL4 Reale a 32 bitREAL8 Reale a 64 bit (long)REAL10 Reale a 80 bit (extended)

47 / 254

Page 48: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Tipi di dati /3

La direttiva BYTE riserva uno o piu byte per lamemorizzazione di dati.

La direttiva:

numero BYTE 01100101b

riserva un byte di memoria e lo inizializza al valore 65H

a tutti gli effetti pratici, sono assolutamente equivalenti leseguenti direttive:

numero BYTE 01100101b

numero BYTE 65h

numero BYTE 101

numero BYTE 145q

48 / 254

Page 49: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Tipi di dati /4

Analogamente, le direttive WORD e DWORD permettono diriservare una o due parole di memoria

tenendo conto del segno del numero che si vuole memorizzare;si puo avere:

WORD da -32.768 a 32.767

oppure

WORD da 0 a 65.535

DWORD da -2.147.483.648 a 2.147.483.647

oppure

DWORD da 0 a 4.294.967.295

49 / 254

Page 50: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Tipi di dati /5Esempio

Ad esempio:

var1 WORD -1

var2 WORD 0

var3 WORD 32767

var4 WORD 65535

var5 WORD -32768

dvar1 DWORD 0

dvar2 DWORD -1

dvar3 DWORD 4294967295

dvar4 DWORD -2147483648

dvar3 DWORD 4294967266

50 / 254

Page 51: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Tipi di dati /6BYTE

La direttiva BYTE permette di definire operandi sotto forma dicaratteri o di stringhe di caratteri

caratteri e stringhe devono essere racchiusi tra apici (semplicio doppi)

char1 BYTE ’g’

char2 BYTE "g"

str1 BYTE ’ciccio’

str2 BYTE "ciccio’s"

51 / 254

Page 52: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Tipi di dati /7Assegnazioni multiple

Le costanti permettono le assegnazioni multiple

L’etichetta si riferisce soltanto all’offset del primo byte

Per esempio:

lista BYTE 10, 20, 30, 40

Offset Valore

0000 100001 200002 300003 40

52 / 254

Page 53: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Tipi di dati /8Operatore DUP

L’operatore DUP produce un’allocazione ripetuta, mediantel’utilizzo di un’espressione costante come contatore

E particolarmente utile quando si alloca spazio per array ostringhe, e puo essere impiegato per la definizione di datiinizializzati o meno

Per esempio:

BYTE 20 DUP(0)

; 20 byte, tutti inizializzati a zero

BYTE 20 DUP(?)

; 20 byte, non inizializzati

mioarray DWORD 100 DUP(101)

; 100 elementi DWORD, inizializzati a 101

53 / 254

Page 54: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Tipi di dati /9Esempio di utilizzo di DUP

; prog9.asm

; utilizzo di DUP

.model small

.stack 100h

.data

ostr db 50 dup(’*’)

.code

start:

mov ax, @data

mov ds, ax

mov dx, offset ostr

call puts

mov ax, 4c00h

int 21h

;;;;;;;;;;;;;;;;;;

; subroutine puts

puts:

mov ah, 9h

int 21h

ret

end start

54 / 254

Page 55: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Istruzione mov

Copia dati da un operando sorgente ad un operandodestinazione

bisogna rispettare le seguenti regole:

gli operandi devono avere la stessa dimensionegli operandi non possono essere entrambi locazioni di memoriai registri CS, EIP e IP non possono essere operandi destinazioneun valore immediato non puo essere spostato in un registro disegmento

Le possibilita sono:

MOV reg, regMOV mem, regMOV reg, memMOV mem, immMOV reg, imm

55 / 254

Page 56: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Istruzione xchg

Scambia il contenuto di due operandi

Le possibilita sono:

xchg reg, regxchg reg, memxchg mem, reg

Per esempio:

xchg ax, bx

xchg ah, al

xchg var1, bx

56 / 254

Page 57: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operandi con offset diretto

E’ possibile aggiungere un offset ad una variabile

questo permette di raggiungere locazioni di memoria prive dietichette esplicite

Per esempio:

vettore byte 10h, 20h, 30h, 40h, 50h

...

mov al, vettore ; al = 10

mov al, [vettore+1] ; al = 20

mov al, [vettore+2] ; al = 30

57 / 254

Page 58: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operandi con offset diretto /2

Lo scostamento dipende dalla dimensione della locazione dimemoria

Per esempio:

.data

vettore word 100h, 200h, 300h

.code

mov ax, vettore ; ax = 100

mov ax, [vettore+2] ; ax = 200

ogni elemento dell’array occupa 16 bit, e quindi l’offset deveessere di 2 per raggiungere il secondo elemento dell’array

58 / 254

Page 59: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Incremento e decremento

Permettono (rispettivamente) di incrementare e decrementaredi 1 un singolo operando

La sintassi:

inc reg/memdec reg/mem

Per esempio:

.data

var word 1000h

.code

inc var ; var = 1001h

mov bx, var

dec bx ; bx = 1000h

59 / 254

Page 60: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Addizione e sottrazione

Permettono di addizionare (sottrarre) l’operando sorgente all’(dall’)operando destinazioneLa sintassi:

add dest/sourcesub dest/source

Per esempio:

.data

var1 word 2000h

var2 word 1000h

.code

mov ax, var1

add ax, var2

...

mov ax, var1

sub ax, var2

60 / 254

Page 61: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Istruzione NEG

Inverte il segno di un numero mediante complemento a due

Sono permessi gli operandi:

NEG regNEG mem

61 / 254

Page 62: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Implementazione di istruzioni matematicheSi supponga di dover implementare l’espressione:Res = −X + (Y − Z )

res sword ?

x sword 25

y sword 30

z sword 40

; primo termine (-x)

mov ax, x

neg ax

; secondo termine (y - z)

mov bx, y

sub bx, z

; addizione e memorizzazione

add ax, bx

mov res, ax

62 / 254

Page 63: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatori

MASM presenta una serie di operatori utili per descrivere eindirizzare variabili:

offset, restituisce la distanza di una variabile dall’inizio delsegmento di appartenenzaptr, permette di modificare la dimensione di default di unavariabiletype, restituisce la dimensione in byte di ogni elemento di unarraylengthof, restituisce il numero di elementi di un arraysizeof, restituisce il numero di byte usati per inizializzare unarray

63 / 254

Page 64: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatore offset

L’operatore offset restituisce l’offset di una variabile, cioe ladistanza in byte della variabile dall’inizio del segmento dati

in modalita protetta un offset e sempre di 32 bit

in modalita reale un offset e sempre di 16 bit

Per esempio:

.data

bvar byte ?

wvar word ?

dvar1 dword ?

dvar2 dword ?

.code

mov si, offset bvar ; si = 4000

mov si, offset wvar ; si = 4001

mov si, offset dvar1 ; si = 4003

mov si, offset dvar2 ; si = 4007

64 / 254

Page 65: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatore ptr

Permette di modificare la dimensione di default di unoperando

E necessario quando si tenta di accedere alla variabileutilizzando un attributo di dimensione differente da quelloutilizzato per la dichiarazione della variabile

esempio: spostare i 16 bit meno significativi di una variabileDWORD in un registro (a 16 bit)

Per esempio:

.data

var dword 12345678h

.code

mov ax, var ; SBAGLIATO

mov ax, word ptr var ; ax = 5678h

mov ax, byte ptr var ; ax = 78h

mov ax, word ptr [var + 2] ; ax = 1234h

65 / 254

Page 66: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatore type

Restituisce la dimensione in byte di un singolo elemento diuna variabile

Per esempio:

.data

var1 byte ? ; type = 1

var2 word ? ; type = 2

var3 dword ? ; type = 4

66 / 254

Page 67: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatore lengthof

Conta il numero di elementi di un array definiti in base aivalori che appaiono nella linea della label

Per esempio:

.data

byte1 byte 10, 20, 30 ; lengthof = 3

vec1 word 30 dup(?),0,0 ; lengthof = 32

vec2 word 5 dup(3 dup(?)) ; lengthof = 5*3

vec3 dword 1, 2, 3, 4 ; lengthof = 4

str1 byte "12345678",’\$’ ; lengthof = 9

67 / 254

Page 68: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatore sizeof

Restituisce un valore uguale al prodotto di lengthof per type

Per esempio:

vec word 32 dup(0) ; sizeof = 64

68 / 254

Page 69: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure

; prog7.asm

; conversione M/m

.model small

.stack 100h

.data

istr db ’Carattere M: $’

ostr db ’Carattere m: $’

.code

; subroutine getc

getc proc

mov ah, 1h

int 21h

ret

getc endp

; subroutint putc

putc proc

mov ah, 2h

int 21h

ret

putc endp

; subroutine puts

puts proc

mov ah, 9h

int 21h

ret

puts endp

69 / 254

Page 70: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure /2

; subroutine put1310

put1310 proc

mov dl, 13d

mov ah, 2h

int 21h

mov dl, 10d

mov ah, 2h

int 21h

ret

put1310 endp

main proc

mov ax, @data

mov ds, ax

mov dx, offset istr

invoke puts

call getc

mov bl, al

add bl, 32d

call put1310

mov dx, offset ostr

call puts

mov dl, bl

call putc

mov ax, 4c00h

int 21h

main endp

end main

70 / 254

Page 71: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure /3Programmazione modulare

; modules2.asm

; conversione M/m

; programmazione modulare,

; le procedure si trovano

; nel file procs.asm

.model small

.stack 100h

.data

istr db ’Carattere M: $’

ostr db ’Carattere m: $’

.code

getc proto

putc proto

puts proto

put1310 proto

main proc

mov ax, @data

mov ds, ax

mov dx, offset istr

invoke puts

invoke getc

mov bl, al

add bl, 32d

invoke put1310

mov dx, offset ostr

invoke puts

mov dl, bl

invoke putc

mov ax, 4c00h

int 21h

main endp

end main71 / 254

Page 72: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure /4Programmazione modulare - file procedure

.model small

.code

; subroutine getc

getc proc

mov ah, 1h

int 21h

ret

getc endp

; subroutint putc

putc proc

mov ah, 2h

int 21h

ret

putc endp

. . .

; subroutine puts

puts proc

mov ah, 9h

int 21h

ret

puts endp

; subroutine put1310

put1310 proc

mov dl, 13d

mov ah, 2h

int 21h

mov dl, 10d

mov ah, 2h

int 21h

ret

put1310 endp

end 72 / 254

Page 73: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure /5Programmazione modulare - compilazione

C:\masm32\progs>ml /c modules2.asm procs.asm

C:\masm32\progs>link16 modules2.obj procsobj ,,,,,

C:\masm32\progs>modules2

Carattere M: F

Carattere m: f

73 / 254

Page 74: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Debug

debug.exe e un programma per il debug, la verifica e il test diprogrammi

Sintassi: debug nome-programma.exe

al prompt (-) digitare ? per ottenere un elenco dei comandidisponibili

74 / 254

Page 75: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Debug /2

75 / 254

Page 76: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Debug /3Comando g (go)

digitando g viene effettuata l’esecuzione del programmanell’ambiente di debug

76 / 254

Page 77: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Debug /4Comando r (registers)

serve a visualizzare lo stato dei registri

77 / 254

Page 78: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Debug /5Comando t (trace)

permette di eseguire l’istruzione correntemolto utile, perche mostra lo stato dei registri ad ogniistruzione

78 / 254

Page 79: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Debug /6Comando u (unassemble)

traduce in assembly i byte contenutidopo la conclusione del codice sorgente, il comando u

continua ...... disassemblando tutto quello che incontra (quasi sempresenza senso)

79 / 254

Page 80: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Debug /7Comando p (proceed)

esegue una procedura (call o int) per intero

senza entrare nei dettagli delle istruzioni della procedura

si usa in alternanza al comando t

80 / 254

Page 81: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Debug /8Comando d (dump)

mostra il contenuto della memoria

quando un eseguibile e caricato dal debug mostra la mappa dimemoria

81 / 254

Page 82: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Debug /9Esempio di utilizzo

Visualizzare lo stato dei registri mediante il comando trace didebug

.model small

.stack 100h

.data

.code

start:

mov ax, 11h

add ax, 22h

sub ax, 30h

mov ax, 4c00h

int 21h

end start

82 / 254

Page 83: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Indirizzamento indiretto

L’indirizzamento diretto non pratico per operazioni sugli array

richiede infatti di fornire un nome (label) per ogni elementodell’array

la soluzione consiste nell’utilizzare un registro come puntatore

e modificare il valore del registro

questa tecnica si chiama indirizzamento indiretto

il registro che memorizza un indirizzo viene detto operandoindiretto

83 / 254

Page 84: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operandi indiretti

Un operando indiretto pu essere qualsiasi registrogeneral-purpose (bx, si, di, bp)

viene utilizzato racchiudendolo tra parentesi quadre (peresempio, [ax ])

.data

var1 byte 10h

.code

start:

mov si, offset var1

mov al, [si]

end start

84 / 254

Page 85: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operandi indiretti (modalit protetta, a 32 bit)

In modalit protetta si possono utilizzare pcome operandiindiretti i registri a 32 bit:

eax, ebx, ecx, edx, esi, edi, ebp, esp

se l’indirizzo punta ad un’area esterna al segmento dati delprogramma si genera un general protection (GP) fault

un GP fault si pu verificare anche senza che si intendamodificare la memoria indirizzata

il modo migliore per evitare questo tipo di errori consistenell’inizializzare i registri da impiegare per l’indirizzamentoindiretto

i GP fault non si verificano in modalit reale (16 bit)

85 / 254

Page 86: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Utilizzo di ptr con gli operandi indiretti

La dimensione di un operando non sempre chiara dal contesto

Per esempio:

inc [si]

; errore: l’operando deve essere dimensionato

inc ptr byte [si]

; corretto: si chiarisce il puntamento ad un byte

86 / 254

Page 87: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

ArrayGli operandi indiretti sono particolarmente utili quando sigestiscono array, perch il valore di un operando indiretto puessere modificato facilmentein modo analogo all’indice di un array, un operando indirettopu puntare ai diversi elementi di un arrayPer esempio:

.data

vettore byte 10h, 20h, 30h

.code

mov ax, @data

mov ds, ax

mov si, offset vettore

mov al, [si] ; al = 10h

inc si

mov al, [si] ; al = 20h

inc si

mov al, [si] ; al = 30h 87 / 254

Page 88: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Array /2

Quando si gestisce un array di interi a 16 bit (word), bisognaincrementare il registro si di 2 per indirizzare i successivielementi

Per esempio:

.data

vettore word 1000h, 2000h, 3000h

.code

mov si, offset vettore

mov ax, [si] ; ax = 1000h

add si, 2

mov ax, [si] ; ax = 2000h

add si, 2

mov ax, [si] ; ax = 3000h

88 / 254

Page 89: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Array /3

Quando si gestisce un array di interi a 32 bit (dword), bisognaincrementare il registro si di 4

Per esempio:

.data

vettore dword 10000h, 20000h, 30000h

.code

mov si, offset vettore

mov ax, [si] ; ax = 10000h

add si, 4

mov ax, [si] ; ax = 20000h

add si, 4

add ax, [si] ; ax = 30000h

89 / 254

Page 90: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operandi indicizzati

Un operando indicizzato aggiunge una costante ad un registroper produrre un indirizzo

in modalit protetta qualsiasi registro a 32 bit pu essereutilizzato come registro indice

in modalit reale soltanto i registri si, di, bx o bp possonoessere utilizzati come registri indice

MASM permette due notazioni:

cost[reg ][cost + reg ]

90 / 254

Page 91: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operandi indicizzati /2

E’ buona consuetudine inizializzare a zero il registro indice

.data

bvec byte 10h, 20h, 30h

.code

mov si, 0

mov al, [bvec + si] ; al = 10h

91 / 254

Page 92: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operandi indicizzati /3

.data

wvec word 1000h, 2000h, 3000h

.code

mov si, offset wvec

mov ax, [si] ; ax = 1000h

mov ax, [si + 2] ; ax = 2000h

mov ax, [si + 4] ; ax = 3000h

92 / 254

Page 93: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Puntatori

Una variabile che contiene l’indirizzo di un’altra variabile dettavariabile puntatore

i puntatori sono essenziali quando si elaborano array estrutture dati

MASM prevede l’utilizzo di due tipi di puntatori

near (16 bit in modalit reale, 32 bit in modalit protetta)far (32 bit in modalit reale, 48 bit in modalit protetta)

93 / 254

Page 94: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Puntatori /2

bvec byte 10h, 20h, 30h, 40h

wvec word 1000h, 2000h, 3000h

ptrb dword bvec

ptrw dword wvec

In alternativa:

ptrb dword offset bvec

ptrw dword offset wvec

94 / 254

Page 95: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

PuntatoriDefinizione mediante typedef

L’operatore typedef permette di creare un tipo di variabile

pu essere utilizzato per creare puntatori

Per esempio:

pbyte typedef ptr byte

Per esempio:

pbyte typedef ptr byte

.data

bvec byte 10h, 20h, 30h, 40h

ptr1 pbyte ? ; non inizializzato

ptr2 pbyte bvec ; punta all’array bvec

95 / 254

Page 96: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

JMP e LOOP

Un trasferimento di controllo, o branch un modo di alterarel’ordine in cui le istruzioni vengono eseguite

tutti i linguaggi di programmazione presentano istruzioni dibranching

possibile suddividere queste istruzioni in:

trasferimenti incondizionati, per esempio mediantel’istruzione JMPtrasferimenti condizionati, in cui la ramificazione si verificasoltanto se una certa condizione vera. Per esempio, l’istruzioneLOOP

96 / 254

Page 97: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Istruzione jmp

Provoca un trasferimento incondizionato ad una locazioneinterna al segmento di codice

la locazione destinazione deve essere identificata medianteun’etichetta

la sintassi :

jmp etichetta

L’istruzione jmp pu essere impiegata per realizzare un loop

top:

...

...

jmp top ; attenzione si genera un loop infinito

97 / 254

Page 98: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Istruzione loop

Fornisce un modo semplice per ripetere l’esecuzione di unblocco di istruzioni per un numero specificato di volte

il registro cx viene automaticamente utilizzato comecontatore e viene decrementato ogni volta che il ciclo si ripete

la sintassi :

loop destinazione

Per esempio:

mov ax, 0

mov cx, 5

L1:

inc ax

loop L1

98 / 254

Page 99: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Istruzione loopAvvertenze

bisogna evitare di inizializzare il registro cx a zero prima diavviare il loop. Se questo avvenisse, l’istruzione loop

incrementerebbe cx a ffff e itererebbe 65536 volte

la destinazione del ciclo deve trovarsi nell’intervallo da -128 a+127 rispetto al contatore locale; le istruzioni macchinahanno una dimensione media di 3 byte, quindi un loop pucontenere circa 40 istruzioni

una modifica del valore di cx all’interno del loop puo avereeffetti indesiderati

99 / 254

Page 100: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

.model small

.stack 100h

.data

str1 byte "Stringa da copiare","0"

str2 byte sizeof str1 dup(0)

.code

start:

mov si, 0

mov cx, sizeof str1

L1:

mov al, str1[si]

mov str2[si], al

inc si

loop L1

mov ax, 4c00h

int 21h

end start

100 / 254

Page 101: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Gestione della memoriaIntroduzione

I processori IA-32 (Intel Architecture 32 bit, dal 386 in poi)presentano tre modalita fondamentali:

protetta8086 virtuale (un caso particolare di modalita protetta)real-addresssystem management

101 / 254

Page 102: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Gestione della memoria /2Modalita protetta

Si tratta della modalita di esecuzione nativa del processore,nel quale tutte le istruzioni e le possibilita sono consentite

Ai programmi vengono assegnate aree di memoria (segmenti)

Il processore individua ogni tentativo di accedere ad aree dimemoria esterne al segmento assegnato

Il processore puo accedere a 4 GB di memoria (i registrivengono considerati tutti a 32 bit)

102 / 254

Page 103: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Gestione della memoria /3Modalita 8086 virtuale

Si tratta di un caso particolare della modalita protetta

Il processore si comporta come un 8086, ma in un ambientemultitasking

Per esempio, un crash non influenza negativamente altriprogrammi e/o il sistema

103 / 254

Page 104: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Gestione della memoria /4Modalita real-address

Nota anche come modalita reale

Questa modalita implementa l’ambiente di programmazionedel processore Intel 8086 con alcuni elementi ulteriori

Tra questi la possibilita di commutare alle altre due modalita

Questa modalita e stata introdotta in Windows 98

Si tratta della modalita di avvio di tutti i processori Intel

In questa modalita soltanto 1 MB di memoria e accessibile aiprogrammi (20 bit, da 00000 a FFFFF)

104 / 254

Page 105: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Gestione della memoria /5Modalita system management

Fornisce al sistema operativo un meccanismo perimplementare alcune funzionalita come il power managemente la sicurezza di sistema

105 / 254

Page 106: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni sullo stackIntroduzione

Come si ricordera, lo stack e una struttura LIFO (Last In FirstOut)

cioe, l’ultimo valore inserito e sempre il primo ad essereestratto

il runtime stack e un array di memoria gestita direttamentedalla CPU mediante due registri: SS e SP

il registro SS indica l’indirizzo iniziale del segmento dimemoria dedicato allo stack

il registro SP contiene un offset a 16 bit relativo a qualchelocazione dello stack

il registro SP viene manipolato raramente, viene inveceesplicitamente modificato da istruzioni come CALL, RET, PUSHe POP

il registro StackPointer SP punta all’ultimo intero inseritonello stack

106 / 254

Page 107: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni sullo stackPush

Un’operazione di push decrementa lo stack pointer di 4 (2 inmodalita reale) e copia un valore nella locazione dello stackpuntata dallo stack pointer

107 / 254

Page 108: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni sullo stackPop

Un’operazione di pop incrementa lo stack pointer di 4 (2 inmodalita reale) e rimuove un valore nella locazione dello stackpuntata dallo stack pointer

108 / 254

Page 109: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni sullo stackUtilita

Lo stack viene utilizzato nei programmi per:

creare un’area temporanea per i registri quando questivengono utilizzati per qualche scopo

salvare l’indirizzo di ritorno della procedura corrente almomento dell’invocazione dell’istruzione call

contenere gli argomenti (eventualmente) passati comeparametri ad una procedura al momento della sua esecuzione

memorizzare le variabili locali di una procedura

109 / 254

Page 110: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni sullo stackIstruzione push

L’istruzione push decrementa SP e copia un operandosorgente da 16 o 32 bit nello stack

un operando a 16 bit implica un decremento di SP di 2, unoperando a 32 bit un decremento di 4

Attenzione: il push di un operando immediato e statointrodotto a partire dalle architetture 80286

push r/m16

push r/m32

push imm32 (imm16 in real mode)

110 / 254

Page 111: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni sullo stackIstruzione pop

L’istruzione pop prima copia il contenuto dell’elemento dellostack puntato da SP in un operando destinazione a 32 o 16bit e successivamente incrementa SP

se l’operando e a 16 bit, SP viene incrementato di 2, sel’operando e a 32 bit l’incremento di 4

pop r/m16

pop r/m32

111 / 254

Page 112: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni sullo stackIstruzioni pushfd e popfd (pushf e popf)

L’istruzione pushfd scrive il registro a 32 bit EFLAGS sullostack

popfd scrive su EFLAGS il contenuto prelevato dallo stack

modalita reale: pushf per il push del registro (a 16 bit)FLAGS sullo stack

modalita reale: popf per il pop nel registro (a 16 bit)FLAGS dallo stack

pushf ; pushfd in modalit\‘a protetta

;

; codice ...

;

popf ; popfd in modalit\‘a protetta

112 / 254

Page 113: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni sullo stackIstruzioni pushad e popad (pusha e popa)

L’istruzione pushad effettua il push sullo stack di tutti iregistri a 32 bit general-purpose

l’ordine nel quale viene effettuato: EAX, ECX, EDX, EBX,ESP, EBP, ESI e EDI

Analogamente, l’istruzione popad ripristina lo stato dei registri

modalita reale: l’istruzione pusha effettua il push di AX,CX, DX, BX, SP, BP, SI e DI

modalita reale: l’istruzione popa ripristina i predetti registri

Attenzione: il push di un operando immediato e statointrodotto a partire dalle architetture 80286

113 / 254

Page 114: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni sullo stackEsempio: inversione di una stringa (stringa.asm)

.model small

.stack 100h

.data

str1 byte "ciao","$"

str2 byte sizeof str1 dup(0)

.code

start:

mov ax, @data

mov ds, ax

mov si, 0

mov cx, sizeof str1

dec cx

L1: mov al, str1[si]

push ax

inc si

loop L1

114 / 254

Page 115: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operazioni sullo stackEsempio: inversione di una stringa (stringa.asm) / 2

mov cx, sizeof str1

dec cx

mov si, 0

L2: pop ax

mov str2[si], al

inc si

loop L2

mov al, "$"

inc si

mov str2[si], al

mov dx, offset str2

mov ah, 9h

int 21h

mov ax, 4c00h

int 21h

end start

115 / 254

Page 116: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIntroduzione

Le condizioni che permettono di modificare il flusso delleistruzioni Assembly operano in base al valore di alcuni bit delregistro FLAGS

In particolare vengono settati i flag (bit):

Zero: quando il risultato di un’operazione e uguale a zeroCarry: quando un’istruzione genera un riportoSegno: copia del bit piu significativo dell’operandodestinazioneOverflow: quando un’istruzione genera un risultato conoverflowParita: quando un’istruzione produce un numero pari di bit 1nel byte meno significativo dell’operando destinazione

116 / 254

Page 117: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione AND

Effettua un AND booleano (bitwise, bit a bit) tra i bit diuguale posto di due operandi

il risultato viene memorizzato nell’operando destinazione

AND destinazione, sorgente

Le combinazioni permesse di operandi sono:

AND reg, reg

AND reg, mem

AND reg, imm

AND mem, reg

AND mem, imm

117 / 254

Page 118: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione AND / 2

I due operandi possono essere a 8, 16 o 32 bit, ma devonoessere della stessa dimensione

AND viene spesso utilizzato per eliminare determinati bit esalvarne altri

Per esempio:

00111011

AND 00001111

----------------

00001011

mov al, 00111011b

and al, 00001111b

Flags: vengono resettati i bit di Overflow e Carry, modificati ibit di Segno, Zero e Parita

118 / 254

Page 119: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione AND / 3

Mediante l’istruzione AND e possibile convertire facilmente unalettera minuscola in maiuscola

si osservino i codici ASCII di A e a

soltanto il bit 5 e differente:

0 1 1 0 0 0 0 1 = 61h (’a’)

0 1 0 0 0 0 0 1 = 41h (’A’)

La regola vale per le altre lettere dell’alfabeto

ponendo in AND una lettera minuscola con 11011111, tutti ibit saranno preservati ad eccezione del bit 5

119 / 254

Page 120: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione AND - Esempio

; prog09.asm

.model small

.stack 100h

.code

start:

mov al, 01100001b

and al, 11011111b

mov dl, al

mov ah, 2h

int 21h

mov ax, 4c00h

int 21h

end start

120 / 254

Page 121: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione OR

L’istruzione OR effettua un OR booleano tra ogni coppia di bit(di posto uguale) di due operandi

il risultato viene posto nell’operando destinazione

OR destinazione, sorgente

L’istruzione OR utilizza le stesse combinazioni di operandidell’AND:

OR reg, reg

OR reg, mem

OR reg, imm

OR mem, reg

OR mem, imm

121 / 254

Page 122: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione OR / 2

I due operandi possono essere a 8, 16 o 32 bit, ma devonoessere della stessa dimensione

OR viene spesso utilizzato per settare alcuni bit e preservarnealtri

Per esempio:

00111011

OR 00001111

-------------

00111111

Flags: vengono resettati i bit di Overflow e Carry, modificati ibit di Segno, Zero e Parita

122 / 254

Page 123: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione OR / 3

L’istruzione OR viene utilizzata per convertire un bytecontenente un intero compreso tra 0 e 9 nel carattere ASCIIcorrispondente

a tale scopo necessario settare i bit 4 e 5

per esempio, 05h in OR con 30h diventa il carattere ASCII 35h

0 0 0 0 0 1 0 1 05h

OR 0 0 1 1 0 0 0 0 30h

--------------------

0 0 1 1 0 1 0 1 35h

mov dl, 5

or dl, 30h

123 / 254

Page 124: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione OR - Esempio

; prog10.asm

.model small

.stack 100h

.code

start:

mov al, 00000101b

or al, 00110000b

mov dl, al

mov ah, 2h

int 21h

mov ax, 4c00h

int 21h

end start

124 / 254

Page 125: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione XOR

L’istruzione XOR effettua un OR booleano esclusivo tra ognicoppia di bit (di posto uguale) di due operandi

il risultato viene posto nell’operando destinazione

XOR destinazione, sorgente

L’istruzione XOR utilizza le stesse combinazioni di operandidell’AND:

XOR reg, reg

XOR reg, mem

XOR reg, imm

XOR mem, reg

XOR mem, imm

125 / 254

Page 126: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione XOR / 2

Ricordando la tabella di verita di XOR si puo vedere chequalsiasi bit in XOR con 0 mantiene il suo valore, mentre inXOR con 1 viene complementato

Una caratteristica di XOR e che si annulla quando vieneapplicato due volte allo stesso operando

Infatti

x y (x XOR y) (x XOR y) XOR y

0 0 0 0

0 1 1 0

1 0 1 1

1 1 0 1

Questo lo rende uno strumento ideale per le operazioni dicifratura/decifratura di dati.

126 / 254

Page 127: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione XOR / 3

XOR viene utilizzato per controllare la parita (pari o dispari) diun numero

Infatti:

mov al, 10110101b ; 5 bit = parita’ dispari

xor al, 0 ; flag di parita’ azzerato (PO)

mov al, 11001100b ; 4 bit = parita’ pari

xor al, 0 ; flag di parita’ settato (PE)

Flags: l’istruzione XOR resetta sempre i bit di Overflow eCarry. Modifica i bit di Segno, Zero e Parita in base al valoredell’operando destinazione.

127 / 254

Page 128: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione XOR - Esempio

; prog11.asm

.model small

.stack 100h

.code

start:

mov al, 10110101b

xor al, 0

mov al, 11001100b

xor al, 0

mov ax, 4c00h

int 21h

end start

128 / 254

Page 129: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione NOT

L’istruzione NOT complementa tutti i bit di un operando

Il risultato e chiamato complemento a 1.

Sono permessi i seguenti tipi di operandi:

NOT reg

NOT mem

mov al, 11110000b

not al ; al = 00001111b

129 / 254

Page 130: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione TEST

L’istruzione TEST effettua un AND implicito tra ogni coppia dibit (di uguale posto) di due operandi e setta i flag diconseguenza

A differenza di AND, l’operando destinazione non vienemodificato

Le combinazioni permesse sono uguali a quelle di AND

TEST e utile quando si vuole verificare se determinati bit sonosettati.

test al, 00001001b ; test dello stato dei bit 0 e 3 di AL

130 / 254

Page 131: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione TEST / 2

Per comprendere il comportamento del flag Zero si consideri ilseguente esempio:

0 0 1 0 0 1 0 1 valore da verificare

0 0 0 0 1 0 0 1 valore di test

0 0 0 0 0 0 0 1 ZF = 0

0 0 1 0 0 1 0 0 valore da verificare

0 0 0 0 1 0 0 1 valore di test

0 0 0 0 0 0 0 0 ZF = 1

131 / 254

Page 132: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione cmp

L’istruzione cmp (compare) effettua una sottrazione implicitadi un operando sorgente da un operando destinazione

Nessuno dei due operandi viene modificato.

L’istruzione cmp e fondamentale perche fornisce le basi per lamaggior parte delle strutture logiche.

L’istruzione cmp seguita da un’istruzione di salto condizionatoe equivalente ad un IF.

La sintassi e:

cmp destinazione, sorgente

132 / 254

Page 133: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione cmp / 2

L’istruzione cmp modifica i flag di Overflow, Segno, Zero,Carry, Auxiliary Carry e Parita in base al valore che l’operandodestinazione avrebbe se venisse utilizzata l’istruzione sub:

Risultato di cmp ZF CF

dest < sorgente 0 1

dest > sorgente 0 0

dest = sorgente 1 0

Se i due operandi sono considerati con segno, i flag Segno,Zero e Overflow indicano le seguenti relazioni tra gli operandi:

Risultato di cmp Flag

dest < sorgente SF != OF

dest > sorgente SF = OF

dest = sorgente ZF = 1

133 / 254

Page 134: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione cmp / 3

mov ax, 5

cmp ax, 10 ; CF = 1 (10 - 5 richiede il "prestito")

mov ax, 1000

mov cx, 1000

cmp ax, cx ; ZF = 1

mov si, 105

cmp si, 0 ; ZF = 0 e CF = 0

134 / 254

Page 135: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione cmp - Esempio

; prog12.asm

.model small

.stack 100h

.code

start:

mov ax, 5

cmp ax, 10

mov ax, 1000

mov cx, 1000

cmp ax, cx

mov si, 105

cmp si, 0

mov ax, 4c00h

int 21h

end start

135 / 254

Page 136: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataOperazioni sui singoli flag

Le operazioni sui singoli flag sono di set e reset. Per esempio:

and al, 0 ; ZF = 1

or al, 1 ; ZF = 0

or al, 80h ; SF = 1

and al, 7fh ; SF = 0

stc ; set carry flag

clc ; clear carry flag

mov al, 7fh ; al = +127

inc al ; al = -128 OF = 1

or ax, 0 ; OF = 0

136 / 254

Page 137: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataOperazioni sui singoli flag - Tabella di debug

Set Descrizione Clear DescrizioneOV Overflow NV No OverflowDN Direction Down UP Direction UpEI Interrupts Enabled DI Interrupts DisabledNG Sign Flag Negative PL Sign Flag PositiveZR Zero NZ Not ZeroAC Auxiliary Carry NA Not Auxiliary CarryPO Odd Parity PE Even ParityCY Carry NC No Carry

137 / 254

Page 138: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataOperazioni sui singoli flag - Esempio

; prog13.asm

.model small

.stack 100h

.code

start:

and al, 0

or al, 1

or al, 80h

and al, 7fh

stc

clc

mov al, 7fh

inc al

or ax, 0

mov ax, 4c00h

int 21h

end start 138 / 254

Page 139: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione jcond

Un’istruzione di salto condizionato effettua una ramificazioneverso un’etichetta destinazione quando la condizione di unflag vera

se la condizione sul flag falsa, viene eseguita l’istruzioneimmediatamente successiva

La sintassi :

Jcond destinazione

cond si riferisce alla condizione di un flag. Si pu avere peresempio:

jc (jump if carry)jnc (jump if not carry)jz (jump if zero)jnz (jump if not zero)

139 / 254

Page 140: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione jcond / 2

MASM richiede che la destinazione del salto sia una labelall’interno della procedura corrente

Ad ogni modo, questa limitazione viene superata utilizzandouna label globale indicata dal simbolo ::

Per esempio:

Jc L1

...

L1::

In modalita reale, i salti possono avvenire entro un offset di 1byte (positivo o negativo)

in modalita protetta, questa limitazione stata rimossa

140 / 254

Page 141: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione jcond / 3

mov ax, 5

cmp ax, 5

je L1 ; jump if equal

mov ax, 5

cmp ax, 6

jl L1 ; jump if less

mov ax, 5

cmp ax, 4

jg L1 ; jump if greater

141 / 254

Page 142: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione jcond / 4

I salti condizionati possono essere raggruppati come segue:

in base a specifici valori dei flagin base all’uguaglianza tra operandi, oppure al valore delregistro cxin base al confronto tra operandi senza segnoin base al confronto tra operandi con segno

142 / 254

Page 143: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione jcond / 5

Salti condizionati dipendenti dai valori dei flag

Simbolojzjnzjcjncjojnojsjnsjpjnp

Descrizionejump if zerojump if not zerojump if carryjump if not carryjump if overflowjump if not overflowjump if signjump if not signjump if parity

jump if not parity

FlagsZF = 1ZF = 0CF = 1CF = 0OF = 1OF = 0SF = 1SF = 0PF = 1

PF = 0

143 / 254

Page 144: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione jcond / 6

Salti condizionati dipendenti da uguaglianze

Simbolojejnejcxz

jecxz

Descrizionejump if equaljump if not equaljump if cx = 0

jump if ecx = 0

144 / 254

Page 145: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione jcond / 7

Salti condizionati da confronti senza segno

Simbolojajnbejaejnbjbjnaejbe

jna

Descrizionejump if abovejump if not below or equal (uguale a ja)jump if above or equaljump if not below (uguale a jae)jump if belowjump if not above or equal (uguale a jb)jump if below or equal

jump if not above (uguale a jbe)

145 / 254

Page 146: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione jcond / 8

Salti condizionati da confronti con segno

jg jump if greaterjnle jump if not less or equal (uguale a jg)jge jump if greater or equaljnl jump if not less (uguale a jge)jl jump if lessjnge jump if not greater or equal (uguale a jl)jle jump if less or equaljng jump if not greater (uguale a jle)

146 / 254

Page 147: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione jcond / 9

I salti basati sui confronti con segno vengono utilizzati quandoi numeri che si confrontano possono essere interpretati comevalori con segno

Per esempio, quando si confronta 80h con 7Fh,l’interpretazione e differente se si utilizza ja o jg

mov al, 7Fh ; 7Fh = +127

cmp al, 80h ; 80h = -128

ja Lab ; non funziona

jg Lgr ; funziona

147 / 254

Page 148: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione jcond / 10

Istruzioni come AND, OR, NOT, CMP e TEST sono utiliquando seguite da istruzioni di salti condizionati che utilizzanoi valori del flag di stato per modificare il flusso del programma

Per esempio:

mov al, status

test al, 00100000b ; verifica del bit 5

jnz Label

Si supponga di voler verificare lo stato dei bit 0, 1 o 4:

mov al, status

test al, 00010011b ; verifica dei bit 0, 1, 4

jnz Label

148 / 254

Page 149: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione jcond / 11

Si supponga di voler effettuare un salto se i bit 2, 3 e 7 sonotutti contemporaneamente settati:

mov al, status

and al, 10001100b ; preserva i bit 2, 3 e 7

cmp al, 10001100b ; verifica che siano settati

je Label

Si supponga di voler confrontare gli interi senza segno in AX eBX e spostare il maggiore in DX

mov dx, ax

cmp ax, bx

jae L1 ; se ax >= bx salta a L1

mov dx, bx ; else bx maggiore

L1: ; dx contiene il maggiore

149 / 254

Page 150: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione jcond / 12

Si supponga di voler confrontare i valori senza segnomemorizzati nelle variabili V1, V2 e V3

il minore dei tre viene poi spostato in ax:

.data

v1 word ?

v2 word ?

v3 word ?

.code

start:

mov ax, v1

cmp ax, v2

jbe L1

mov ax, v2

L1: cmp ax, v3

jbe L2

mov ax, v3

L2: ...

150 / 254

Page 151: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzione jcond / 13

Ricerca del primo elemento non nullo in un array

.data

intvec sword 0, 0, 0, 0, 1,

20, 35, -12, 66, 4, 0

niente byte "Non sono stati trovati

valori non nulli",0

.code

start:

mov ax, @data

mov ds, ax

mov bx, offset intvec

mov cx, lengthof intvec

L1:

cmp word ptr [bx], 0

jnz trovato

add bx, 2

loop L1

jmp nontrovato

trovato:

mov dx, word ptr[bx]

add dx, 30h

mov ah, 2h

int 21h

jmp quit

nontrovato:

mov dx, offset niente

mov ah, 9h

int 21h

quit:

mov ax, 4c00h

int 21h

end start

151 / 254

Page 152: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzioni di bit testing

Le istruzioni BT, BTC, BTR e BTS sono chiamate istruzioni di bittesting. Sono importanti perche effettuano piu operazioniall’interno di una singola operazione atomica

L’istruzione BT (bit test) seleziona l’n-esimo bit del primooperando e lo copia nel Carry flag:

BT bitbase, n

Il primo operando (bitbase) non viene modificato.

Gli operandi consentiti sono:

BT r/m16, r16

BT r/m32, r32

BT r/m16, imm8

BT r/m32, imm8

152 / 254

Page 153: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzioni di bit testing / 2

Per esempio:

.data

semaforo word 10001000b

.code

...

BT semaforo, 7 ; CF = 1

In alternativa (ma molto piu rischioso):

mov ax, semaforo ; semaforo word 10001000b

shr ax, 8 ; CF = 1 ; in modalit reale shift di 1

153 / 254

Page 154: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzioni di bit testing / 2 - Esempio

.model small

.stack 100h

.data

semaforo byte 10001000b

.code

start:

mov dl, semaforo

mov cx, 7

L1: shr dl, 1

loop L1

mov ah, 02h

int 21h

mov ax, 4c00h

int 21h

end start

154 / 254

Page 155: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzioni di bit testing / 3

L’istruzione BTC (bit test and complement) seleziona il bit nnel primo operando, lo copia nel Carry flag e lo complementa

BTC bitbase, n

Gli operandi consentiti sono gli stessi dell’istruzione BT.

.data

semaforo word 10001000b

.code

...

BTC semaforo, 6 ; CF = 0, semaforo = 11001000b

155 / 254

Page 156: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzioni di bit testing / 4

L’istruzione BTR (bit test and reset) seleziona il bit n nelprimo operando, lo copia nel Carry flag e lo azzera

BTR bitbase, n

Gli operandi consentiti sono gli stessi dell’istruzione BT.

.data

semaforo word 10001000b

.code

...

BTR semaforo, 7 ; CF = 1, semaforo = 00001000b

156 / 254

Page 157: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Elaborazione condizionataIstruzioni di bit testing / 5

L’istruzione BTS (bit test and set) seleziona il bit n nel primooperando, lo copia nel Carry flag e lo setta

BTS bitbase, n

Gli operandi consentiti sono gli stessi dell’istruzione BT.

.data

semaforo word 10001000b

.code

...

BTS semaforo, 6 ; CF = 1, semaforo = 11001000b

157 / 254

Page 158: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Aritmetica dei numeri interiOperatori di traslazione e rotazione

SHL (shift left)

SHR (shift right)

SAL (shift arithmetic left)

SAR (shift arithmetic right)

ROL (rotate left)

ROR (rotate right)

RCL (rotate carry left)

RCR (rotate carry right)

Lo shift logico riempie di zeri le posizioni che si liberano, mentre loshift aritmetico riempie le posizioni che si liberano con il bit disegno del numero soggetto a traslazione

158 / 254

Page 159: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatori di traslazione e rotazioneIstruzione SHL

Effettua uno shift logico a sinistra ponendo a zero il bit menosignificativo

Il bit piu significativo viene spostato nel Carry flag,sovrascrivendone il contenuto

SHL destination, count

Gli operandi consentiti sono:

SHL reg, imm8

SHL mem, imm8

SHL reg, CL

SHL mem, CL

159 / 254

Page 160: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatori di traslazione e rotazioneIstruzione SHL / 2

I processori 8086 e 8088 richiedono che imm8 sia uguale a 1

nei modelli piu recenti imm8 pu assumere qualsiasi valore

CL puo contenere un intero utilizzato come contatore (suqualsiasi processore)

Le stesse regole si applicano anche agli altri operatori ditraslazione e rotazione

mov bl, 8Fh ; bl = 1001111b

shl bl, 1 ; bl = 0011110b , CF = 1

160 / 254

Page 161: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatori di traslazione e rotazioneIstruzione SHL / 3

SHL viene utilizzato per la moltiplicazione veloce per potenzedi 2

Infatti, shiftare di n bit a sinistra significa moltiplicarel’operando per 2n

Per esempio:

mov dl, 5 ; dl = 00000101 5

shl dl, 1 ; dl = 00001010 10

...

mov dl, 10 ; dl = 00001010 10

shl dl, 2 ; dl = 00101000 40

161 / 254

Page 162: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatori di traslazione e rotazioneIstruzione SHR

Effettua uno shift logico a destra ponendo a zero il bit pisignificativo

Il bit meno significativo viene spostato nel Carry flag,sovrascrivendone il contenuto

SHR destination, count

mov al, 0d0h ; al = 11010000b

shr al, 1 ; al = 01101000b, CF = 0

162 / 254

Page 163: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatori di traslazione e rotazioneIstruzione SHR / 2

SHR viene utilizzato per la divisione veloce per potenze di 2

Infatti, shiftare di n bit a destra significa dividere l’operandoper 2n

Per esempio:

mov dl, 32 ; dl = 00100000 32

shr dl, 1 ; dl = 00010000 16

...

mov al, 01000000b ; al = 64

shr al, 3 ; al = 00001000b 8

163 / 254

Page 164: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatori di traslazione e rotazioneIstruzioni SAL e SAR

L’istruzione SAL effettua uno shift aritmetico a sinistra

identica a SHL

L’istruzione SAR effettua uno shift aritmetico a destra

La sintassi e identica a quella delle istruzioni SHL e SHR

mov al, 0f0h ; al = 11110000b (-16)

sar al, 1 ; al = 11111000b (-8) CF = 0

...

mov dl, -128 ; dl = 10000000b (-128)

sar dl, 3 ; dl = 11110000b (-16)

164 / 254

Page 165: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatori di traslazione e rotazioneIstruzione ROL

L’istruzione ROL effettua una rotazione di tutti i bit versosinistra

Il bit piu significativo viene copiato nel Carry flag

Si noti che nella rotazione, a differenza dello shift, non si haperdita di bit

La sintassi e identica a quella delle istruzioni SHL e SHR

mov al, 40h ; al = 01000000b

rol al, 1 ; al = 10000000b CF = 0

rol al, 1 ; al = 00000001b CF = 1

rol al, 1 ; al = 00000010b CF = 0

...

mov al, 26h

rol al, 4 ; al = 62h

165 / 254

Page 166: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatori di traslazione e rotazioneIstruzione ROR

L’istruzione ROR effettua una rotazione di tutti i bit versodestra

Il bit meno significativo viene copiato nel Carry flag

La sintassi e identica a quella delle istruzioni SHL e SHR

mov al, 01h ; al = 00000001b

ror al, 1 ; al = 10000000b CF = 1

ror al, 1 ; al = 01000000b CF = 0

166 / 254

Page 167: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatori di traslazione e rotazioneIstruzione RCL

L’istruzione RCL effettua una rotazione di tutti i bit versosinistra, copia il Carry flag nel bit meno significativo e copia ilbit piu significativo nel Carry flag

L’istruzione CLC resetta il Carry flag

clc ; CF = 0

mov bl, 88h ; bl = 10001000b CF = 0

rcl bl, 1 ; bl = 00010000b CF = 1

rcl bl, 1 ; bl = 00100001b CF = 0

167 / 254

Page 168: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatori di traslazione e rotazioneIstruzione RCR

L’istruzione RCR effettua una rotazione di tutti i bit versodestra, copia il Carry flag nel bit piu significativo e copia il bitmeno significativo nel Carry flag

L’istruzione STC setta il Carry flag

stc ; CF = 1

mov ah, 10h ; ah = 00010000b CF = 1

rcr ah, 1 ; ah = 10001000b

168 / 254

Page 169: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatori di traslazione e rotazioneMoltiplicazione binaria

L’istruzione SHL consente di effettuare efficientementemoltiplicazioni per potenze di 2

Qualsiasi numero binario puo essere espresso come la sommadi potenze di 2

Per esempio, la moltiplicazione di AX per 36 puo essere vistacome la moltiplicazione per 32 + 4, quindi:

AX * 36 = AX * ( 32 + 4) = AX * 32 + AX * 4

mov ax, 123

mov bx, ax

shl ax, 5

shl bx, 2

add ax, bx

169 / 254

Page 170: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Operatori di traslazione e rotazioneIsolamento di stringhe di bit

La funzione MS-DOS 57h restituisce la data di un file nelregistro DX

I bit 0-4 indicano il giorno (1-31), i bit 5-8 indicano il mese, ibit 9-15 l’anno

La data 20-05-2010 viene quindi indicata come (l’anno vieneriferito al 1980, cioe 30):

0011110 0101 01010

30 05 20

Per estrarre il giorno:

mov al, dl

and al, 00011111b

mov giorno, al

170 / 254

Page 171: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneIstruzione MUL

L’istruzione MUL moltiplica un operando a 8, 16 o 32 bit per ilcontenuto dei registri AL, AX o EAX (rispettivamente)

MUL accetta quindi un solo operando, con formati:

MUL r/m8

MUL r/m16

MUL r/m32

Il prodotto e contenuto in un registro doppio rispetto alledimensioni del moltiplicando e del moltiplicatore, per garanziadagli overflow

Moltiplicando Moltiplicatore Prodotto

AL r/m8 AX

AX r/m16 DX:AX

EAX r/m32 EDX:EAX

171 / 254

Page 172: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneIstruzione MUL / 2

L’istruzione MUL setta i flag Carry (CF) e Overflow (OF)soltanto se la meta superiore del prodotto non e zero

Per esempio, quando AX viene moltiplicato per un operando a16 bit, il prodotto viene memorizzato in DX:AX

Se DX non e uguale a zero, il Carry flag viene settato

mov al, 5h

mov bl, 10h

mul bl ; CF = 0

mov ax, var1 ; var1 word 2000h

mul var2 ; var2 word 0100h; CF = 1

172 / 254

Page 173: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneIstruzione IMUL

L’istruzione IMUL effettua la moltiplicazione tra interi consegno

L’unica differenza con MUL consiste nel preservare il segno delprodotto

Vengono settati i flag Carry e Overflow quando il registro checontiene la parte piu significativa del prodotto non eun’estensione di segno della parte meno significativa

173 / 254

Page 174: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneIstruzione IMUL / 2

; 1. moltiplicazione con segno 48 * 4

mov al, 48

mov bl, 4

imul bl ; ax = 00c0h, OF = 1

; (ah non e’ un’estensione di segno di al)

; 2. moltiplicazione con segno -4 * 4

mov al, -4

mov bl, 4

imul bl ; ax = fff0h, OF = 0

; (ah e’ un’estensione di segno di al)

; 3. moltiplicazione con segno 48 * 4

mov ax, 48

mov bx, 4

imul bx ; dx:ax = 000000c0h, OF = 0

; (dx e’ un’estensione di segno di ax)

174 / 254

Page 175: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneIstruzione DIV

L’istruzione DIV effettua la divisione di interi a 8, 16 o 32 bit

Viene fornito un solo operando, il divisore

I formati accettati sono:

DIV r/m8

DIV r/m16

DIV r/m32

Il risultato e memorizzato secondo il seguente schema:

Dividendo Divisore Quoziente Resto

AX r/m8 AL AH

DX:AX r/m16 AX DX

EDX:EAX r/m32 EAX EDX

175 / 254

Page 176: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneIstruzione DIV / 2

mov ax, 0083h

mov bl, 2

div bl ; al = 41h, ah = 01h

mov dx, 0

mov ax, 8003h

mov cx, 100h

div cx ; ax = 0080h, dx = 0003h

176 / 254

Page 177: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneIstruzioni di conversione

L’istruzione CBW (Convert Byte to Word) estende il bit disegno di AL nel registro AH

L’istruzione CWD (Convert Word to Double) estende il bit disegno di AX nel registro DX

L’istruzione CDQ (Convert Double to Quad) estende il bit disegno di EAX nel registro EDX

Questo preserva il segno del numero

.data

bvar sbyte -101 ; 9bh

.code

mov al, bvar ; al = 9bh

cbw ; ax = ff9bh

177 / 254

Page 178: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneIstruzioni di conversione / 2

.data

wvar sword -101 ; ff9bh

.code

mov ax, wvar ; ax = ff9bh

cwd ; dx:ax = ffffff9bh

.data

dvar sdword -101 ; ffffff9bh

.code

mov eax, dvar

cdq ; edx:eax = ffffffffffffff9bh

178 / 254

Page 179: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneIstruzione IDIV

L’istruzione IDIV effettua la divisione di interi con segno

Gli operandi sono gli stessi dell’istruzione DIV

Quando si effettua la divisione, bisogna prima estendere ilsegno del dividendo nel secondo registro (ah per la divisione a8 bit, dx a 16bit)

mov al, bvar ; dividendo (bvar sbyte -48)

cbw ; estensione del segno in ah

mov bl, 5 ; divisore

idiv bl ; al = -9, ah = -3

mov ax, wvar ; dividendo (wvar sword -5000)

cwd ; estensione del segno in dx

mov bx, 256 ; divisore

idiv bx ; quoziente ax = -19, resto dx = -136

179 / 254

Page 180: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneOverflow di divisione

Se una divisione produce un quoziente troppo grande peressere contenuto nell’operando destinazione, viene generatoun divide overflow

Questo provoca un interrupt di CPU e la terminazione delprogramma

Per esempio:

mov ax, 1000h

mov bl, 10h

div bl ; al = 100h IMPOSSIBILE

mov ax, dividendo

mov bl, 0

div bl

180 / 254

Page 181: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneOverflow di divisione / 2

Una soluzione potrebbe essere l’utilizzo di registri piu grandi

Ma non si tratta di una soluzione che garantisce in tutti i casi

Molto meglio verificare sempre prima che, almeno, il divisorenon sia nullo

mov ax, dividendo

mov bl, divisore

cmp bl, 0

je DivZero

div bl

...

divZero:

; messaggio di errore per tentata divisione per zero

181 / 254

Page 182: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneEspressioni aritmetiche

var4 = (var1 + var2) * var3

mov ax var1

add ax, var2

mul var3

jc overflow

mov var4, ax

jmp prossimo

overflow:

; messaggio di errore per overflow

182 / 254

Page 183: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneEspressioni aritmetiche / 2

var4 = (var1 * 5) / (var2 - 3)

mov ax var1

mov bx, 5

mul bx

mov bx, var2

sub bx, 3

div bx

mov var4, bx

183 / 254

Page 184: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneEspressioni aritmetiche / 3

var4 = (var1 * -5) / (-var2 % var3)

mov ax, var2

neg ax

cbw

idiv var3

mov bx, dx

mov ax -5

imul var1

idiv bx

mov var4, dx

184 / 254

Page 185: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneAddizione e sottrazione in precisione estesa

Permettono di sommare e sottrarre numeri con dimensione(quasi) illimitata

a tale scopo si utilizzano le istruzioni ADC (Add with Carry) eSBB (Sub with Borrow)

L’istruzione ADC somma l’operando sorgente e il contenuto delCarry flag ad un operando destinazione

I formati consentiti sono identici a quelli dell’istruzione MOV

ADC reg, reg

ADC mem, reg

ADC reg, mem

ADC mem, imm

ADC reg, imm

185 / 254

Page 186: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneAddizione e sottrazione in precisione estesa / 2

Per esempio:

mov dl, 0

mov al, 0ffh

add al, 0ffh ; al = fe

adc dl, 0 ; dl = 01

186 / 254

Page 187: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneAddizione e sottrazione in precisione estesa / 3

L’istruzione SBB sottrae un operando sorgente e il valore delCarry flag da un operando destinazione

I possibili operandi sono identici a quelli dell’istruzione ADC

Per esempio:

mov dx, 1

mov ax, 0

sub ax, 1

sbb dx, 0

187 / 254

Page 188: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneAritmetica decimale in formato ASCII

La CPU effettua i calcoli in binario, ma e possibile effettuareoperazioni aritmetiche su stringhe decimali in formato ASCII

A tale scopo sono necessarie istruzioni specifiche chepermettano di operare su ogni coppia di cifre ASCII

Si consideri per esempio il numero 3402, che puo essererappresentato come:

Formato unpacked: 03 04 00 02

Formato ASCII : 33 34 30 32

L’aritmetica in formato ASCII e lenta perche viene effettuatacifra a cifra, ma consente di operare su grandi numeri

Infatti i numeri vengono in effetti visti come stringhe dicaratteri

188 / 254

Page 189: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneAritmetica decimale in formato ASCII / 2

L’istruzione AAA (ASCII adjust after addition) sistema ilrisultato binario di un’istruzione ADD o ADC

Il risultato presente nel registro AL viene reso consistente conla rappresentazione ASCII

Per esempio:

mov ah, 0

mov al, ’8’ ; ax = 0038h

add al, ’2’ ; ax = 006ah

aaa ; ax = 0100h

or ax, 3030h ; ax = 3130h = ’10’

189 / 254

Page 190: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneAritmetica decimale in formato ASCII / 3

L’istruzione AAS (ASCII adjust after subtraction) sistema ilrisultato binario di un’istruzione SUB o SBB

Il risultato presente nel registro AL viene reso consistente conla rappresentazione ASCII

La correzione e necessaria soltanto quando la sottrazioneproduce un risultato negativo

Per esempio:

mov ah, 0

mov al, var1 ; var1 byte ’8’; ax = 0038h

sub al, var2 ; var2 byte ’9’; ax = 00ffh

aas ; ax = ff09h

pushf

or al, 30h ; ax = ff39h

popf

190 / 254

Page 191: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneAritmetica decimale in formato ASCII / 4

L’istruzione AAM (ASCII adjust after multiplication) sistema ilrisultato binario di un’istruzione MUL

La moltiplicazione deve essere effettuata su numeri decimaliunpacked, cioe non su cifre ASCII

Per esempio:

.data

val byte 05h, 06h

.code

mov bl, val ; primo operando

mov al, [val+1] ; secondo operando

mul bl ; ax = 001eh

aam ; ax = 0300h

191 / 254

Page 192: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Moltiplicazione e divisioneAritmetica decimale in formato ASCII / 5

L’istruzione AAD (ASCII adjust before division) sistema ildividendo decimale unpacked in AX prima di una divisione

Per esempio:

.data

quoziente byte

resto byte

.code

mov ax, 0307h ; dividendo

aad ; ax = 0025h

mov bl, 5 ; divisore

div bl

mov quoziente, al

mov resto, ah

192 / 254

Page 193: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateVariabili locali

Una variabile locale una variabile che viene creata, utilizzata edistrutta all’interno di una procedura

Tutte le variabili viste in precedenza sono state definite nelsegmento data; vengono definite variabili globali statiche:

statiche: ciclo di vita di una variabile uguale alla durata delprogrammaglobali : visibili da tutte le procedure del programma

Le variabili locali presentano una serie di vantaggi:

accesso limitatato, perch soltanto un numero ridotto diistruzioni possono accederviuso efficiente della memoria, perch al termine della proceduravengono distrutte con conseguente risparmio della memoriala stessa variabile pu apparire in due o pi procedure senzacreare conflitti di nome

193 / 254

Page 194: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateVariabili locali / Direttiva LOCAL

La direttiva LOCAL dichiara una o pi variabili locali all’internodi una procedura

deve essere posta immediatamente dopo la direttiva PROC

(vedi pi avanti)

La sua sintassi :

LOCAL lista_var

La definizione di ogni variabile assume la forma:

label: type

194 / 254

Page 195: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateVariabili locali / Direttiva LOCAL / 2

Per esempio:

MySub PROC

LOCAL var1: byte

...

ENDP

BubbleSort PROC

LOCAL temp: word, swapflag: byte

...

ENDP

Merge PROC

LOCAL pvec: ptr word

...

ENDP

195 / 254

Page 196: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateVariabili locali / Direttiva LOCAL / 3

Quando si creano variabili locali bisogna fare attenzioneall’allocazione dello spazio nello stack

In particolare, se le procedure sono annidate, lo spazionecessario sar la somma di tutte le variabili locali

Si supponga, per esempio, che Sub1 chiami Sub2, che a suavolta chiama Sub3

Sub1 PROC

LOCAL array1[50]: word ; 200 byte

...

Sub2 PROC

LOCAL array2[80]: word ; 160 byte

...

Sub3 PROC

LOCAL array3[300]: byte ; 300 byte

Quando inizia l’esecuzione di Sub3, le variabili localioccuperanno un totale di 660 byte, pi gli indirizzi di ritornodelle procedure e i registri eventualmente salvati sullo stack

196 / 254

Page 197: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateParametri di stack e parametri di registro

Definizione: i valori passati ad una procedura da unprogramma chiamante si dicono argomenti; gli stessi valori,dal punto di vista della procedura invocata, si diconoparametri

Esistono due tipi fondamentali di parametri di procedura: iparametri di registro e i parametri di stack

I parametri di registro velocizzano l’esecuzione deiprogrammi, ma bisogna salvare lo stato dei registri prima chevengano caricati con i valori degli argomenti

I parametri di stack sono i parametri di una procedura chevengono caricati sullo stack dal programma chiamante

197 / 254

Page 198: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateParametri di stack e parametri di registro / 2

Esempio di parametri di registro

pusha

mov si, offset array

mov cx, lengthof array

mov bx, type array

call Sub

popa

Esempio di parametri di stack

push type array

push lengthof array

push offset array

call Sub

198 / 254

Page 199: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateParametri di stack e parametri di registro / 3

La direttiva INVOKE automaticamente effettua il push degliargomenti sullo stack e invoca la procedura

INVOKE Sub, offset array, lengthof array, type array

I tipi di argomenti che si possono utilizzare con INVOKE sono:

Tipo Esempiovalore immediato 10, 300h, offset lista, type arrayespressione intera (10 * 20), countnome di variabile lista, array, bvar, wvarespressione di indirizzo [bx + si], [lista + 2]nome di registro ax, bl, ebxADDR nome ADDR lista

199 / 254

Page 200: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateParametri di stack e parametri di registro / 4

L’operatore ADDR pu essere utilizzato per passare un puntatorequando si invoca una procedura con la direttiva INVOKE

Il passaggio di un indirizzo come argomento di una proceduraviene detto passaggio per riferimento

Per esempio:

INVOKE Subarray, ADDR vec

In modalit reale, ADDR restituisce un offset a 16 bit

.data

vec byte 50 dup(?)

.code

INVOKE Subarray, ADDR vec

200 / 254

Page 201: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateDirettiva PROC

La direttiva PROC permette di dichiarare una proceduraseguita da una lista di parametri

La sintassi :

label PROC,

parametro_1,

parametro_2,

...

parametro_n

Oppure:

label PROC, parametro_1, parametro_2, ..., parametro_n

201 / 254

Page 202: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateDirettiva PROC / 2

Un singolo parametro ha la seguente sintassi:

parametro: type

parametro un nome arbitrario che si assegna al parametro

la sua visibilit limitata alla procedura corrente

lo stesso nome di parametro pu essere utilizzato in piprocedure, ma non pu essere il nome di una variabile globale odi una label di codice

il tipo di dato pu essere: byte, sbyte, word, sword, dword,sdword, oppure ptr byte, ptr sbyte, ..., ptr sdword

202 / 254

Page 203: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateDirettiva PROC / 3

Somma PROC, val1: dword, val2: dword

...

Somma ENDP

Subvec PROC, pvec: ptr byte

...

Subvec ENDP

ReadFile PROC, pbuffer: ptr byte

local fileHandle: dword

...

ReadFile ENDP

203 / 254

Page 204: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateDirettiva PROTO

La direttiva PROTO crea un prototipo per una proceduraesistente

Un prototipo dichiara il nome di una procedura e la lista deiparametri

Permette di invocare una procedura senza bisogno di definirla

MASM richiede un prototipo per ogni procedura invocatamediante istruzione INVOKE

PROTO deve precedere sempre l’istruzione INVOKE relativa

204 / 254

Page 205: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateDirettiva PROTO

Le due possibili implementazioni sono:

Sub1 PROTO ; prototipo

INVOKE Sub1 ; invocazione

Sub PROC ; codifica

...

Sub ENDP

Sub PROC ; codifica

...

Sub ENDP

INVOKE Sub1 ; invocazione

205 / 254

Page 206: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateOperatore USES

L’operatore USES, utilizzato insieme alla direttiva PROC

permette di elencare i nomi di tutti i registri modificati nelcorso dell’esecuzione di una procedura

Le conseguenze dell’utilizzo di USES sono:

generare istruzioni push all’inizio della proceduragenerare istruzioni pop alla fine della procedura

Per esempio:

VecSum PROC USES si, cx

mov ax, 0

L1:

add ax, [si]

add si, 4

loop L1

ret

VecSUM ENDP

206 / 254

Page 207: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzateOperatore USES / 2

Esempio (somma di due vettori)

VecSum proc uses si, cx,

ptrvec: ptr word,

sizevec: word

mov si, ptrvec

mov cx, sizevec

cmp cx, 0

je L2

mov ax, 0

L1: add ax, [si]

add si, 2

loop L1

L2: ret

SumVec endp

207 / 254

Page 208: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzatePassaggio di argomenti per valore

Un argomento viene passato ad una procedura per valorequando viene passata una copia della variabile

Questa tecnica preserva il valore originale della variabile

Funzionamento:

la variabile viene copiata sullo stack dalla procedura chiamantela procedura invocata recupera il valore dallo stack e lo utilizza

208 / 254

Page 209: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzatePassaggio di argomenti per valore / 2

Esempio:

.data

var word 1000h

.code

main PROC

INVOKE Sub1, var

exit

main ENDP

Sub1 PROC dato: word

mov dato, 0

ret

Sub1 ENDP

209 / 254

Page 210: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzatePassaggio di argomenti per riferimento

Alla procedura viene passato l’indirizzo di una variabile

La procedura invocata ha la possibilit di modificare il valoreoriginale della variabile

Come regola generale bisognerebbe utilizzare questa tecnicasoltanto quando si vuole che la procedura modifichi il datotrasmesso

Eccezione: la trasmissione di strutture dati (array) dovrebbeessere effettuata per riferimento, ma solo per motivi diprestazioni e di occupazione delle risorse

210 / 254

Page 211: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Procedure avanzatePassaggio di argomenti per riferimento / 2

Esempio:

.data

var word 1000h

.code

main PROC

INVOKE Sub2, addr var

exit

main ENDP

Sub1 PROC datoptr: ptr word

mov si, datoptr

mov word ptr[si], 0

ret

ret

Sub2 ENDP

211 / 254

Page 212: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Organizzazione della memoria

212 / 254

Page 213: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Organizzazione della memoria / 2

In modalita reale, i 640K di memoria sono utilizzati sia dalsistema operativo che dai programmi applicativi

le locazioni da C0000 a FFFFF sono riservate per la ROM disistema

all’interno dell’area riservata al sistema operativo, i 1024 bytepiu bassi (da 00000 a 003FF) contengono una tabella diindirizzi a 32 bit denominata tabella dei vettori di interrupt

immediatamente dopo, e presente l’area BIOS & DOS area

nell’area Software BIOS sono presenti le procedure per lagestione dei dispositivi di I/O (tastiera, disk drive, video,porte di I/O)

nell’area DOS Kernel, Device Drivers sono contenuti ibuffer e i driver dei dispositivi

nell’area Resident command processor e contenutol’interprete dei comandi, caricato dall’eseguibile command.com

213 / 254

Page 214: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Organizzazione della memoria / 3

I programmi applicativi possono essere caricati in memoria nelprimo indirizzo superiore alla parte residene del processore deicomandi e utilizzare tutta la memoria fino all’indirizzo 9FFFF

L’area di memoria video (VRAM) inizia alla locazione A0000

quando invece viene utilizzata in modalita color text mode lalocazione B8000 contiene tutto il testo correntementemostrato a schermo

Lo schermo si dice memory-mapped, nel senso che ogni riga ecolonna dello schermo corrisponde ad un word in memoria

Un carattere copiato nella memoria video appareimmediatamente sullo schermo

214 / 254

Page 215: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Ridirezione I/O

I dispositivi noti come standard input e standard outputrappresentano la tastiera per l’input e il video per l’output

E possibile ridirigere lo standard input cosı che venga letto daun file o da una porta hardware piuttosto che dalla tastiera

lo standard output puo essere ridiretto verso un file, unastampante, un dispositivo di I/O

Si consideri per esempio un programma prog.exe

Puo leggere i dati di input da tastiera oppure da un file

Nel secondo caso si puo scrivere (da linea di comando):

prog.exe < prog-in.txt

215 / 254

Page 216: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Ridirezione I/O / 2

Analogamente, e possibile ridirigere lo standard output

prog.exe > prog-out.txt

Oppure entrambi

prog.exe < prog-in.txt > prog-out.txt

Si noti che la scelta dei nomi dei file sui quali effettuare laridirezione del tutto libera!

216 / 254

Page 217: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Ridirezione I/O / 3

E’ possibile utilizzare il simbolo di pipe | perche l’output di uncomando diventi l’input del comando posto a destra della pipe

Per esempio:

dir | sort

L’output del programma sort puo essere a sua volta ridiretto(come si potrebbe fare anche per l’input del comando dir):

dir | sort > prn

217 / 254

Page 218: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h

L’interrupt DOS int 21h presenta numerose funzioni oltre aquelle gia viste

Una di questa e la funzione 6, che stampa un carattere sustandard output

mov ah, 6

mov dl, "A"

int 21h

Si ricordi che: AH = 6, DL = carattere

218 / 254

Page 219: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 2

La funzione 40h scrive un array di byte su un file o undispositivo

Si ricordi che: AH = 40h, BX = file o dispositivo (console =1), CX = numero di byte da scrivere, DX = indirizzo dell’array

.data

msg "Ciao a tutti"

.code

mov ah, 40h

mov bx, 1

mov cx, lengthof msg

mov dx, offset msg

int 21h

219 / 254

Page 220: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 3Esempio

.model small

.stack 100h

.data

msg byte "Ciao a tutti", 13, 10

.code

main PROC

mov ax, @data

mov ds, ax

mov ah, 40h

mov bx, 1

mov cx, sizeof msg

mov dx, offset msg

int 21h

mov ax, 4c00h

int 21h

end main

220 / 254

Page 221: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 3aCreazione file con 3ch

La funzione 3ch permette di creare/troncare un file

Registri Descrizione

DX offset filename (ASCIIZ)

CX Attributi file0 Normal1 Read only2 Hidden3 System

AX Codici di errore3 Path not found4 No handle available (too many files)5 Access denied

221 / 254

Page 222: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 3bCreazione file con 3ch

;f40-creat.asm

.model small

.stack 100h

.data

fh byte "provatxt.txt",0

.code

start:

mov ax, @data

mov ds, ax

mov dx, offset fh

mov cx, 0

mov ah, 3ch

int 21h

. . .

222 / 254

Page 223: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 3cApertura file con 3dh

La funzione 3dh permette di aprire un file gia esistente

Registri Descrizione

DX offset filename (ASCIIZ)

AL Codice di accesso0 Read1 Write2 Read/Write

AX Codici di errore2 File not found3 Path does not exist4 No handle available (too many files)5 Access denied0ch Access code invalid

223 / 254

Page 224: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 3dApertura file con 3dh

; f40-open.asm

.model small

.stack 100h

.data

fh byte "provatxt.txt",0

.code

start:

mov ax, @data

mov ds, ax

mov dx, offset fh

mov al, 1

mov ah, 3dh

int 21h

. . .

224 / 254

Page 225: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 3eLettura file con 3fh

La funzione 3fh permette di leggere da un file (gia esistente)

Registri Descrizione

BX file handle

DX offset bufferCX numero di byte da leggere

AX numero di byte lettiAX 0 Raggiunto EOFAX Codici di errore

5 Access denied6 Invalid handle or not open

225 / 254

Page 226: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 3fLettura file con 3fh

. . .

.data

buf byte 50 dup(’+’),"$",’13’,’10’

. . .

mov bx, ax

mov ah, 3fh

mov cx, 9

mov dx, offset buf

int 21h

. . .

226 / 254

Page 227: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 3gScrittura su file con 40h

La funzione 40h permette di scrivere su un file (gia esistente)

Registri Descrizione

BX file handle

DX offset bufferCX numero di byte da scrivere

AX numero di byte scrittiAX 0 Disk fullAX Codici di errore

5 Access denied6 Invalid handle or not open

227 / 254

Page 228: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 3hScrittura su file con 40h

. . .

.data

msg byte "Ciao a tutti"

. . .

mov bx, ax

mov ah, 40h

mov cx, lengthof msg

mov dx, offset msg

int 21h

. . .

228 / 254

Page 229: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 4

La funzione 6 legge un carattere dallo standard input senzaattendere

A differenza della funzione 1 non si ha attesa in caso di buffervuoto e non si ha echo del carattere digitato

mov ah, 6

mov dl, 0ffh

int 21h

jz salta

mov char, al

salta:

229 / 254

Page 230: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 5

La funzione 0ah legge una stringa bufferizzata dallo standardinput terminata da Enter

L’invocazione di questa funzione richiede che si passi unpuntatore ad una struttura di input avente il seguenteformato:

count = 80

KEYBOARD struct

maxInput byte count ; numero max di caratteri in input

inputCount byte ? ; conta effettiva caratteri

buffer byte count dup(?) ; contenitore caratteri di input

KEYBOARD ends

230 / 254

Page 231: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 6

Il campo maxInput specifica il numero massimo di caratterida inserire, compreso Enter

E’ possibile utilizzare Backspace per cancellare caratteri

I caratteri non ASCII (per esempio, i tasti funzione e le frecce)vengono ignorati

.data

kbd KEYBOARD <>

.code

mov ah, 0ah

mov dx, offset kbd

int 21h

231 / 254

Page 232: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 7

La funzione 0ah viene spesso utilizzata in congiunzione con lafunzione 0bh, che restituisce lo stato del buffer di input

Se presente un carattere AL = 0ffh, altrimenti AL = 0

mov ah, 0bh

int 21h

cmp al, 0

je salta

; procedura di acquisizione del carattere

salta:

232 / 254

Page 233: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 8

La funzione 3fh legge un array di byte da un file o da unadispositivo

Puo essere utilizzata per l’input da tastiera quando ildispositivo in BX viene posto a zero

.data

inputbuffer byte 127 dup(0)

bytesread word ?

.code

mov ah, 3fh

mov bx, 0

mov cx, lengthof inputbuffer

mov dx, offset inputbuffer

int 21h

mov byteread, ax

233 / 254

Page 234: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 9

Eventuali caratteri in eccesso rimangono nel buffer

Invocazioni successive provocano la lettura dei dati dal buffere non dalla tastiera, quindi e bene vuotare il buffer

cleanbuff proc

.data

unbyte byte ?

.code

pusha

L1:

mov ah, 3fh

mov bx, 0

mov cx, 1

mov dx, offset unbyte

int 21h

cmp unbyte, 0ah

jne L1

popa

ret

cleanbuff endp

234 / 254

Page 235: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 10Funzioni date/time

La funzione 2ah permette di ottenere la data di sistema,mentre la funzione 2bh ne permette la regolazione

mov ah, 2ah

int 21h

mov anno, cx

mov mese, dh

mov giorno, dl

mov giornosett, al

...

mov ah, 2bh

mov cx, nuovoanno

mov dh, nuovomese

mov dl, nuovogiorno

int 21h

cmp al, 0

jne fallita

235 / 254

Page 236: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 11Funzioni date/time

Analogamente, la funzione 2ch permette di ottenere l’ora disistema, e la funzione 2dh ne permette la regolazione

mov ah, 2ch

int 21h

mov ora, ch

mov min, cl

mov sec, dh

...

mov ah, 2bh

mov ch, new_ora

mov cl, new_min

mov dh, new_sex

int 21h

cmp al, 0

jne fallita

236 / 254

Page 237: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 12Funzioni di I/O da file e directory

L’interrupt int 21h fornisce una (lunga) serie di servizi per lagestione dell’I/O di file e directory

Le funzioni utilizzate piu di frequente sono:

Funzione Descrizione

716Ch Crea o apre un file

3Eh Chiude l’handle di un file

42h Sposta il puntatore al file

5706h Ottiene data e ora di creazione del file

237 / 254

Page 238: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 13Funzioni di I/O da file e directory

File e directory sono identificati mediante interi a 16 bitdenominati handle

Esistono 5 handle predefiniti

Ad eccezione dell’handle 2 (errore) permettono tutti laridirezione al prompt dei comandi

Gli handle disponibili in qualunque momento sono:

Numero Descrizione

0 Tastiera (standard input)

1 Console (standard output)

2 Errore

3 Dispositivo ausiliario

4 Stampante

238 / 254

Page 239: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 14Funzioni di I/O da file e directory

Tutte le funzioni di I/O generano, in caso di errore, un codicerestituito nel registro AX:

Codice Descrizione

01 Invalid function number02 File not found03 Path not found04 Too many open files05 Access denied06 Invalid handle07 Memory control blocks destroyed08 Insufficient memory09 Invalid memory block address0A Invalid environment0B Invalid format0C Invalid access code0D Invalid data0E Reserved0F Invalid drive was specified

239 / 254

Page 240: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 15Funzioni di I/O da file e directory

Continua:Codice Descrizione

10 Attempt to remove current directory11 Not same device12 No more files13 Diskette write-protected14 Unknown unit15 Drive not ready16 Unknown command17 Data error (CRC)18 Bad request structure length19 Seek error1A Unknown media type1B Sector not found1C Printer out of paper1D Write fault1E Read fault1F General failure

240 / 254

Page 241: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 16Funzioni di I/O da file e directory

La funzione 716Ch permette di creare un nuovo file o diaprirne uno esistente

Lo stato dei registri e:

Registro Stato

AX 716Ch

BX 0 = read, 1 = write, 2 = read/write

CX 0 = normal, 1 = read-only, 2 = hidden3 = system, 8 = volume ID, 20h = archive

DX 1 = open, 2 = truncate, 10h = create

SI offset filename

241 / 254

Page 242: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 16bisFunzioni di I/O da file e directory

Esempio:

mov ax, 716ch

mov bx, 0 ; read-only

mov cx, 0 ; attributo normale

mov dx, 1 ; file esistente

mov si, offset filename

int 21h

jc fallita

mov handle, ax ; handle del file

mov azione, cx

242 / 254

Page 243: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 18Funzioni di I/O da file e directory

Esempio n. 2 (creazione nuovo file o troncamento fileesistente):

mov ax, 716ch

mov bx, 2 ; read-write

mov cx, 0 ; attributo normale

mov dx, 10h+02h ; creazione + troncamento

mov si, offset filename

int 21h

jc fallita

mov handle, ax ; handle del file

mov azione, cx

243 / 254

Page 244: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 19Funzioni di I/O da file e directory

Esempio n. 3 (creazione nuovo file o fallimento se esistente):

mov ax, 716ch

mov bx, 2 ; read-write

mov cx, 0 ; attributo normale

mov dx, 10h ; creazione

mov si, offset filename

int 21h

jc fallita

mov handle, ax ; handle del file

mov azione, cx

244 / 254

Page 245: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 20Funzioni di I/O da file e directory

La funzione 3eh chiude un handle di file

Il contenuto del buffer di scrittura viene scritto su disco

Il registro BX deve contenere il file handle

mov ah, 3eh

mov bx, filehandle

int 21h

jc fallita

245 / 254

Page 246: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 21Funzioni di I/O da file e directory

La funzione 42h sposta il puntatore alla posizione di un fileaperto

Il registro BX deve contenere il file handle

Il registro CX:DX deve contenere il valore dell’offset (32 bit)

Il contenuto del registro AL pu essere:

0: offset dall’inizio del file1: offset dalla posizione corrente2: offset dalla fine del file

mov ah, 42h

mov al, 0

mov bx, filehandle

mov cx, offsethi

mov dx, offsetlo

int 21h

246 / 254

Page 247: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 22Funzioni di I/O da file e directory

La funzione 5706h fornisce la data e l’ora di creazione di unfile

Ovviamente, il file deve essere aperto

Il registro BX deve contenere il file handle

mov ah, 5706h

mov bx, filehandle

int 21h

jc errore

mov data, dx

mov ora, cx

mov msec, si

247 / 254

Page 248: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 23Funzioni di I/O da file e directory - Lettura e copia di un file di testo

.data

buffersize = 5000

ifile byte "ifile.txt",0

ofile byte "ofile.txt",0

ihandle word ?

ohandle word ?

buffer byte buffersize dup(?)

bytesread word ?

.code

main PROC

mov ax, @data

mov ds, ax

mov ax, 716ch ; apertura file di input

mov bx, 0 ; read-only

mov cx, 0 ; normal

mov dx, 1 ; open

mov si, offset ifile

int 21h

jc esci

mov ihandle, ax

248 / 254

Page 249: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 24Funzioni di I/O da file e directory - Lettura e copia di un file di testo / 2

mov ah, 3fh ; lettura file di input

mov bx, ihandle ; handle file di input

mov cx, buffersize ; max byte da leggere

mov dx, offset buffer ; puntatore al buffer

int 21h

jc esci

mov bytesread, ax

mov ah, 40h ; scrittura su file o device

mov bx, 1 ; console

mov cx, bytesread

mov dx, offset buffer

int 21h

jc esci

mov ah, 3eh ; chiusura file

mov bx, ihandle

int 21h

jc esci

249 / 254

Page 250: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 24Funzioni di I/O da file e directory - Lettura e copia di un file di testo / 3

mov ax, 716ch ; creazione/apertura file

mov bx, 1 ; write-only

mov cx, 0 ; normal

mov dx, 12h ; creazione/troncamento

mov si, offset ofile

int 21h

jc esci

mov ohandle, ax

mov ah, 40h ; scrittura su file o device

mov bx, ohandle ; file handle

mov cx, bytesread

mvo dx, offset buffer

int 21h

jc esci

mov ah, 3eh

mov bx, ohandle

int 21h

250 / 254

Page 251: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Funzioni di int 21h / 24Funzioni di I/O da file e directory - Lettura e copia di un file di testo / 4

esci:

mov dl, 13

mov ah, 2h

int 21h

mov dl, 10

mov ah, 2h

int 21h

mov ax, 4c00h

int 21h

main endp

251 / 254

Page 252: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

EsempioConversione di un numero da base decimale a base binaria

.model small

.stack 100h

.data

ni byte 10 dup(?)

nf byte 10 dup(?)

.code

start:

mov ax, @data

mov ds, ax

mov si, 0

mov bl, 2

mov ax, 0

mov al, 29

. . .

Li: div bl

mov ni[si], ah

or ni[si], 30h

inc si

cmp al, 2

jc Lf

mov ah, 0

jmp Li

Lf: mov ni[si], al

or ni[si], 30h

. . .

252 / 254

Page 253: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

EsempioConversione di un numero da base decimale a base binaria (cont.)

. . .

mov di, 0

Lv: mov bl, ni[si]

mov nf[di], bl

mov bh, nf[di]

inc di

dec si

cmp si, 0

jge Lv

. . .

. . .

mov ah, 09h

mov dx, offset ni

int 21h

mov dx, offset nf

int 21h

mov ax, 4c00h

int 21h

end start

253 / 254

Page 254: Programmazione Assembly Note su Microsoft Assemblergiacomofiumara.altervista.org/teaching/ade/lezioni/07-assembly.pdf · Microsoft Assembler Masm32.com installare con gurare pathperch

Bibliografia

K. Irvine, Assembly Language for Intel-Based Computers, 5thedition - Pearson/Prentice Hall - ISBN: 0-13-238310 - 1

Lyla B. Das, The x86 Microprocessor - Architecture,Programming and Interfacing, Pearson - ISBN:978-81-317-3246-5

254 / 254