diff --git a/.gitignore b/.gitignore
index 1bc915c..0dd1a26 100644
--- a/.gitignore
+++ b/.gitignore
@@ -154,3 +154,5 @@ $RECYCLE.BIN/
# Mac desktop service store files
.DS_Store
+/VM.VC.VC.opendb
+/VM.VC.db
diff --git a/Asm/Asm.vcxproj b/Asm/Asm.vcxproj
index 2083441..b1fa5e6 100644
--- a/Asm/Asm.vcxproj
+++ b/Asm/Asm.vcxproj
@@ -13,18 +13,19 @@
{02E49534-A118-4FF8-8114-F3F5FA873223}
Asm
+ 8.1
Application
true
- v120
+ v140
MultiByte
Application
false
- v120
+ v140
true
MultiByte
@@ -80,7 +81,7 @@
-
+
diff --git a/Asm/Asm.vcxproj.filters b/Asm/Asm.vcxproj.filters
index bce0d64..800f3e4 100644
--- a/Asm/Asm.vcxproj.filters
+++ b/Asm/Asm.vcxproj.filters
@@ -1,51 +1,51 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hh;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
-
-
- 头文件
-
-
- 头文件
-
-
- 头文件
-
-
- 头文件
-
-
- 头文件
-
-
-
-
- 源文件
-
-
- 源文件
-
-
-
-
- 资源文件
-
-
- 资源文件
-
-
-
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;hm;inl;inc;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ 头文件
+
+
+ 头文件
+
+
+ 头文件
+
+
+ 头文件
+
+
+ 头文件
+
+
+
+
+ 源文件
+
+
+ 源文件
+
+
+
+
+ 资源文件
+
+
+
+ 资源文件
+
+
\ No newline at end of file
diff --git a/Asm/asm.h b/Asm/asm.h
index b1fac93..3d3964f 100644
--- a/Asm/asm.h
+++ b/Asm/asm.h
@@ -11,180 +11,267 @@
using namespace std;
+//-------------------------쳣------------------------
+class MismatchException : public exception {
+ int line;
+public:
+ MismatchException(int line) : exception(), line(line) { ; }
+ const char * what() const throw () {
+ return "Character mismatch";
+ }
+};
+
+class UndeclaredException : public exception {
+ int line;
+public:
+ UndeclaredException(int line) : exception(), line(line) { ; }
+ const char * what() const throw () {
+ return "Variable or function undeclared";
+ }
+};
+
+class MultipleDeclaredException : exception {
+ int line;
+public:
+ MultipleDeclaredException(int line) : exception(), line(line) { ; }
+ const char * what() const throw () {
+ return "Multiple labels are declared";
+ }
+};
+
+class InstructionUnsupportedException : exception {
+ int line;
+public:
+ InstructionUnsupportedException(int line) : exception(), line(line) { ; }
+ const char * what() const throw () {
+ return "Instruction unsupported";
+ }
+};
+
+#define MATCH_REG(l, s) \
+ match('$'); \
+ l->reg = ((Integer*)s)->value; \
+ match(NUM);
+
+#define MATCH_ADDR(l, s) \
+ match('#'); \
+ l->addr = ((Integer*)s)->value; \
+ match(NUM);
+
+//-------------------------------------------------
+
class Asm{
private:
+ int DS = 0;
+ int CS = 0;
+ int SS = 0;
Token *s;
Lexer *lexer;
Codes *cs;
map lables;
- bool match(int kind){
- if (s->kind == kind){
- s = lexer->scan();
- return true;
+ map funcs;
+ // basic opts
+ inline BYTE match_reg() {
+ match('$');
+ BYTE reg = ((Integer*)s)->value;
+ match(NUM);
+ return reg;
+ }
+ inline WORD match_addr() {
+ match('#');
+ WORD addr = ((Integer*)s)->value;
+ match(NUM);
+ return addr;
+ }
+ inline Word* match_word() {
+ Word *w = (Word*)s;
+ match(ID);
+ return w;
+ }
+ // labels
+ Code* add_label(string name) {
+ if (lables.find(name) == lables.end()) {
+ lables[name] = new Label(lexer->line, name);
+ }
+ return lables[name];
+ }
+ // parser
+ void match(int kind){
+ if (s->kind != kind){
+ throw MismatchException(lexer->line);
}
s = lexer->scan();
- return false;
}
- Code* data(){
- Data *d = new Data;
- d->opt = NULL;
- d->line = lexer->line;
+ void data(){
+ match('.');
match(DATA);
- d->width = ((Integer*)s)->value;
- DS = 0;
- CS = d->width;
- match(INT);
- match(DATA);
- return d;
+ //cs->offset = cs->width;
+ //cs->width += ((Integer*)s)->value;
+ //DS = 0;
+ match(NUM);
}
- Code* store(){
- Store *l = new Store;
- l->line = lexer->line;
- l->opt = STORE;
- match(STORE);
- match('$');
- l->reg = ((Integer*)s)->value;
- match(INT);
- switch (s->kind){
- case '#':l->opt |= MR_A; match('#'); break;
- case '*':l->opt |= MR_B; match('*'); break;
- default:break;
- }
- l->addr = ((Integer*)s)->value;
- l->width = 4;
- match(INT);
- return l;
- }
- Code* halt(){
- Halt *h = new Halt;
- h->line = lexer->line;
- h->opt = HALT;
- h->width = 1;
- match(HALT);
- return h;
+ void stack(){
+ match('.');
+ match(STACK);
+ //cs->offset = cs->width;
+ //cs->width += ((Integer*)s)->value;
+ //SS = cs->width;
+ match(NUM);
}
- Code* load(){
- Load *l = new Load;
- l->line = lexer->line;
- l->opt = LOAD;
- match(LOAD);
- match('$');
- l->reg = ((Integer*)s)->value;
- match(INT);
- switch (s->kind){
- case '#':l->opt |= MR_A; match('#'); break;
- case '*':l->opt |= MR_B; match('*'); break;
- default:break;
- }
- l->addr = ((Integer*)s)->value;
- match(INT);
- l->width = 4;
- return l;
- }
- Code* label(){
- match(LABEL);
- if (lables.find(((Word*)s)->word) == lables.end()){
- lables[((Word*)s)->word] = new Label((Word*)s, cs->width);
+ void code(){
+ match('.');
+ match(CODE);
+ s = lexer->scan();
+ Code *c = new Code(0, CODE);
+ while (s->kind == PROC){
+ c = match_proc();
+ if (c){
+ cs->pushCode(c);
+ }
}
- else{
- lables[((Word*)s)->word]->offset = cs->width;
+ match('#');
+ }
+ Code* match_proc(){
+ match(PROC);
+ Word *w = match_word();
+ match(':');
+ Code *body = match_codes();
+ match(ENDP);
+ Proc *proc = new Proc(lexer->line, w->str, body);
+ funcs[w->str] = proc;
+ return proc;
+ }
+ Code* match_codes() {
+ Codes *cs, *c;
+ cs = new Codes(lexer->line);
+ while (s->kind != ENDP) {
+ Code *c;
+ switch (s->kind) {
+ case ID:c = match_label(); break;
+ case CALL: c = match_call(); break;
+ case LOAD:c = match_load(); break;
+ case STORE:c = match_store(); break;
+ case PUSH:c = match_push(); break;
+ case POP:c = match_pop(); break;
+ case HALT:c = match_halt(); break;
+ case JE:
+ case JNE:
+ case JB:
+ case JG:
+ case JMP: c = match_jmp(); break;
+ case ADD:
+ case SUB:
+ case '+':
+ case '-':
+ case '*':
+ case '/':
+ case '%':
+ case '<':
+ case '>':
+ case '=':c = match_arith(); break;
+ case '!':
+ case '~':c = match_unary(); break;
+ default: throw InstructionUnsupportedException(lexer->line); break;
+ }
+ if (c) { cs->pushCode(c); }
}
- match(ID);
+ }
+ Code* match_label() {
+ Word *w = match_word();
match(':');
+ return add_label(w->str);
+ }
+ Code* match_call(){
+ match(CALL);
+ Word *w = match_word();
+ if (funcs.find(w->str) != funcs.end()){
+ Proc *func = funcs[w->str];
+ match(ID);
+ return new Call(lexer->line, func);
+ }
+ throw exception("", 1);
return nullptr;
}
- Code* unary(){
- Unary *u = new Unary;
- u->line = lexer->line;
+ Code* match_load() {
+ BYTE reg = match_reg();
+ WORD addr = match_addr();
+ return new Load(lexer->line, reg, addr);
+ }
+ Code* match_store(){
+ match(STORE);
+ BYTE reg = match_reg();
+ WORD addr = match_addr();
+ return new Store(lexer->line, reg, addr);
+ }
+ Code* match_push() {
+ match(PUSH);
+ BYTE reg = match_reg();
+ return new Push(lexer->line, reg);
+ }
+ Code* match_pop() {
+ match(POP);
+ BYTE reg = match_reg();
+ match(NUM);
+ return new Pop(lexer->line, reg);
+ }
+ Code* match_unary(){
match('~');
- u->opt = NEG;
- match('$');
- u->reg1 = ((Integer*)s)->value;
- match(INT);
- match('$');
- u->reg2 = ((Integer*)s)->value;
- match(INT);
- u->width = 3;
- return u;
- }
- Code* arith(BYTE b){
- Arith *a = new Arith;
- a->line = lexer->line;
- a->opt = b;
- match(s->kind);
- match('$');
- a->reg1 = ((Integer*)s)->value;
- match(INT);
- match('$');
- a->reg2 = ((Integer*)s)->value;
- match(INT);
- match('$');
- a->reg3 = ((Integer*)s)->value;
- match(INT);
- a->width = 4;
- return a;
- }
- Code* jmp(BYTE b){
- Jmp *j = new Jmp;
- j->line = lexer->line;
- j->opt = b;
+ BYTE reg1 = match_reg();
+ BYTE reg2 = match_reg();
+ return new Unary(lexer->line, NEG, reg1, reg2);
+ }
+ Code* match_arith(){
+ BYTE opt = s->kind;
match(s->kind);
- if (lables.find(((Word*)s)->word) == lables.end()){
- // ûбǩ
- j->addr = new Label((Word*)s, cs->width);
- lables[((Word*)s)->word] = j->addr;
- }
- else{
- j->addr = lables[((Word*)s)->word];
- }
+ BYTE reg1 = match_reg();
+ BYTE reg2 = match_reg();
+ BYTE reg3 = match_reg();
+ return new Arith(lexer->line, opt, reg1, reg2, reg3);
+ }
+ Code* match_jmp(){
+ match(JMP);
+ Word *w = match_word();
+ Label *label = (Label*)add_label(w->str);
match(ID);
- j->width = 3;
- return j;
+ return new Jmp(lexer->line, label);
+ }
+ Code* match_halt(){
+ match(HALT);
+ return new Halt(lexer->line);
}
public:
- int DS = 0;
- int CS = 0;
Asm(string fp){
lexer = new Lexer(fp);
}
void parse(){
- Code *c = new Code;
- cs = new Codes;
- s = lexer->scan();
- while (s->kind != '#'){
- switch (s->kind){
- case ID:printf("[%3d]find id:%s\n", lexer->line, ((Word*)s)->word.c_str()); break;
- case DATA:c = data(); break;
- case LOAD:c = load(); break;
- case STORE:c = store(); break;
- case HALT:c = halt(); break;
- case LABEL:c = label(); break;
- case JE: c = jmp(JE); break;
- case JNE: c = jmp(JNE); break;
- case JB: c = jmp(JB); break;
- case JG: c = jmp(JG); break;
- case JMP: c = jmp(JMP); break;
- case '~':c = unary(); break;
- case '+':c = arith(ADD); break;
- case '-':c = arith(SUB); break;
- case '*':c = arith(MUL); break;
- case '/':c = arith(DIV); break;
- case '%':c = arith(MOD); break;
- case '<':c = arith(CMP); break;
- case '>':c = arith(CMP); break;
- case '=':c = arith(CMP); break;
- case '!':c = arith(CMP); break;
- default:printf("[%3d]find unsupport cmd '%d'\n", lexer->line, s->kind); break;
- }
- if (c){ cs->codes.push_back(c); c->offset = cs->width; cs->width += c->width; }
- }
+ cs = new Codes(lexer->line);
+ data();
+ stack();
+ code();
}
void write(FILE *fp){
+ BYTE b = 0x00;
fwrite(&DS, sizeof(WORD), 1, fp);
fwrite(&CS, sizeof(WORD), 1, fp);
- fwrite(&cs->width, sizeof(WORD), 1, fp);
+ fwrite(&SS, sizeof(WORD), 1, fp);
+ //fwrite(&cs->width, sizeof(WORD), 1, fp);
+ //fwrite(&b, sizeof(BYTE)*CS, 1, fp);
cs->code(fp);
}
};
+
+//printf("[%03d]data.\n", lexer->line);
+//printf("[%03d]stack.\n", lexer->line);
+//printf("[%03d]proc.\n", lexer->line);
+//printf("[%03d]call.\n", lexer->line);
+//printf("[%03d]pop.\n", lexer->line);
+//printf("[%03d]push.\n", lexer->line);
+//printf("[%03d]load.\n", lexer->line);
+//printf("[%03d]store.\n", lexer->line);
+//printf("[%03d]label.\n", lexer->line);
+//printf("[%03d]unary.\n", lexer->line);
+//printf("[%03d]arith.\n", lexer->line);
+//printf("[%03d]jmp.\n", lexer->line);
+//printf("[%03d]halt.\n", lexer->line);
#endif
\ No newline at end of file
diff --git a/Asm/code.h b/Asm/code.h
index 7eff493..074f8a1 100644
--- a/Asm/code.h
+++ b/Asm/code.h
@@ -3,19 +3,25 @@
typedef unsigned char BYTE;
typedef unsigned short int WORD;
+typedef unsigned int UINT;
-//궨ֱ
-enum Tag{
+// ʷԪ
+enum Tag{ ID = 256, NUM, REG, RTYPE, ITYPE, JTYPE, END, LABEL, DATA, STACK, CODE, PROC, ENDP, CALL };
+
+// ָ
+enum Inst{
HALT,
- ADD, SUB, MUL, DIV, MOD, CMP,// integer operator
- JMP, JNE, JG, JE, JB, JGE, JBE,
- LOAD, STORE,
- PUSH, POP,
- NEG,
- MOV, IN, OUT,
- SHL, SHR, SAL, SAR, SRL, SRR,//
- LOOP,
- ID = 256, INT, END, LABEL, DATA, CODE, STACK
+ ADD, SUB, MUL, DIV, MOD, CMP, // Scalar
+ JMP, JNE, JG, JE, JB, JGE, JBE, // Jump
+ LOAD, STORE, // Load/Store
+ PUSH, POP, // Push/Pop
+ NEG, // Negtive
+ MOV, IN, OUT, // I/O
+ SHL, SHR, SAL, SAR, SRL, SRR, // Shift
+ LOOP, // Loop
};
+// Ĵ
+enum Reg{ AX, BX, CX, DX, BP, SI, DI, CS, DS, ES, SS, SP };
+
#endif
\ No newline at end of file
diff --git a/Asm/data.asm b/Asm/data.asm
deleted file mode 100644
index 0cbd5a0..0000000
--- a/Asm/data.asm
+++ /dev/null
@@ -1,61 +0,0 @@
-data 4 data
-load $2 #0
-store $2 *0
-load $3 #24
-store $3 *2
-load $4 #10
-store $4 *0
-label L0:
-load $0 *0
-load $5 #0
-> $0 $5 $6
-jg L2
-jmp L1
-label L2:
-load $0 *0
-load $7 #1
-- $0 $7 $8
-store $8 *0
-load $1 *2
-load $9 #1
-+ $1 $9 $10
-store $10 *2
-jmp L0
-label L1:
-label L3:
-load $0 *0
-load $11 #10
-< $0 $11 $12
-jb L5
-jmp L4
-label L5:
-load $0 *0
-load $13 #1
-+ $0 $13 $14
-store $14 *0
-jmp L3
-label L4:
-label L6:
-load $1 *2
-load $15 #1
-- $1 $15 $16
-store $16 *2
-load $1 *2
-load $17 #12
-> $1 $17 $18
-jg L6
-jmp L7
-label L7:
-load $1 *2
-load $0 *0
-! $1 $0 $19
-jne L9
-jmp L8
-label L9:
-load $20 #64
-store $20 *0
-load $21 #32
-store $21 *2
-label L8:
-halt
-#
\ No newline at end of file
diff --git a/Asm/data.bin b/Asm/data.bin
index d4cc308..ac927f8 100644
Binary files a/Asm/data.bin and b/Asm/data.bin differ
diff --git a/Asm/data.s b/Asm/data.s
new file mode 100644
index 0000000..12d7eee
--- /dev/null
+++ b/Asm/data.s
@@ -0,0 +1,64 @@
+.data 12
+.stack 1000
+.code
+proc play:
+ sub $sp 0
+ load $0 &0
+ load $7 1
+ - $0 $7 $8
+ store $8 &0;a
+ load $1 &2
+ load $9 1
+ - $1 $9 $10
+ store $10 &2;b
+ load $2 &4
+ load $11 1
+ - $2 $11 $12
+ store $12 &4;c
+endp
+proc draw:
+ ;x @2
+ ;y @4
+ ;a1 @0
+ ;b1 @2
+ ;c1 @4
+ ;d1 @6
+ sub $sp 8
+ load $14 @0
+ store $14 @0;a1
+ load $15 @2
+ store $15 @2;b1
+ load $16 @0
+ store $16 @4;c1
+ load $17 @2
+ store $17 @6;d1
+ load $18 @4
+ store $18 @0;e1
+ load $19 @6
+ store $19 @0;f1
+ push $bp
+ load $bp $sp
+ sub $sp 2
+ call play
+ add $sp 2
+ load $sp $bp
+ pop $bp
+endp
+proc main:
+ ;a @0
+ sub $sp 2
+ load $26 10
+ load $27 11
+ push $bp
+ load $bp $sp
+ push $27
+ push $26
+ sub $sp 2
+ call draw
+ add $sp 2
+ pop $26
+ pop $27
+ load $sp $bp
+ pop $bp
+endp
+#
\ No newline at end of file
diff --git a/Asm/inst.h b/Asm/inst.h
new file mode 100644
index 0000000..0050502
--- /dev/null
+++ b/Asm/inst.h
@@ -0,0 +1,236 @@
+#pragma once
+
+typedef char S1;
+typedef short int S2;
+typedef int S4;
+typedef long int S8;
+
+typedef unsigned char U1;
+typedef unsigned short int U2;
+typedef unsigned int U4;
+typedef unsigned long int U8;
+
+typedef float F4;
+typedef double F8;
+
+// ָ
+enum Inst {
+ LBI, LWI, LDI, LQI, LF1I, LF2I,
+ LAD, LAI,
+ LB, LW, LD, LQ, LF1, LF2,
+ SB, SW, SD, SQ, SF1, SF2,
+ PUSHB, PUSHW, PUSHD, PUSHQ, PUSHF1, PUSHF2,
+ POPB, POPW, POPD, POPQ, POPF1, POPF2,
+ MOV, MOVF, MOVD,
+ JMP, JE, JNE, SLT, INT, DI, EI, HALT, NOP,
+ AND, OR, XOR, NOT, BT, BS,
+ SRA, SRL, SL,
+ ADD, SUB, MUL, DIV,
+ CAST_IF, CAST_ID, CAST_FI, CAST_FD, CAST_DI, CAST_DF,
+ FADD, FSUB, FMUL, FDIV, FSLT,
+ DADD, DSUB, DMUL, DDIV, DSLT
+};
+
+// Load
+
+#define EXEC_LBI(); R[RAM[IP+1]]=(S1)RAM[IP+2];\
+ IP+=3;
+
+#define EXEC_LWI(); R[RAM[IP+1]]=(S2)*((S2*)&RAM[IP+2]);\
+ IP+=4;
+
+#define EXEC_LDI(); R[RAM[IP+1]]=(S4)*((S4*)&RAM[IP+2]);\
+ IP+=6;
+
+#define EXEC_LQI(); R[RAM[IP+1]]=(S8)*((S8*)&RAM[IP+2]);\
+ IP+=10;
+
+#define EXEC_LF1I(); RF[RAM[IP+1]]=(F4)*((F4*)&RAM[IP+2]);\
+ IP+=6;
+
+#define EXEC_LF2I(); RF[RAM[IP+1]]=(F8)*((F8*)&RAM[IP+2]);\
+ IP+=10;
+
+#define EXEC_LAD(); R[RAM[IP+1]]=(U8)*((U8*)&RAM[IP+2]);\
+ IP+=10;
+
+#define EXEC_LAI(); R[RAM[IP+1]]=R[RAM[IP+2]]+((S8)*((S8*)&RAM[IP+3]));\
+ IP+=11;
+
+#define EXEC_LB(); R[RAM[IP+1]]=(S8)(*((S1*)&RAM[R[RAM[IP+2]]]));\
+ IP+=3;
+
+#define EXEC_LW(); R[RAM[IP+1]]=(S8)(*((S2*)&RAM[(U8)R[RAM[IP+2]]]));\
+ IP+=3;
+
+#define EXEC_LD(); R[RAM[IP+1]]=(S8)(*((S4*)&RAM[(U8)R[RAM[IP+2]]]));\
+ IP+=3;
+
+#define EXEC_LQ(); R[RAM[IP+1]]=(S8)(*((S8*)&RAM[(U8)R[RAM[IP+2]]]));\
+ IP+=3;
+
+#define EXEC_LF1(); RF[RAM[IP+1]]=*((F4*)&RAM[(U8)R[RAM[IP+2]]]);\
+ IP+=3;
+
+#define EXEC_LF2(); RD[RAM[IP+1]]=*((F8*)&RAM[(U8)R[RAM[IP+2]]]);\
+ IP+=3;
+
+// Store
+
+#define EXEC_SB(); RAM[R[RAM[IP+2]]]=(S1)R[RAM[IP+1]];\
+ IP+=3;
+
+#define EXEC_SW(); *((S2*)&RAM[R[RAM[IP+2]]])=(S2)R[RAM[IP+1]];\
+ IP+=3;
+
+#define EXEC_SD(); *((S4*)&RAM[R[RAM[IP+2]]])=(S4)R[RAM[IP+1]];\
+ IP+=3;
+
+#define EXEC_SQ(); *((S8*)&RAM[R[RAM[IP+2]]])=(S8)R[RAM[IP+1]];\
+ IP+=3;
+
+#define EXEC_SF1(); *((F4*)&RAM[R[RAM[IP+2]]])=RF[RAM[IP+1]];\
+ IP+=3;
+
+#define EXEC_SF2(); *((F8*)&RAM[R[RAM[IP+2]]])=RD[RAM[IP+1]];\
+ IP+=3;
+
+// Push
+
+#define EXEC_PUSHB(); SP--;\
+ RAM[SP]=(S1)(R[RAM[IP+1]]);\
+ IP+=2;
+
+#define EXEC_PUSHW(); SP-=2;\
+ *((S2*)&RAM[SP])=(S2)(R[RAM[IP+1]]);\
+ IP+=2;
+
+#define EXEC_PUSHD(); SP-=4;\
+ *((S4*)&RAM[SP])=(S4)(R[RAM[IP+1]]);\
+ IP+=2;
+
+#define EXEC_PUSHQ(); SP-=8;\
+ *((S8*)&RAM[SP])=(S8)(R[RAM[IP+1]]);\
+ IP+=2;
+
+#define EXEC_PUSHF1(); SP-=4;\
+ *((F4*)&RAM[SP])=(F4)(RF[RAM[IP+1]]);\
+ IP+=2;
+
+#define EXEC_PUSHF2(); SP-=8;\
+ *((F8*)&RAM[SP])=(F8)(RF[RAM[IP+1]]);\
+ IP+=2;
+
+// Pop
+
+#define EXEC_POPB(); R[RAM[IP+1]]=(S1)*((S1*)&RAM[SP]);\
+ SP+=1;\
+ IP+=2;
+
+#define EXEC_POPW(); R[RAM[IP+1]]=(S2)*((S2*)&RAM[SP]);\
+ SP+=2;\
+ IP+=2;
+
+#define EXEC_POPD(); R[RAM[IP+1]]=(S4)*((S4*)&RAM[SP]);\
+ SP+=4;\
+ IP+=2;
+
+#define EXEC_POPQ(); R[RAM[IP+1]]=(S8)*((S8*)&RAM[SP]);\
+ SP+=8;\
+ IP+=2;
+
+#define EXEC_POPF1(); RF[RAM[IP+1]]=(F4)*((F4*)&RAM[SP]);\
+ SP+=4;\
+ IP+=2;
+
+#define EXEC_POPF2(); RD[RAM[IP+1]]=(F8)*((F8*)&RAM[SP]);\
+ SP+=8;\
+ IP+=2;
+
+// Mov
+
+#define EXEC_MOV(); R[RAM[IP+1]]=R[RAM[IP+2]];\
+ IP+=3;
+
+#define EXEC_MOVF(); RF[RAM[IP+1]]=RF[RAM[IP+2]];\
+ IP+=3;
+
+#define EXEC_MOVD(); RD[RAM[IP+1]]=RD[RAM[IP+2]];\
+ IP+=3;
+
+// Jump
+
+#define EXEC_JMP(); IP=R[RAM[IP+1]];
+
+#define EXEC_JE(); if(R[RAM[IP+1]]==R[RAM[IP+2]])\
+ IP=R[RAM[IP+3]];\
+ else\
+ IP+=4;
+
+#define EXEC_JNE(); if(R[RAM[IP+1]]!=R[RAM[IP+2]])\
+ IP=R[RAM[IP+3]];\
+ else\
+ IP+=4;
+
+#define EXEC_SLT(); if(R[RAM[IP+2]]> ((S8)R[RAM[IP+3]]);\
+ IP+=4;
+
+#define EXEC_SRL(); R[RAM[IP+1]]=R[RAM[IP+2]] >> R[RAM[IP+3]];\
+ IP+=4;
+
+#define EXEC_SL(); R[RAM[IP+1]]=R[RAM[IP+2]] << R[RAM[IP+3]];\
+ IP+=4;
+
+// Integer Math
+
+#define EXEC_ADD(); R[RAM[IP+1]]=((S8)R[RAM[IP+2]]) + ((S8)R[RAM[IP+3]]);\
+ IP+=4;
+
+#define EXEC_SUB(); R[RAM[IP+1]]=((S8)R[RAM[IP+2]]) - ((S8)R[RAM[IP+3]]);\
+ IP+=4;
+
+#define EXEC_MUL(); R[RAM[IP+1]]=((S8)R[RAM[IP+2]]) * ((S8)R[RAM[IP+3]]);\
+ IP+=4;
+
+#define EXEC_DIV(); R[RAM[IP+1]]=((S8)R[RAM[IP+3]]) / ((S8)R[RAM[IP+4]]);\
+ R[RAM[IP+2]]=((S8)R[RAM[IP+3]]) % ((S8)R[RAM[IP+4]]);\
+ IP+=5;
\ No newline at end of file
diff --git a/Asm/inter.h b/Asm/inter.h
index 26504ad..27a4b7e 100644
--- a/Asm/inter.h
+++ b/Asm/inter.h
@@ -1,23 +1,33 @@
#include "lexer.h"
-struct Label{
- Word *w;
- WORD offset;
- Label(Word *w, int offset) :w(w), offset(offset) { }
-};
-struct Code{
+//----------------οRISCָ----------------
+class Code {
+protected:
BYTE opt;
WORD line = 0;// ǰָڻļеλ
- WORD width = 0;// ǰռõĿ
WORD offset = 0;// ǰεƫ
+public:
+ int getWitdh() { return 0; }
+ Code(int line, BYTE opt) :line(line), opt(opt) { ; }
virtual void code(FILE* fp){
- printf("[%04d][%04d][%04x]", line, width, offset);
+ printf("[%04d][%04x]", line, offset);
}
};
-struct Codes :Code{
+class Codes : public Code{
list codes;
+public:
+ Codes(int line) : Code(line, CODE) { ; }
+ void pushCode(Code *c) { codes.push_back(c); }
+ int getWidth() {
+ int width;
+ list::iterator iter;
+ for (iter = codes.begin(); iter != codes.end(); iter++) {
+ width += (*iter)->getWitdh();
+ }
+ return width;
+ }
virtual void code(FILE* fp){
list::iterator iter;
for (iter = codes.begin(); iter != codes.end(); iter++){
@@ -26,19 +36,67 @@ struct Codes :Code{
}
};
-struct Data :Code{
+class Data : public Code{
+ int width;
+public:
virtual void code(FILE* fp){
Code::code(fp);
- printf("data:%2d\n", width);
- for (WORD i = 0; i < width; i++){
- fwrite(&opt, sizeof(BYTE), 1, fp);
- }
+ printf("data:\n");
+ //for (WORD i = 0; i < width; i++){
+ // fwrite(&opt, sizeof(BYTE), 1, fp);
+ //}
+ }
+};
+
+class Label : public Code {
+ string name;
+public:
+ Label(int line, string name) : Code(line, LABEL), name(name) { ; }
+};
+
+class Proc : public Code {
+ string name;
+ Code *body;
+public:
+ Proc(int line, string name, Code *body) :Code(line, PROC), name(name), body(body) { ; }
+ virtual void code(FILE* fp) {
+ Code::code(fp);
+ body->code(fp);
+ }
+};
+
+class Arith : public Code {
+ BYTE reg1, reg2, reg3;
+public:
+ Arith(int line, BYTE opt, BYTE reg1, WORD reg2, WORD reg3) : Code(line, opt), reg1(reg1), reg2(reg2), reg3(reg3) { ; }
+ virtual void code(FILE* fp) {
+ Code::code(fp);
+ printf("bino\t$%02x $%02x $%02x $%02x\n", opt, reg1, reg2, reg3);
+ fwrite(&opt, sizeof(BYTE), 1, fp);
+ fwrite(®1, sizeof(BYTE), 1, fp);
+ fwrite(®2, sizeof(BYTE), 1, fp);
+ fwrite(®3, sizeof(BYTE), 1, fp);
}
};
-struct Load :Code{
+class Unary : public Code {
+ BYTE reg1, reg2;
+public:
+ Unary(int line, BYTE opt, BYTE reg1, BYTE reg2) :Code(line, opt), reg1(reg1), reg2(reg2) { ; }
+ virtual void code(FILE* fp) {
+ Code::code(fp);
+ printf("unary\t$%02x $%02x $%02x\n", opt, reg1, reg2);
+ fwrite(&opt, sizeof(BYTE), 1, fp);
+ fwrite(®1, sizeof(BYTE), 1, fp);
+ fwrite(®2, sizeof(BYTE), 1, fp);
+ }
+};
+
+class Load : public Code{
BYTE reg;
WORD addr;
+public:
+ Load(int line, BYTE reg, WORD addr) : Code(line, LOAD), reg(reg), addr(addr) { }
virtual void code(FILE* fp){
Code::code(fp);
printf("load\t$%02x $%02x $%04x\n", opt, reg, addr);
@@ -46,58 +104,84 @@ struct Load :Code{
fwrite(®, sizeof(BYTE), 1, fp);
fwrite(&addr, sizeof(WORD), 1, fp);
}
-};// ֱѰַ
+};
-struct Store :Code{
+class Store : public Code {
BYTE reg;
WORD addr;
+public:
+ Store(int line, BYTE reg, WORD addr) : Code(line, STORE), reg(reg), addr(addr) { }
virtual void code(FILE* fp){
Code::code(fp);
- printf("store\t$%02x $%02x $%04x\n", opt, reg, addr);
+ printf("store\t$%02x $%02x $%04x\n", STORE, reg, addr);
fwrite(&opt, sizeof(BYTE), 1, fp);
fwrite(®, sizeof(BYTE), 1, fp);
fwrite(&addr, sizeof(WORD), 1, fp);
}
};
-struct Halt:Code{
+class Push : public Code{
+ BYTE reg;
+public:
+ Push(int line, BYTE reg) : Code(line, PUSH), reg(reg) { ; }
virtual void code(FILE* fp){
Code::code(fp);
- opt = HALT;
- printf("halt\t$%02x\n", opt);
+ printf("push\t$%02x $%02x\n", opt, reg);
fwrite(&opt, sizeof(BYTE), 1, fp);
+ fwrite(®, sizeof(BYTE), 1, fp);
}
};
-struct Jmp :Code{
- Label *addr;
+class Pop : public Code{
+ BYTE reg;
+public:
+ Pop(int line, BYTE reg) : Code(line, POP), reg(reg) { ; }
virtual void code(FILE* fp){
Code::code(fp);
- printf("jmp \t$%02x $%04x\n", opt, addr->offset);
+ printf("pop\t$%02x $%02x\n", opt, reg);
fwrite(&opt, sizeof(BYTE), 1, fp);
- fwrite(&addr->offset, sizeof(WORD), 1, fp);
+ fwrite(®, sizeof(BYTE), 1, fp);
}
};
-struct Arith :Code{
- BYTE reg1, reg2, reg3;
- virtual void code(FILE* fp){
+class Jmp : public Code {
+ Label *label;
+public:
+ Jmp(int line, Label *label) : Code(line, JMP), label(label) { ; }
+ virtual void code(FILE* fp) {
Code::code(fp);
- printf("bino\t$%02x $%02x $%02x $%02x\n", opt, reg1, reg2, reg3);
- fwrite(&opt, sizeof(BYTE), 1, fp);
- fwrite(®1, sizeof(BYTE), 1, fp);
- fwrite(®2, sizeof(BYTE), 1, fp);
- fwrite(®3, sizeof(BYTE), 1, fp);
+ //printf("jmp \t$%02x $%04x\n", opt, addr->offset);
+ //fwrite(&opt, sizeof(BYTE), 1, fp);
+ //fwrite(&addr->offset, sizeof(WORD), 1, fp);
}
};
-struct Unary :Code{
- BYTE reg1, reg2;
+class Param : public Code {
+ BYTE reg;// Ĵ
+ virtual void code(FILE* fp) {
+ Code::code(fp);
+ //printf("param\t$%04x;%s\n", opt, reg);
+ //fwrite(&opt, sizeof(BYTE), 1, fp);
+ }
+};
+
+class Call : public Code {
+ Proc *func;//
+public:
+ Call(int line, Proc *func) : Code(line, PROC), func(func) { ; }
+ virtual void code(FILE* fp) {
+ Code::code(fp);
+ //printf("call\t$%04x;%s\n", func->offset, func->name.c_str());
+ //fwrite(&opt, sizeof(BYTE), 1, fp);
+ }
+};
+
+class Halt: public Code {
+public:
+ Halt(int line) : Code(line, HALT) { ; }
virtual void code(FILE* fp){
Code::code(fp);
- printf("unary\t$%02x $%02x $%02x\n", opt, reg1, reg2);
- fwrite(&opt, sizeof(BYTE), 1, fp);
- fwrite(®1, sizeof(BYTE), 1, fp);
- fwrite(®2, sizeof(BYTE), 1, fp);
+ //printf("halt\t$%02x\n", opt);
+ //fwrite(&opt, sizeof(BYTE), 1, fp);
}
};
\ No newline at end of file
diff --git a/Asm/lexer.h b/Asm/lexer.h
index 34a6c78..477a015 100644
--- a/Asm/lexer.h
+++ b/Asm/lexer.h
@@ -6,6 +6,7 @@
#include
#include
#include