Acesso a tipos estruturados de dados Tabelas Analisemos o exemplo de uma tabela com 10 elementos tipo byte. Vejamos a definição da variável em Pascal: var tab:array[0..9] of byte; i:word; {Codificação em Assembly} {Codificação em Pascal} MOV BYTE PTR TAB[2],0 endereçamento directo TAB[2]:=0 SE TAB [0044h] MOV BYTE PTR [0044h][2],0 MOV BYTE PTR [0046h],0 TAB[9] . {Acesso ao i-ésimo elemento} MOV i,3 MOV bx,i {i-ésimo elemto} MOV BYTE PTR TAB[bx],0 . . TAB[1] DS:TAB {Acesso ao i-ésimo elemento} i:=3; TAB[i]:=0; TAB[0] endereçamento indirecto SE TAB [0044h] MOV BYTE PTR [0044h][bx],0 O compilador associa ao identificador TAB o endereço do 1.º elemento da tabela 60 Acesso a tipos estruturados de dados Tabelas Analisemos o exemplo de uma tabela com 10 elementos tipo integer. Vejamos a definição da variável em Pascal: var tab:array[0..9] of integer; i:word; Codificação em Assembly Acesso ao i-ésimo elemento o nh ma Ta MOV WORD PTR TAB[2*2],50 End. directo SE TAB Índ ice TAB[9] [0044h] . . MOV WORD PTR [0044h][2*2],50 MOV WORD PTR [0048h],50 DS:TAB MOV i,3 MOV ax,2 {Tamanho de cada elemento} MUL i MOV bx,ax {considera-se os 16bits - significativos} MOV WORD PTR TAB[bx],50 Endereçamento indirecto TAB[1] TAB[0] O compilador associa ao identificador TAB o endereço do 1.º elemento da tabela. Cada elemento ocupa 2 bytes em memória SE TAB [0044h] MOV WORD PTR [0044h][bx],50 61 1 Acesso a tipos estruturados de dados Tabelas Analisemos o exemplo de uma tabela com 10 elementos tipo integer. Vejamos a definição da variável em Pascal: var tab:array[0..9] of integer; i:word; Codificação em pascal TAB[2]:=50; Acesso ao i-ésimo elemento i:=3; TAB[i]:=50; Algumas notas: Nos Exemplos anteriores os registos bx, si e di também poderiam ter sido utilizados. 62 Instruções assembly Instrução MUL e IMUL Estas duas instruções são na sua génese idênticas. A instrução MUL efectua a multiplicação de números não negativos, enquanto que o IMUL efectua a multiplicação de números negativos. (I)MUL <origem> em que <origem> é um registo ou memória; Multiplicação de 16 bits Multiplicação de 8 bits <origem> * AL AH AL <origem> 16 bits * AX DX AX 32 bits 63 2 Acesso a tipos estruturados de dados o nh ma Ta nha p/ li nto me Ele N. º Tabelas Analisemos o exemplo de uma tabela bidimensional do tipo byte. Vejamos a definição da variável em Pascal: var TAB:array[0..3,0..2] of byte; i,j:word; Codificação em Assembly TAB[1,2] TAB[1,1] TAB[1,0] N.º coluna N.º linha TAB[3,1] . . MOV BYTE PTR TAB[1*3*1][2*1],50 End. directo TAB[3,2] TAB[0,2] TAB[0,1] DS:TAB TAB[0,0] Supondo que TAB é [0044h] MOV BYTE PTR [0044h][3][2],50 MOV BYTE PTR [0044h][5],50 MOV BYTE PTR [0049h],50 O compilador associa ao identificador TAB o endereço do 1.º elemento da tabela TAB[0,0]. Codificação em Pascal TAB[1,2]:=50 64 Acesso a tipos estruturados de dados Tabelas Analisemos o exemplo de uma tabela bidimensional do tipo byte. Vejamos a definição da variável em Pascal: var TAB:array[0..3,0..2] of byte; i,j:word; Codificação em Assembly Codificação em Pascal Acesso ao i,j elemento MOV i,1 MOV j,2 MOV AX,1 {Tamanho de cada elemento} MOV BX,3 {n.º elementos p/ linha} MUL BX {AX <-- AX*BX} MUL i {AX<--AX*i} MOV BX,AX MOV AX,1 {Tamanho de cada elemento} MUL j {AX <-- AX*j} ADD BX,AX {BX <-- BX*AX} MOV BYTE PTR TAB[BX],50 Endereçamento indirecto TAB[3,2] TAB[3,1] . . {Acesso ao i,j elemento} TAB[1,2] TAB[1,1] i:=1;j:=2; TAB[i,j]:=50; TAB[1,0] TAB[0,2] TAB[0,1] DS:TAB TAB[0,0] O compilador associa ao identificador TAB o endereço do 1.º elemento da tabela TAB[0,0]. A codificação para um array integer é idêntica, alterando-se apenas o tamanho do elemento, 2. 65 3 Acesso a tipos estruturados de dados Tabelas Analisemos o exemplo de uma string. Vejamos a definição da variável em Pascal: var S:string[10]; S[10] . Nesta situação define-se: Comprimento dinâmico =N.º Caracteres da String (0..10) Comprimento estático =10 Codificação em Assembly Codificação em Pascal MOV BYTE PTR S,1 MOV BYTE PTR S[1],'a' S:='a'; . . . . . S[2] S[1] DS:S MOV BYTE PTR S,2 MOV BYTE PTR S[1],'A' MOV BYTE PTR S[2],'B' MOV BYTE PTR S,0 S:='AB'; S[0] O compilador associa ao identificador S o endereço do byte onde se encontra armazenado o comprimento dinâmico da String. S[0]= “comprimento dinâmico”. S:=''; 66 Acesso a tipos estruturados de dados Tabelas Analisemos o exemplo de um record. Vejamos a definição da variável em Pascal: var REC:Record i:integer; Codificação em Pascal s:string[3]; b:boolean; end; REC.i:=20; Codificação em Assembly MOV REC.i,20 ou MOV WORD PTR REC[0],20 . . REC.s:='AC'; MOV BYTE PTR REC.s,2 MOV BYTE PTR REC.s[1],'A' MOV BYTE PTR REC.s[2],'C' ou MOV BYTE PTR REC.[2],2 MOV BYTE PTR REC.[2+1],'A' MOV BYTE PTR REC.[2+2],'C' REC.b:=TRUE; MOV REC.b,TRUE ou MOV BYTE PTR REC[7],TRUE .rec.b rec.s[3] rec.s[2] rec.s[1] rec.s[0] DS:rec rec.i 67 4 Acesso a tipos estruturados de dados Tabela de registos Analisemos o exemplo da seguinte tabela de registos Codificação em Assembly Vejamos a definição da variável em Pascal: MOV WORD PTR TREC[1*7+0],-10 var TREC:array[0..9] of Record MOV BYTE PTR TREC[2*7+2],2 i:integer; MOV BYTE PTR TREC[2*7+2][1],'A' s:string[3]; MOV BYTE PTR TREC[2*7+2][2],'B' b:boolean; Se TREC <=> [0044h] end; End. Efectivo =[0044h]+[14+2]+[2] i:word; índice =[0044h]+18 Codificação em Pascal Tamanho de 1 registo TREC[1].i:=-10; 2 para integer 4 para string 1 para boolean TREC[2].s:='AB'; TREC[i].b:=FALSE Deslocamento no registo =0044h+12h=0056h MOV BYTE PTR [0056h],'B' MOV i,2 MOV ax,7 MUL i MOV bx,ax MOV BYTE PTR TREC[bx][7],FALSE 68 5