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 Pascal}
TAB[2]:=0
{Codificação em Assembly} MOV BYTE PTR TAB[2],0
endereçamento directo
SE TAB [0044h]
MOV BYTE PTR [0044h][2],0 MOV BYTE PTR [0046h],0 {Acesso ao i-ésimo elemento} MOV i,3
MOV bx,i {i-ésimo elemto} MOV BYTE PTR TAB[bx],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
{Acesso ao i-ésimo elemento} i:=3; TAB[i]:=0; TAB[0] DS:TAB TAB[1] . . . TAB[9] 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; TAB[0] DS:TAB TAB[1] . . TAB[9] MOV WORD PTR TAB[2*2],50
End. directo SE TAB [0044h] MOV WORD PTR [0044h][2*2],50 MOV WORD PTR [0048h],50 Índice Tamanho
Acesso ao i-ésimo elemento 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
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;
62
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.
Instruções assembly
Instrução MUL e IMUL
63
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;
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; TAB[3,1] TAB[3,2] TAB[1,2] TAB[1,1] TAB[0,2] TAB[1,0] TAB[0,0] DS:TAB TAB[0,1] . . 64 Codificação em Assembly
MOV BYTE PTR TAB[1*3*1][2*1],50 End. directo
Supondo que TAB é [0044h]
MOV BYTE PTR [0044h][3][2],50 MOV BYTE PTR [0044h][5],50 MOV BYTE PTR [0049h],50 N. º linha N. º coluna Tamanho N. º Elemento p/ linha Codificação em Pascal TAB[1,2]:=50
O compilador associa ao identificador TAB o endereço do 1.º elemento da tabela TAB[0,0].
Acesso a tipos estruturados de dados
Tabelas TAB[3,1] TAB[3,2] TAB[1,2] TAB[1,1] TAB[0,2] TAB[1,0] TAB[0,0] DS:TAB TAB[0,1] . . Codificação em Assembly
O compilador associa ao identificador TAB o endereço do 1.º elemento da tabela TAB[0,0].
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
Codificação em Pascal {Acesso ao i,j elemento} i:=1;j:=2;
TAB[i,j]:=50;
Analisemos o exemplo de uma tabela bidimensional do tipo byte.
Vejamos a definição da variável em Pascal:
Tabelas
Analisemos o exemplo de uma string. Vejamos a definição da variável em Pascal:
var S:string[10]; . S[10] . . S[2] . S[0] DS:S S[1] . . 66 Codificação em Assembly Nesta situação define-se:
Comprimento dinâmico =N.º Caracteres da String (0..10) Comprimento estático =10
MOV BYTE PTR S,1 MOV BYTE PTR S[1],'a' MOV BYTE PTR S,2 MOV BYTE PTR S[1],'A' MOV BYTE PTR S[2],'B' MOV BYTE PTR S,0 Codificação em Pascal S:='a'; S:='AB'; S:='';
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”.
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; s:string[3]; b:boolean; end; . rec.s[3] rec.s[2] rec.s[0] rec.s[1] DS:rec rec.i .rec.b . 67 Codificação em Assembly Codificação em Pascal REC.i:=20; REC.s:='AC'; REC.b:=TRUE; MOV REC.i,20 ou
MOV WORD PTR REC[0],20 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' MOV REC.b,TRUE
ou
Analisemos o exemplo da seguinte tabela de registos Vejamos a definição da variável em Pascal:
var TREC:array[0..9] of Record i:integer; s:string[3]; b:boolean; end; i:word; 68 Codificação em Assembly Codificação em Pascal TREC[1].i:=-10; TREC[2].s:='AB'; TREC[i].b:=FALSE
MOV WORD PTR TREC[1*7+0],-10 MOV BYTE PTR TREC[2*7+2],2 MOV BYTE PTR TREC[2*7+2][1],'A' MOV BYTE PTR TREC[2*7+2][2],'B' Se TREC <=> [0044h] End. Efectivo =[0044h]+[14+2]+[2] =[0044h]+18 =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