kcas #1

(0) kcasとはなんですか?

(1) 基本構文-1

void casMain()
{
    casMain_init;
    ORG(0x100);
    MOV8RI(AH, 0x02); // AH=02: 1文字出力.
    MOV8RI(DL, 0x20);
LB(lp);
    INC16R(DX);
    CMP8RI(DL, 0x7f);
    JNE(lp);
}

(2) メリット-1

// kcas to nasm
#include <stdio.h>
#define casMain_init  ;
void casMain();
int main() { casMain(); return 0; }
#define MOV8RI(r, i)  MOV8RI_(#r, i)
void MOV8RI_(const char *r, int i) { printf("    MOV   %s,%d\n", r, i); }
// 以下略

(3) メリット-2

// kcas to C
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
void casMain();
int main() { casMain(); return 0; }
uint16_t ax, cx, dx, bx, sp, bp, si, di;
char CF, ZF, SF, OF;
#define casMain_vars	int32_t i32
#define MOV8RI(r, i)   MOV8RI_ ## r(i)
#define MOV16RI(r, i)  MOV16RI_ ## r(i)
#define INC16R(r)      INC16R_ ## r()
#define CMP8RI(r, i)   CMP8RI_ ## r(i)
#define LB(l)          l:
#define al     (ax & 0xff)
#define dl     (dx & 0xff)
#define ah     (ax >> 8)
#define dh     (dx >> 8)
#define MOV8RI_AL(i)   ax = (ax & 0xff00) | ((i) & 0xff)
#define MOV8RI_AH(i)   ax = (ax & 0x00ff) | ((i) & 0xff) << 8
#define MOV8RI_DL(i)   dx = (dx & 0xff00) | ((i) & 0xff)
#define MOV16RI_AX(i)  ax = (i)
#define JNE(lb)        if (ZF == 0) goto lb
#define INC16R_DX()    dx++; ZF = 0; ZF = (dx == 0); SF = dx >> 15; OF = ((dx & 0x7fff) == 0)
#define CMP8RI_DL(i)   i32 = dl - (i); CF = (i32 < 0); ZF = (i32 == 0); SF = (i32 >> 15) & 1; /* todo OF */
#define ORG(i)         /* ORG */

(4) 基本構文-2

void casMain()
{
    casMain_init;
    ORG(0x100);
    int vip = 0, vcs = 0;
vjmp:
    // このプログラムではコードセグメントは1つしかないので、vcsによる分岐命令は省略している.
    switch(vip) {
    case 0:
        MOV8RI(AH, 0x02); // AH=02: 1文字出力.
        MOV8RI(DL, 0x20);
LB(lp);
        INT(0x21, 1); // int-no, vip.
    case 1:
        INC16R(DX);
        CMP8RI(DL, 0x7f);
        JNE(lp);
        MOV16RI(AX, 0x4c00);
        INT(0x21, 2);
    case 2:
        ;
    }
}

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