ASM
Bloki assemblera ASM
nie są przez kompilator weryfikowane pod względem składni, dokonuje tego dopiero Mad Assembler.
UWAGA:
Wymagane jest aby zachować stan rejestruX
CPU6502
, który używany jest do obsługi stosu programowego Mad-Pascal.
Kompilator dopuszcza dwie składnie bloku ASM
, z klamrami { } jak dla komentarza i standardową bez klamer.
ASM
lda #10
sta 712
END;
ASM
{ lda #10
sta 712
};
procedure name; assembler;
asm
lda #10
sta 712
end;
procedure name; assembler;
asm
{
lda #10
sta 712
};
end;
$LINK
{$link filename}
Dyrektywa kompilatora {$link filename}
pozwala dołączyć plik relokowalny z Mad Assembler-a do kompilowanego programu Mad-Pascal.
.reloc
.extrn edx .dword
.extrn print .proc (.dword edx) .var
.public prc
.proc prc (.dword a .dword b .dword c) .var
.var a,b,c .dword
print a
print b
print c
rts
.endp
W powyższym przykładzie korzystamy z procedury PRINT
, która jest zdefiniowana w Mad-Pascal.
uses crt;
procedure prc(a,b,c: integer); external;
procedure print(value: dword); keep; register;
begin
writeln(value);
end;
{$link test.obx} // link PRC procedure
begin
prc(11, 347, 321785);
repeat until keypressed;
end.
Z poziomu assemblera mamy dostęp do procedur Mad-Pascal ale tylko oznaczonych modyfikatorem REGISTER
, czyli takich których parametry przekazywane są przez programowe rejestry EDX
, ECX
, EAX
(jesteśmy ograniczeni do maksymalnie trzech parametrów).
Modyfikator KEEP
wymusza pozostawienie procedury w kompilowanym kodzie niezależnie od tego czy wystąpiło jej użycie czy nie (normalnie procedury/funkcje które nie są używane są eliminowane).
Mad-Pascal natomiast ma dostęp do procedur z linkowanego pliku assemblera, których parametry przekazywane są przez zmienne, modyfikator .VAR
.
.proc prc (.dword a .dword b .dword c) .var
W programie relokowalnym Mad Assembler-a potrzebujemy dodatkowej deklaracji zewnętrzych symboli EDX
, ECX
, EAX
.
.extrn edx, ecx, eax .dword
Sama procedura Mad-Pascal do której chcemy mieć dostęp z poziomu assemblera jest deklarowana jako procedura zewnętrzna z parametrami oznaczającymi rejestry programowe EDX
, ECX
, EAX
.
Więcej informacji na temat modyfikatora REGISTER
i kolejności alokacji parametrów w rejestrach programowych w rozdziale Procedury i funkcje.
.extrn print .proc (.dword edx) .var
Dostęp do procedury PRC
z poziomu Mad-Pascal zapewni nam jej upublicznienie przez dyrektywę assemblera .PUBLIC
.
.public prc
Po assemblacji naszego przykładowego relokowalnego programu assemblera TEST.ASM
otrzymujemy plik TEST.OBX
, który możemy połączyć z programem Mad-PAscal dyrektywą {$LINK}
.
{$link test.obx}