#include #include #include #include #include "assemble.h" #include "execute.h" using namespace std; struct area { char *base; char *curp; }; // change endian big to this machine unsigned long long big_to_this(char *in, int size){ unsigned long long out = 0; for(int i = 0; i < size; i++){ out = out * 0x100 + (unsigned char)in[i]; } return out; } int main(int argc, char** argv){ if(argc < 2){ cout << "入力ファイルを指定して下さい" << endl; } ifstream ifs(argv[1]); if(ifs.fail()){ cout << "入力ファイルがありません : " << argv[1] << endl; return -1; } char buf[8]; unsigned char code; int size; Buff conspool((char *)calloc(1000, 1)); ifs.read(buf, 2); // conspools int conspools = (int)big_to_this(buf, 2); char *charseq; for(int i = 0; i < conspools; i++){ ifs.read((char *)&code, 1); ifs.read(buf, 2); size = big_to_this(buf, 2); switch(code){ case _charseq: charseq = (char *)calloc(size, 1); ifs.read(charseq, size); *(string **)conspool.curr = new string(charseq, size); conspool.curr += 4; break; case _string: *(char **)conspool.curr = (char *)conspool.base + size * 4; conspool.curr += 4; break; } } Buff stack((char *)calloc(1000, 1)); ifs.read(buf, 2); // locals int locals = (int)big_to_this(buf, 2); stack.curr += locals * 4; int i1, i2; long long l1, l2; double d1, d2; while(true){ size = 1; ifs.read((char *)&code, 1); if(ifs.eof()) break; switch(code){ case print_iu: stack.curr -= 4; cout << *(unsigned int *)stack.curr << endl; break; case print_is: stack.curr -= 4; cout << *(int *)stack.curr << endl; break; case print_lu: stack.curr -= 8; cout << *(unsigned long long *)stack.curr << endl; break; case print_ls: stack.curr -= 8; cout << *(long long *)stack.curr << endl; break; case print_ds: stack.curr -= 8; cout << *(double *)stack.curr << endl; break; case print_st: stack.curr -= 4; cout << **(string **)stack.curr << endl; break; case push_lu: case push_ls: case push_ds: size *= 2; case push_iu: case push_is: size *= 2; case push_cu: size *= 2; case push_bu: ifs.read(buf, size); if(size <= 4){ *(unsigned int *)stack.curr = (unsigned int)big_to_this(buf, size); stack.curr += 4; }else{ *(unsigned long long *)stack.curr = big_to_this(buf, 8); stack.curr += 8; } break; case push_pt: ifs.read(buf, 2); size = (int)big_to_this(buf, 2); *(char **)stack.curr = *(char **)(conspool.base + size * 4); stack.curr += 4; break; case stor_lu: case stor_ls: case stor_ds: size *= 2; case stor_iu: case stor_is: case stor_pt: size *= 4; ifs.read(buf, 2); size = (int)big_to_this(buf, 2); memcpy((void *)(stack.base + size * 4), (const void *)stack.curr, size); stack.curr -= size; break; case load_ls: case load_lu: case load_ds: size *= 2; case load_iu: case load_is: case load_pt: size *= 4; ifs.read(buf, 2); size = (int)big_to_this(buf, 2); memcpy((void *)stack.curr, (const void*)(stack.base + size * 4), size); stack.curr += size; break; case add_iu: stack.curr -= 4; i1 = *(unsigned int *)(stack.curr); stack.curr -= 4; i2 = *(unsigned int *)(stack.curr); *(unsigned int *)stack.curr = i1 + i2; stack.curr += 4; break; case add_is: stack.curr -= 4; i1 = *(int *)(stack.curr); stack.curr -= 4; i2 = *(int *)(stack.curr); *(int *)stack.curr = i1 + i2; stack.curr += 4; break; case add_lu: stack.curr -= 8; l1 = *(unsigned long long *)stack.curr; stack.curr -= 8; l2 = *(unsigned long long *)stack.curr; *(unsigned long long *)stack.curr = l1 + l2; stack.curr += 8; break; case add_ls: stack.curr -= 8; l1 = *(long long *)stack.curr; stack.curr -= 8; l2 = *(long long *)stack.curr; *(long long *)stack.curr = l1 + l2; stack.curr += 8; break; case add_ds: stack.curr -= 8; d1 = *(double *)stack.curr; stack.curr -= 8; d2 = *(double *)stack.curr; *(double *)stack.curr = d1 + d2; stack.curr += 8; break; } } }