| QBASIC - Rutiner - Maskinkode | >MASM: BIN - Qbasic |
| | Array | String | |
Maskinkode-rutiner kan anbringes i tre forskellige hukommelses-områder:
| Eksempler: | |
|
|
Fremgangsmåden er følgende:
DIM SHARED code%(50) 'hvis koden fylder max 100 bytes |
DATA 205, 5 'int 5 DATA 203 'retf DEF SEG = VARSEG(code%(0)) FOR i% = 0 TO 2 '3 codes READ d% : POKE VARPTR(code%(0)) + i%, d% NEXT i% DEF SEG |
- eller fra fil med BLOAD. Filen (code.bin)
indeholder maskinkode compileret med fx MASM):
DEF SEG = VARSEG(code%(0)) BLOAD "code.bin", VARPTR(code%(0)) DEF SEG |
DEF SEG = VARSEG(code%(0)) CALL ABSOLUTE(VARPTR(code%(0))) DEF SEG |
Hvis koden kræver parametre (p1, p2,...), tilføjes de før startadressen:
DEF SEG = VARSEG(code%(0)) CALL ABSOLUTE(p1, p2, VARPTR(code%(0))) DEF SEG |
NB: Qbasic benytter 'Call-by-reference' - d.v.s. parametrene overfører variablernes
adresser (offset i data-segmentet) - ikke værdier. Maskinkoden kan derfor ændre
variablernes værdier. Se VARSEG og VARPTR.
Med en String er fremgangsmåden den samme som med en Array - men koden kan gøres kortere, fordi en String befinder sig i Qbasic's standard datasegment:
DIM SHARED code AS STRING * 100 'hvis koden fylder max 100 bytes |
- evt kan en ekstra global variabel defineres - til adressen på maskinkoderutinen:
DIM SHARED ca% ca% = VARPTR(code) |
BLOAD "code.bin", ca% |
CALL ABSOLUTE(p1, p2, ca%) |