kharcs #1

(0) これはなに?

(1)

(2)

MovRI(r,imm);R0~R7に即値定数immを代入、Rx=imm;
MovAI(a,imm);A0~A7に即値定数immを代入、Ax=imm;
LodRMd(r,base,disp);Rxの値をメモリから読み込みます(load)、base=ベースレジスタAx, disp=即値ディスプレイスメント、Rx=[Ax+disp];
StoRMd(r,base,disp);Rxの値をメモリに書き込みます(store)、[Ax+disp]=Rx;
LodAMd(a,base,disp);Ax=[Ax+disp];
StoAMd(a,base,disp);[Ax+disp]=Ax;
AddRI(r,imm);Rxに即値定数immを加算、Rx+=imm;
AddAI(a,imm);Ax+=imm;
AddRR(r0,r1);r0+=r1;
SubRI(r,imm);Rx-=imm;
SubAI(a,imm);Ax-=imm;
SubRR(r0,r1);r0-=r1;
CmpJleRII(r,imm,lab);Rxを即値定数immと比較して結果に応じてラベル番号labにジャンプする、if(Rx<=imm)goto lab;
CmpJccRII(r,imm,lab);他にもJe/Jne/Jl/Jge/Jgがあるが、書くのが面倒なので省略
LbI(lab);ラベル宣言、JmpやCalの飛び先指定に使用
JmpI(lab);無条件分岐、goto lab;
JmpA(a);無条件分岐、goto Ax;
CalII(lab,tmp);サブルーチンのCALL命令、tmpは内部処理用のラベル番号(欄外に補足説明あり)、call lab;
Ret();サブルーチンからのリターン、return;

(3)

(4)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define kharcMain_bgn()     int R0,R1,RP; vJmp: switch (PC) {
#define kharcMain_end()     }
#define LbI(l)              lb##l: case l:
#define MovRI(r,i)          r=i
#define MovAI(a,i)          a=i
#define LodRMd(r,b,d)       r=*(int*)&m0[b+d]
#define StoRMd(r,b,d)       *(int*)&m0[b+d]=r
#define LodAMd(a,b,d)       a=*(int*)&m0[b+d]
#define StoAMd(a,b,d)	     *(int*)&m0[b+d]=a
#define CmpJleRII(r,i,l)    if(r<=i)goto lb##l
#define SubAI(a,i)          a-=i
#define AddAI(a,i)          a+=i
#define SubRI(r,i)          r-=i
#define AddRI(r,i)          r+=i
#define AddRR(r0,r1)        r0+=r1
#define CalII(l,m)          MovAI(RP,m); goto lb##l; LbI(m)
#define Ret()               PC=RP; goto vJmp

int kharcMain(int PC, int SP, char *m0)
{
    kharcMain_bgn();

    (上記のコード)

    kharcMain_end();
    return R0;
}

int main()
{
    char *mem = malloc(64 * 1024);
    int R0 = kharcMain(6, 64 * 1024, mem);
    printf("R0=%d\n", R0);
    return 0;
}

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS