nega_pas_asm8088

Transcript

nega_pas_asm8088
File: /home/peppino/Area_Lavori/ese…/CLEARVET_PAS_with_ASM8088.PAS
{
********************************************************************
*
Usare: TASM e TUBO PASCAL
*
*
Un vettore di 6 elementi booleani impostati a VERO
*
vengono negati da una procedura Assembler 8088
*
*
*
*
* Questo semplice esercizio illustra il passaggio di parametri tra
* il linguaggio ad alto livello e quello a basso livello attraverso
* l' area di STACK
*
*
by ing. G. TALARICO
*
*
********************************************************************
}
program Vettore_Booleano;
uses CRT;
const
N = 6;
type
vettore = array [1..N] of boolean;
var
V:vettore;
j:byte;
{$F+}
procedure Clear_Vett ( lung:word;var W:Vettore);external;
{$L b:\CUD\clearvet.obj}
{$F-}
BEGIN
ClrScr;
for j:=1 to N do
begin
V[j]:=True;
writeln('V[',j,'] = ',V[j])
end;
Clear_Vett(N,V);
writeln;
for j:=1 to N do
begin
writeln('V[',j,'] = ',V[j])
end
END.
(*
; STACK MEMORY LAYOUT:
;-----------------------;- Lunghezza Vettore
;-----------------------;;-Punt. Vettore Boolean ;;-----------------------;- CS ( Turbo Pascal ) ;-----------------------;- IP ( Turbo Pascal ) ;------------------------
BP+10
BP+6
BP+4
BP+2
Pagina 1 di 2
File: /home/peppino/Area_Lavori/ese…/CLEARVET_PAS_with_ASM8088.PAS
;- BP ( Turbo Pascal ) ;SP ---->;------------------------
BP+0
;Lunghezza_Vettore = ( word ptr ss:[bp+10] )
;Puntatore_Vettore = ( dword ptr ss:[bp+6] )
; la procedura effettua la seguente operazione:
; for i:=1 to N do
;
V[i]:=false;
; la seguente procedura assembler fa uso delle direttive semplificate.
;---------------------------------------------------------------------------.MODEL TPASCAL ;
;
;
;
;
;
;
;
;
;
;
specifica il modello di occupazione di memoria e si adegua
alle specifiche Turbo Pascal. Inoltre esegue automaticamente
il prologo:
PUSH BP
MOVE BP,SP
e l'epilogo:
POP BP
e calcola automaticamente il valore N di
RET N.
Che goduria !
;---------------------------------------------------------------------------.CODE
Clear_Vett PROC FAR
Lunghezza_Vettore:WORD, Puntatore_Vettore:DWORD
PUBLIC Clear_Vett
les bx, Puntatore_Vettore
mov di,0
FOR:
cmp di,Lunghezza_Vettore
je Ritorna
mov byte ptr es:[bx][di],0 ; memorizzo FALSE nell' elemento corrente
; del vettore
inc di
jmp short FOR
Ritorna:
ret
Clear_Vett ENDP
END
*)
Pagina 2 di 2