Web 51 P-Code Interpreter

Web 51 - Struktura P-code a jeho interpretr - part 1  software.html  Web 51 - P-code sitove operace - part 3

část 2 - P-instrukce pro základní matematické operace a větvení programu

Navázání interpretru P-kódu na jednotlivé P-instrukce lze demonstrovat např. na matematické knihovně. Základní skelet P-instrukce objasníme na následující funkci:
;
; *** PCMPBI *** compare STRING (cpu IDATA mem) with BYTE constant ***
; pcmpbi buffer_addr, byteconst
;       R7,  R5
pcmpbi: SETB zflag
        MOV  A,R7
        MOV  R0,A
        CLR  C
        MOV  A,@R0
        SUBB A,R5
        MOV  cflag,C
        JZ   pcmpbi0
        CLR  zflag
pcmpbi0:RET

Vstupní parametry jsou předávány pomocí registrů R7 (parametr 1) a registru R5 (parametr 2), tak jak bylo uvedeno v předchozí kapitole. Tato procedura porovnává dvě čísla, jedno zadané pomocí odkazu přes registr R7 a druhé přímo v registru R5. Výsledky porovnání jsou uloženy do globálních bitových proměných zflag a cflag. V mnemonice I51 bychom mohli zapsat: zflag = (@R7 == R5), cflag = (@R7 < R5). Podle hodnoty těchto bitových proměných, definovaných v hlavním modulu interpretru P-kódu (Pcode.asm), lze provádět větvení programu. Ukončení procedury, je pomocí instrukce RET.

Obsah knihovny LIBW - matematické funkce

instrukce parametry popis operace příznaky
pcmpbi (B)a, (B)imm Compare Byte to Immediate (BYTE)@a - (BYTE)imm zflag, cflag
pmovbi (B)a, (B)imm Mov Immediate to Byte (BYTE)@a = (BYTE)imm  
pmovb (B)a, (B)b Mov Byte to Byte (BYTE)@a = (BYTE)@b  
pcmpwi (B)a, (W)imm Compare Word to Immediate (WORD)@a - (WORD)imm zflag, cflag
pbitwi (B)a, (W)imm Test bit Immediate Word (WORD)@a AND (WORD)imm zflag
pmovwi (B)a, (W)imm Mov Immediate to Word (WORD)@a = (WORD)imm  
paddwi (B)a, (W)imm Add Immediate to Word (WORD)@a += (WORD)imm  
psubwi (B)a, (W)imm Subbtract Immediate Word (WORD)@a -= (WORD)imm  
pxorwi (B)a, (W)imm XOR Immediate Word (WORD)@a = (WORD)@a XOR (WORD)imm  
pandwi (B)a, (W)imm AND Immediate Word (WORD)@a = (WORD)@a AND (WORD)imm  
pshiftw (B)a, (B)n Shift Word n-bit Left/Right if(n>0){(WORD)@a << n}
else{(WORD)@a >>(-n)}
 
pcmpn (B)a, (B)b, (B)lng Compare two string for(i=0;i<lng;i++)(B)@a[i]-(B)@b[i] zflag, cflag
paddn (B)a, (B)b, (B)lng Add two string for(i=0;i<lng;i++)(B)@a[i]+=(B)@b[i]  

Nahlédnutí do tabulky základních aritmetických operací odhalí poměrně malé možnosti adresace jednotlivých operandů, většinou s absolutní konstantou. Není to však pravda. Nesmíme zapomenout na INDirect příznaky samotného P-kódu. Např. příkaz
   DPBB_ pmovwi, IND2, data_addr, wordtemp, blank
   provede (WORD)@a = (WORD)@b tj. přiřazení (WORD)data_addr = (WORD)wordtemp
Uplatníme-li příznak INDirect na BYTE příkazy nesmíme zapomenout, že INDirect se rozvíjí jako WORD a BYTE příkaz s tohoto rozvoje použije jeho LSB část. Je proto nutno uvažovat, že se ve skutečnosti bere operand z adresy @(operand+1), popř. načítání INDirect parametrů ještě modifikovat pomocí SWAP. Uplatníme-li důsledky INDirect na instrukční kód, zjistíme, že např. MOVB je duplicitní instrukce.

Obsah knihovny LIBW, modul PCODE

instrukce parametry popis operace příznaky
pcall (W)addr Call to P-Code subroutine push current P-Code PC to stack, jump to addr
pret Return from P-Code subroutine pop P-Code PC from stack
pjump (W)addr Jump to P-Code addr jmp addr
pjumpeq (W)addr Jump if zflag to P-Code addr if(zflag) jmp addr
pjumpne (W)addr Jump if not zflag to P-Code addr if(zflag == 0) jmp addr
pjumpCarry (W)addr Jump if cflag to P-Code addr if(cflag) jmp addr
pjumpnCarry (W)addr Jump if not cflag to P-Code addr if(cflag == 0) jmp addr

Adresa, uvedená jako parametr P-Code instrukce, musí ukazovat opět do P-kódu, nelze skákat na instrukce strojového kódu. Pokud je potřeba skoku přímo do strojového kódu, je nutno nejprve ukončit sekci P-kódu, pomocí DB 0 a následně použít příslušnou strojovou instrukci jmp, jb, jnb, ... Pokud je potřeba volat strojovou proceduru z P-kódu pomocí CALL, není ukončení potřeba. Volání je možno provést tak, jako by to byla P-kódová instrukce, např. pomocí makra DP strojova_instrukce, parametr1, parametr2, parametr3.

Dil 2P-Code Interpreter, část 3




Sponzored by LPhard Ltd. Graphics by GIMP Created by EasyPad

(c)Copyright 2000, 2001, HW server & Radek Benedikt
Web51@HW.cz, Web51.HW.cz

Final applications of the Web51 : www.HWgroup.cz
Web 51 - Struktura P-code a jeho interpretr - part 1  Obsah  Web 51 - P-code sitove operace - part 3