QBASIC - Rutiner - Maskinkode >MASM: BIN - Qbasic
| Array | String |

Maskinkode-rutiner kan anbringes i tre forskellige hukommelses-områder:

 

Eksempler:
Print Screen : printer skærmen
Word : returnerer en word-integer sammensat af to bytes
Binary conversion : fra binær string til numerisk værdi (Ex: "10011101" = 157) - og omvendt
DOS INT21 : MS-DOS API systemkald
BIOS INT10 : BIOS API services

   

Array

Fremgangsmåden er følgende:

  1. En array dimensioneres - til koden
  2. Koden indlæses med POKE eller BLOAD
  3. Koden kaldes med CALL ABSOLUTE

 


  1. En global array dimensioneres, så der er plads nok til maskinkoderutinen.
    NB: i en Integer-array fylder hvert tal to bytes - d.v.s. hvis koden fx fylder max 100 bytes, skal der dimensioneres en Integer-array med mindst 50 tal.
    DIM SHARED code%(50)   'hvis koden fylder max 100 bytes

     

  2. Maskinkoden indlæses
    - enten fra DATA med POKE:
    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

     

  3. Koden kaldes med CALL ABSOLUTE - med kodens startadresse som parameter:
    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.
     

String

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:

 

  1. En global string dimensioneres, så der er plads nok til maskinkoderutinen.
    Hvis koden fx fylder max 100 bytes, skal der dimensioneres en String med mindst 100 tegn.
    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)

     

  2. Maskinkoden indlæses
    BLOAD "code.bin", ca%

     

  3. Koden kaldes
    - her med to parametre:
    CALL ABSOLUTE(p1, p2, ca%)