• Non ci sono risultati.

E se m p io 1

N/A
N/A
Protected

Academic year: 2021

Condividi "E se m p io 1"

Copied!
18
0
0

Testo completo

(1)

Esercizi assembler - 1

C o rs o d i Fond a m e n ti d i I n fo rm a tica 2 C dL Ing e gn e ri a In fo rm a tica Ing . F ra n c o Z a m bon e lli

ARCH IT E TT URA D E G L I E L AB O RA T O R I: M ICR O P R O C ESS O R I I N T E L 8086 /8088

Lu c id i R ea li zz a ti i n C o ll a bo ra z ion e c on :

Prof. Letizia LeonardiUniversità di Modena

Prof. Antonio Corradi

Università di Bologna

Esercizi assemb ARRAY MONODIMENSIONALI

char va[NA];sizeof(va) = NA * sizeof(char) = NA byte

short int vb[NB];sizeof(vb) = NB * sizeof(short int) = 2 * NB by

DataType vc[NC];sizeof(vc) = NC * sizeof(DataType) = 6 * NC by

DEFINIZIONE DI VETTORI GLOBALI

vaDB NA dup (?)vbDW NB dup (?)oppurevbDB (2 * NB) dup (?)vcDB (6 * NC) dup (?)

DEFINIZIONE DI VETTORI LOCALI

sub sp, NA; va – se NA parisub sp, NA + 1; va – se NA disparisub sp, 2 * NB; vbsub sp, 6 * NC; vc

Il valore finale di SP è l'indirizzo di partenza del vettoreE' però necessario determinare l'indirizzo di partenzdel vettore in funzione di BP e non di SP

(2)

Esercizi assembler - 3 ACCESSO AL GENERICO ELEMENTO V[k]

&V[k] = &V[0] + k * sizeof(V[0])

L'indirizzo deve essere calcolato in fase di esecuzione- il valore di k varia di volta in volta

Si supponga che:•l'indice k sia memorizzato in SI•&v[k] debba essere memorizzato in BX

ACCESSO A VETTORI GLOBALI

LEA BX, [va + SI]

SHL SI, 1LEA BX, [vb + SI]SHR SI, 1

MOV AX, SIMOV DX, 6IMUL DX; DX:AX <- 6 * kMOV BX, AXLEA BX, [vc + BX]

ACCESSO A VETTORI LOCALI

Sostituire va/vb/vc con: BP – xxx

Esercizi ARRAY BIDIMENSIONALI

char ma[RA][CA];sizeof(ma) = RA * CA byte

short int mb[RB][CB];sizeof(mb) = RB * CB * 2 byte

DataType mc[RC][CC];sizeof(vc) = RC * CC * 6 byte

DEFINIZIONE DI MATRICI GLOBALI

maDB RA * CA dup (?)mbDW RB * CB dup (?)oppurembDB (2 * RB * CB) dup (?)mcDB (6 * RC * CC) dup (?)

DEFINIZIONE DI MATRICI LOCALI

sub sp, RA * CA; ma – se RA*CA sub sp, RA * CA + 1; ma – se RA*CA sub sp, 2 * RB * CB; mbsub sp, 6 * RC * CC; mc

Il valore finale di SP è l'indirizzo di partenza del E' però necessario determinare l'indirizzo di padel vettore in funzione di BP e non di SP

(3)

Esercizi assembler - 5 ACCESSO AL GENERICO ELEMENTO M[i][j]

Memorizzazione per righe (convenzione C):

&M[i][j] = &M[0][0] + (i * NC + j) * sizeof(M[0][0])

0jNC-10

i

NR-1

Memorizzazione per colonne:

&M[i][j] = &M[0][0] + (i + j * NR) * sizeof(M[0][0])

0jNC-10

i

NR-1

L'indirizzo deve essere calcolato in fase di esecuzione- i valori di i e j variano di volta in volta

Esercizi assemb

E se m p i:

int vector[] = {1,2,3,4,5,6,7,8,9,0};

int matrix[4][4] = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}}

typedef struct{int giorno,mese,anno;} DataType;

DataType d1,d2[5],d3[2][3],*d4,*d5 = &d1,*d6 = &d2[3

char *str = "Fondamenti di informatica II";

_DATAsegment word public 'DATA'vectordw1,2,3,4,5,6,7,8,9,0matrixdw1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1; oppure 3 dup (1,4 dup (0)),1d1dw3 dup (0)d2dw15 dup (0)d3dw18 dup (0)d4dw0d5dwd1d6dwd2+18strdws@s@db'Fondamenti di informatica II',0_DATAends

(4)

Esercizi assembler - 7 . . .vector[0] = 0;vector[1] = 1;d4 = &d1;d1 = *d6;. . .

_TEXTsegment byte public 'CODE'assume cs:_TEXT,ds:_DATA. . .movword ptr [vector],0; vector[0] = 0movword ptr [vector+2],1; vector[1] = 1movword ptr d4,offset d1; d4 = &d1;;d1 = *d6;;movax,offset d1pushdspushaxpushdspushword ptr d6movcx,6callN_SCOPY@; elimina automaticamente gli argomenti dallo stack. . ._TEXTends

Esercizi

E se m p io 1

typedef struct{int giorno,mese,anno;} DataType;

static DataType dtemp;

void fun(DataType *dpar){dtemp.giorno = dpar->giorno;dtemp.mese = dpar->mese;dtemp.anno = dpar->anno;}

_DATAsegment word public 'DATA'dtempdw3 dup (?)_DATAends

_TEXTsegment byte public 'CODE'assume cs:_TEXT,ds:_DATA_funprocnearpushbpmovbp,sp

(5)

Esercizi assembler - 9 SPvecchio valore di BPBP

SP + 2indirizzo di ritornoBP + 2

SP + 4dparBP + 4

movbx,word ptr [bp+4]; bx <- dpar

;dtemp.giorno = dpar->giorno;

movax,word ptr [bx]movword ptr dtemp,ax

;dtemp.mese = dpar->mese;

movax,word ptr [bx+2]movword ptr dtemp+2,ax

;dtemp.anno = dpar->anno;

movax,word ptr [bx+4]movword ptr dtemp+4,axpopbpret_funendp_TEXTendsend

Esercizi assemble

E se m p io 2

static int stArray[15];

void fun(int array[ ],int n){int j;

for (j = 0; j < n; j++) stArray[j] = array[j];}

_DATAsegment word public 'DATA'stArraydw15 dup (?)_DATAends

_TEXTsegment byte public 'CODE'assume cs:_TEXT,ds:_DATA_funprocnearpushbpmovbp,sppushsi

(6)

Esercizi assembler - 11 SPvecchio valore di SIBP - 2

SP + 2vecchio valore di BPBP

SP + 4indirizzo di ritornoBP + 2

SP + 6&array[0]BP + 4

SP + 8nBP + 6

movbx,word ptr [bp+4]; bx <- &array[0]

;for (j = 0; j < n; j++)

movsi,0; j = 0;cicla:cmpsi,word ptr [bp+6]jgefine; if(j >= n) goto fine;

;stArray[j] = array[j];

shlsi,1; j*sizeof(int)movax,word ptr [bx+si]; ax <- array[j]movword ptr [stArray+si],axshrsi,1incsi; j++jmpciclafine:popsipopbpret_funendp_TEXTendsend

Esercizi a

E se m p io 3

void upperText(char *string){for (; *string; string++) if('a' <= *string && *string <= 'z') *string &= 0xDF;}

void lowerText(char *string){for (; *string; string++) if('A' <= *string && *string <= 'Z') *string |= 0x20;}

Codici ASCII:

A = 65 = 0x41a = 97 = 0x61Z = 90 = 0x5Az = 122 = 0x7A

public_upperTextpublic_lowerText_TEXTsegment byte public 'CODE'assume cs:_TEXT

(7)

Esercizi assembler - 13 ; ;void upperText(char *string) ;_upperTextprocnearpushbpmovbp,spmovbx,word ptr [bp+4]; bx <- stringcicla1:cmpbyte ptr [bx], 0jefine1; if(*string == 0) goto fine;

; if(*string < 'a' || *string > 'z') goto continua1;

cmpbyte ptr [bx], 'a'jlcontinua1cmpbyte ptr [bx], 'z'jgcontinua1

; *string &= 0xDF;

andbyte ptr [bx], 0DFhcontinua1:incbx; string++;jmpcicla1fine1:popbpret_upperTextendp

Esercizi assemble ; ;void lowerText(char *string) ;_lowerTextprocnearpushbpmovbp,spmovbx,word ptr [bp+4]; bx <- stringcicla2:cmpbyte ptr [bx], 0jefine2; if(*string == 0) goto fine;

; if(*string < 'A' || *string > 'Z') goto continua2

cmpbyte ptr [bx], 'A'jlcontinua2cmpbyte ptr [bx], 'Z'jgcontinua2

; *string |= 0x20;

orbyte ptr [bx], 020hcontinua2:incbx; string++;jmpcicla2fine2:popbpret_lowerTextendp_TEXTendsend

(8)

Esercizi assembler - 15

E se m p io 4

void elabWord(char *string,int);

void findWords(char *string){char *p1,*p2;

for (p1 = string;;) { while (*p1 == ' ') p1++; if(*p1 == '\0') break; p2 = p1; while (*p1 && *p1 != ' ') p1++; elabWord(p2,p1-p2); }}

public_findWordsextrn_elabWord:near_TEXTsegment byte public 'CODE'assumecs:_TEXTp1equsip2equdi

Esercizi a ; ;void findWords(char *string) ;_findWordsprocnearpushbpmovbp,sppushsi; utilizzato per p1pushdi; utilizzato per p2

;for (p1 = string;;)

movp1,word ptr [bp+4]ciclofor:

; while (*p1 == ' ') p1++;

while1:cmpbyte ptr [p1], ' 'jneexit1incp1jmpwhile1exit1:

; if(*p1 == '\0') break;

cmpbyte ptr [p1],0jefine

movp2, p1; p2 = p1;

(9)

Esercizi assembler - 17 ; while (*p1 && *p1 != ' ') p1++;

while2:cmpbyte ptr [p1], 0jeexit2cmpbyte ptr [p1], ' 'jeexit2incp1jmpwhile2exit2:

; elabWord(p2,p1-p2);

movax,p1subax,p2; ax <- p1 - p2pushaxpushp2callnear ptr _elabWordaddsp, 4; 4 clock, 4 byte;2 xpop reg; 2 x (8 clock, 1 byte)

jmpcicloforfine:popdipopsipopbpret_findWordsendp_TEXTendsend

Esercizi assemble

E se m p io 6

fatt(int n){if(n <= 1) return 1;else return n*fatt(n-1);}

public_fatt_TEXTsegment byte public 'CODE'assume cs:_TEXT_fattprocnearpushbpmovbp,sp

(10)

Esercizi assembler - 19 movbx,word ptr [bp+4]; bx <- n

;if(n <= 1) return 1;

cmpbx,1jgelse; if(n > 1) goto else;movax,1jmpritorno

else:

;else return n*fatt(n-1);

movax,bxdecax; ax <- n - 1pushaxcallnear ptr _fattaddsp, 2; pop cximulword ptr [bp+4]; il risultato e' in axritorno:popbpret_fattendp_TEXTendsend

Esercizi a

E se m p io 7

find(int key,int table[ ],int nelem){int k,k1,k2;

for (k1 = 0, k2 = nelem - 1; k1 <= k2; ) { k = (k1 + k2) / 2; if(key < table[k]) k2 = k - 1; else if(key > table[k]) k1 = k + 1; else return k; }return -1;}

public_find_TEXTsegment byte public 'CODE'assume cs:_TEXT_findprocnearpushbpmovbp,sppushsikequaxk1equcxk2equdx

(11)

Esercizi assembler - 21 SPvecchio valore di SIBP - 2

SP + 2vecchio valore di BPBP

SP + 4indirizzo di ritornoBP + 2

SP + 6keyBP + 4

SP + 8&table[0]BP + 6

SP + 10nelemBP + 8

keyequword ptr [bp+4]nelemequword ptr [bp+8]

movbx, word ptr [bp+6]; bx <- &table[0]

;for (k1 = 0, k2 = nelem - 1; k1 <= k2; )

movk1, 0movk2, nelemdeck2cicla:cmpk1, k2jgfine; if(k1 > k2) goto fine;

; k = (k1 + k2) / 2;

movk, k1addk, k2sark, 1

Esercizi assemble ; if(key < table[k]) k2 = k - 1;

movsi, ksalsi, 1; si <- k*sizeof(int)movsi,[bx+si]; si <- table[k]cmpsi,keyjlestep2 ; if(table[k] <= key) goto step2movk2, kdeck2jmpcicla

; else if(key > table[k]) k1 = k + 1;

step2:jgestep3 ; if(table[k] >= key) goto step3movk1, kinck1jmpcicla

; else return k;

step3:;movax, k -- ax coincide con k --jmpritornofine:movax, -1ritorno:popsipopbpret_findendp_TEXTendsend

(12)

Esercizi assembler - 23

E se m p io 8

print_string macro stringmovah,9leadx,stringint21hendm

exitmacromovah,4chmoval, 0int21hendm

load_dsmacrosegNamemov ax,segNamemov ds,axassume ds:segNameendm

_STACK segment word STACK 'STACK'db32000 dup (?)_STACK ends

_DATAsegment word public 'DATA'Sizeequ6stringdbSize dup (?),'$'op1dw-4490; un numero qualsiasiop2dw-80; un numero qualsiasi_DATAends

Esercizi a _TEXTsegment byte public 'CODE'assume cs:_TEXT,ss:_STACKmainprocload_ds _DATAmovax, op1addax, op2leabx, stringmovcx, Sizecallcvt_itprint_string stringexitmainendp

cvt_itproc;in ingresso:; ax = numero con segno da convertire; bx = offset della stringa destinazione; cx = lunghezza della stringa destinazione;in uscita:; ax, bx, cx e dx sono privi di significatopushsipushdimovsi,10movdi,cx; lunghezza dest.movcl,'+'testax,axjnscicla; se ax>=0 salta a negaxmovcl,'-'

(13)

Esercizi assembler - 25 cicla:movdx,0divsi; dx:ax / si; ax <- quoziente, dx <- restoadddl,'0'; trasformo in ASCII il restodecdimovbyte ptr [bx+di],dlcmpax,0jnecicla; ripeti se a<>0fill:decdimovbyte ptr [bx+di],cl; segno o biancomovcl,' 'cmpdi,0jnefillpopdipopsiretcvt_itendp

_TEXTendsendmain

Esercizi assemble

E se m p io 9

read_char macro carmovah,1int21hmovcar,alendm

print_char macro carmovah,2movdl,carint21hendm

LFequ0ahCRequ0dhFALSEequ0TRUEequ1

_datasegment'DATA'Size=20stringdbSize dup (?)_dataends

(14)

Esercizi assembler - 27 _TEXTsegment 'CODE'assume cs:_TEXT,ss:_stackmainprocload_ds_datamovcx,Sizemovdi,0ciclo1:read_char [string+di]cmpbyte ptr [string+di],CRjestep2incdiloopciclo1step2:print_char LFprint_char CRleabx,stringmovcx,dicallbubble

movcx,dimovdi,0ciclo2:print_char [string+di]incdiloop ciclo2exitmainendp

Esercizi a bubbleproc

;in ingresso:; bx = offset array di caratteri da ordinare; cx = numero di caratteri;in uscita:; ax, bx, cx e dx sono privi di significato

pushsideccxmovdx,cx; dx <- nelem-1cicl1:movah,FALSE ; nessuno scambiomovcx,dx; cx <- nelem-1movsi,bx; si punta al primo elementocicl2:moval,byte ptr [si]cmpal,byte ptr [si+1]jlevaixchgbyte ptr [si+1],almovbyte ptr [si],almovah,TRUEvai:incsiloopcicl2cmpah,TRUEjecicl1popsiretbubbleendp

_TEXTendsendmain

(15)

Esercizi assembler - 29

E se m p io 10

_datasegment'DATA'Size=20stringdbSize dup (?),0_dataends

_TEXTsegment 'CODE'assume cs:_TEXT,ss:_stackmainprocload_ds_data

movax,offset stringpushaxmovax,Sizepushaxcallgetsaddsp, 4movdi,ax; lunghezza stringa

print_char LFprint_char CR

movax,offset stringpushaxpushdicallbubbleaddsp, 4

Esercizi assemble movax,offset stringpushaxcallleftTrimaddsp, 2

movax,offset stringpushaxcallputsaddsp, 2

exitmainendp

(16)

Esercizi assembler - 31 getsproc; int gets(int size,char *string)

;in ingresso:; [bp+4] = numero massimo di caratteri; [bp+6] = offset della stringa destinazione;in uscita:; ax contiene il numero di caratteri letti

pushbpmovbp,spmovcx,[bp+4]movbx,[bp+6]gets1:movah,1int21hcmpal,CRjegets2movbyte ptr [bx],alincbxloopgets1gets2:movbyte ptr [bx],0; terminatore Cmovax,bxsubax,[bp+6]popbpretgetsendp

Esercizi a putsproc; void puts(char *string)

;in ingresso:; [bp+4] = offset della stringa destinazione

pushbpmovbp,spmovbx,[bp+4]movah,2puts1:movdl,byte ptr [bx]cmpdl,0jeputs2int21hincbxjmp puts1puts2:popbpretputsendp

(17)

Esercizi assembler - 33 leftTrim proc; void leftTrim(char *string)

;in ingresso:; [bp+4] = offset della stringa destinazione

pushbpmovbp,sppushsimovbx,[bp+4]movcx,0; numero di bianchileft1:cmpbyte ptr [bx],' 'jneleft2inccxincbxjmpleft1left2:cmpcx,0jeleft5movsi,bx; offset sorgente

movcx,1; caratteri da spostareleft3:cmpbyte ptr [bx],0jeleft4inccxincbxjmpleft3

Esercizi assemble left4:pushdimovdi,[bp+4]; offset destinazionemovax,dsmoves,axcldrepmovsbpopdileft5:popsipopbpretleftTrimendp

bubbleproc; void bubble(int size,char *string)

;in ingresso:; [bp+4] = numero di caratteri; [bp+6] = offset dell'array di caratteri

pushbpmovbp,sppushsi

(18)

Esercizi assembler - 35 movbx,[bp+6]; offset array di caratterimovdx,[bp+4]decdx; dx <- numero di caratteri - 1bubble1:movah,FALSE ; nessuno scambiomovcx,dx; cx <- numero di caratteri - 1movsi,bx; si punta al primo elementobubble2:moval,byte ptr [si]cmpal,byte ptr [si+1]jlebubble3xchgbyte ptr [si+1],almovbyte ptr [si],almovah,TRUEbubble3:incsiloopbubble2cmpah,TRUEjebubble1popsipopbpretbubbleendp

_TEXTendsendmain

Riferimenti

Documenti correlati

• Collaborazione con il Dipartimento di Medicina del Lavoro – Università degli Studi di Milano per attività di Igiene Occupazionale e Ambientale;. • Attività

oggetto dello studio Dermatologia Clinica Qualifica conseguita Medico frequentatore Livello nella classificazione nazionale. Date (da – a) Da Ottobre 2005 a Novembre 2009

Principali attività e responsabilità In ambito di età evolutiva mi occupo prevalentemente di Disturbi del Neurosviluppo: faccio diagnosi, trattamento e follow up di

coordinamento e amministrazione di persone, progetti, bilanci; sul posto di lavoro, in attività di volontariato

- Abilità di leadership, sia in campo professionale (quale dirigente coordina- tore di team del Centro di Monitoraggio Geologico di Sondrio e del Centro Nivo-Meteorologico di

Partecipazione alla giornata di studio “Le basi per una discussione pubblica su radiazioni e nucle- are: aspetti della formazione e dell’informazione” Università di

Verrà organizzato un corso in primavera e un corso in autunno con date da stabilire in base alle esigenze degli

Responsabile della Unità Organizzativa “Monitoraggio Acque”, presso il Settore Monitoraggi Ambientali, con competenze relative al monitoraggio delle acque