Web 51 P-Code Interpreter |
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:RETVstupní 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.
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.
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.
P-Code Interpreter, část 3
POPIS Web51 | NOVINKY | FAQ | OBJEDNÁVKA | DOWNLOAD |
(c)Copyright 2000, 2001, HW server & Radek Benedikt
Web51@HW.cz, Web51.HW.cz Final applications of the Web51 : www.HWgroup.cz |