Acesso a tipos estruturados de dados

Propaganda
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
Download