Command interpetation
This commit is contained in:
parent
b5f8ed9456
commit
55baaa8952
BIN
example.exe
BIN
example.exe
Binary file not shown.
616
ntfiles.h
616
ntfiles.h
@ -24,12 +24,616 @@
|
|||||||
#if (!defined(__LIB_ntfiles_H))
|
#if (!defined(__LIB_ntfiles_H))
|
||||||
#define __LIB_ntfiles_H
|
#define __LIB_ntfiles_H
|
||||||
|
|
||||||
typedef unsigned char __e_byte_t;
|
typedef unsigned char byte_t;
|
||||||
|
typedef unsigned short int word_t;
|
||||||
|
|
||||||
typedef struct {
|
#if defined(__LP64__) || defined(_M_IA64)
|
||||||
__e_byte_t e_magic[3];
|
typedef unsigned int dword_t;
|
||||||
__e_byte_t e_filesize[4];
|
typedef unsigned long int qword_t;
|
||||||
__e_byte_t e_memorysize[2];
|
#else
|
||||||
} __e_image_header_t;
|
typedef unsigned long int dword_t;
|
||||||
|
typedef unsigned long long int qword_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef signed char sbyte_t;
|
||||||
|
typedef signed short int sword_t;
|
||||||
|
|
||||||
|
#if defined(__LP64__) || defined(_M_IA64)
|
||||||
|
typedef signed int sdword_t;
|
||||||
|
typedef signed long int sqword_t;
|
||||||
|
#else
|
||||||
|
typedef signed long int sdword_t;
|
||||||
|
typedef signed long long int sqword_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define stack __ntsys_stack
|
||||||
|
#define sp __ntsys_stack_pointer
|
||||||
|
#define buf __ntsys_buffer
|
||||||
|
#define cnt __ntsys_buffer_ptr
|
||||||
|
#define ip __ntsys_buffer_ptr
|
||||||
|
|
||||||
|
static void push(void) {
|
||||||
|
size_t size = buf[cnt];
|
||||||
|
sp -= size;
|
||||||
|
size_t t = 0;
|
||||||
|
while (t < size) {
|
||||||
|
stack[sp + t] = buf[++cnt];
|
||||||
|
t ++;
|
||||||
|
}
|
||||||
|
cnt ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pop(void) {
|
||||||
|
sp += buf[cnt++];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void push_str(void) {
|
||||||
|
size_t size = 0;
|
||||||
|
while (buf[cnt] != 0) {
|
||||||
|
size ++;
|
||||||
|
cnt ++;
|
||||||
|
}
|
||||||
|
size ++;
|
||||||
|
cnt -= size;
|
||||||
|
sp -= size;
|
||||||
|
size_t t = 0;
|
||||||
|
while (t < size) {
|
||||||
|
stack[sp + t] = buf[++cnt];
|
||||||
|
t ++;
|
||||||
|
}
|
||||||
|
cnt ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
__e_byte_t arg1_fGH6VSEzu7qNiGVE[8];
|
||||||
|
__e_byte_t arg2_fGH6VSEzu7qNiGVE[8];
|
||||||
|
|
||||||
|
#define arg1 arg1_fGH6VSEzu7qNiGVE
|
||||||
|
#define arg2 arg2_fGH6VSEzu7qNiGVE
|
||||||
|
|
||||||
|
static void pop_arg(size_t size, __e_byte_t* arg) {
|
||||||
|
int __i = 1;
|
||||||
|
if (!(*((char *)&__i) == 1)) {
|
||||||
|
/* BIG ENDIAN */
|
||||||
|
size_t i = 0;
|
||||||
|
while (i < size) {
|
||||||
|
arg[size - i - 1] = stack[sp + i];
|
||||||
|
i ++;
|
||||||
|
}
|
||||||
|
sp += size;
|
||||||
|
} else {
|
||||||
|
/* LITTLE ENDIAN */
|
||||||
|
size_t i = 0;
|
||||||
|
while (i < size) {
|
||||||
|
arg[i] = stack[sp + i];
|
||||||
|
i ++;
|
||||||
|
}
|
||||||
|
sp += size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void nt_not() {
|
||||||
|
size_t size = buf[cnt++];
|
||||||
|
pop_arg(size, arg1);
|
||||||
|
sp -= size;
|
||||||
|
size_t i = 0;
|
||||||
|
while (i < size) {
|
||||||
|
stack[sp + i] = ~arg1[i];
|
||||||
|
i ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void operation(__e_byte_t op) {
|
||||||
|
size_t size = buf[cnt++];
|
||||||
|
pop_arg(size & 0x0F, arg1);
|
||||||
|
pop_arg(size & 0x0F, arg2);
|
||||||
|
switch (op) {
|
||||||
|
case 1:
|
||||||
|
switch (size) {
|
||||||
|
case 0x01:
|
||||||
|
*(byte_t*)arg1 = *(byte_t*)arg1 + *(byte_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
*(word_t*)arg1 = *(word_t*)arg1 + *(word_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0x04:
|
||||||
|
*(dword_t*)arg1 = *(dword_t*)arg1 + *(dword_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0x08:
|
||||||
|
*(qword_t*)arg1 = *(qword_t*)arg1 + *(qword_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0xF1:
|
||||||
|
*(sbyte_t*)arg1 = *(sbyte_t*)arg1 + *(sbyte_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0xF2:
|
||||||
|
*(sword_t*)arg1 = *(sword_t*)arg1 + *(sword_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0xF4:
|
||||||
|
*(sdword_t*)arg1 = *(sdword_t*)arg1 + *(sdword_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0xF8:
|
||||||
|
*(sqword_t*)arg1 = *(sqword_t*)arg1 + *(sqword_t*)arg2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
switch (size) {
|
||||||
|
case 0x01:
|
||||||
|
*(byte_t*)arg1 = *(byte_t*)arg1 - *(byte_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
*(word_t*)arg1 = *(word_t*)arg1 - *(word_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0x04:
|
||||||
|
*(dword_t*)arg1 = *(dword_t*)arg1 - *(dword_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0x08:
|
||||||
|
*(qword_t*)arg1 = *(qword_t*)arg1 - *(qword_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0xF1:
|
||||||
|
*(sbyte_t*)arg1 = *(sbyte_t*)arg1 - *(sbyte_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0xF2:
|
||||||
|
*(sword_t*)arg1 = *(sword_t*)arg1 - *(sword_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0xF4:
|
||||||
|
*(sdword_t*)arg1 = *(sdword_t*)arg1 - *(sdword_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0xF8:
|
||||||
|
*(sqword_t*)arg1 = *(sqword_t*)arg1 - *(sqword_t*)arg2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
switch (size) {
|
||||||
|
case 0x01:
|
||||||
|
*(byte_t*)arg1 = *(byte_t*)arg1 * (*(byte_t*)arg2);
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
*(word_t*)arg1 = *(word_t*)arg1 * (*(byte_t*)arg2);
|
||||||
|
break;
|
||||||
|
case 0x04:
|
||||||
|
*(dword_t*)arg1 = *(dword_t*)arg1 * (*(byte_t*)arg2);
|
||||||
|
break;
|
||||||
|
case 0x08:
|
||||||
|
*(qword_t*)arg1 = *(qword_t*)arg1 * (*(byte_t*)arg2);
|
||||||
|
break;
|
||||||
|
case 0xF1:
|
||||||
|
*(sbyte_t*)arg1 = *(sbyte_t*)arg1 * (*(byte_t*)arg2);
|
||||||
|
break;
|
||||||
|
case 0xF2:
|
||||||
|
*(sword_t*)arg1 = *(sword_t*)arg1 * (*(byte_t*)arg2);
|
||||||
|
break;
|
||||||
|
case 0xF4:
|
||||||
|
*(sdword_t*)arg1 = *(sdword_t*)arg1 * (*(byte_t*)arg2);
|
||||||
|
break;
|
||||||
|
case 0xF8:
|
||||||
|
*(sqword_t*)arg1 = *(sqword_t*)arg1 * (*(byte_t*)arg2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
switch (size) {
|
||||||
|
case 0x01:
|
||||||
|
*(byte_t*)arg1 = *(byte_t*)arg1 / *(byte_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
*(word_t*)arg1 = *(word_t*)arg1 / *(word_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0x04:
|
||||||
|
*(dword_t*)arg1 = *(dword_t*)arg1 / *(dword_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0x08:
|
||||||
|
*(qword_t*)arg1 = *(qword_t*)arg1 / *(qword_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0xF1:
|
||||||
|
*(sbyte_t*)arg1 = *(sbyte_t*)arg1 / *(sbyte_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0xF2:
|
||||||
|
*(sword_t*)arg1 = *(sword_t*)arg1 / *(sword_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0xF4:
|
||||||
|
*(sdword_t*)arg1 = *(sdword_t*)arg1 / *(sdword_t*)arg2;
|
||||||
|
break;
|
||||||
|
case 0xF8:
|
||||||
|
*(sqword_t*)arg1 = *(sqword_t*)arg1 / *(sqword_t*)arg2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sp -= size & 0x0F;
|
||||||
|
size_t i = 0;
|
||||||
|
while (i < (size & 0x0F)) {
|
||||||
|
stack[sp + i] = arg1[i];
|
||||||
|
i ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void add(void) {
|
||||||
|
operation(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sub(void) {
|
||||||
|
operation(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mul(void) {
|
||||||
|
operation(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void div_r(void) {
|
||||||
|
operation(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void logic_operation(__e_byte_t n) {
|
||||||
|
size_t size = buf[cnt++];
|
||||||
|
pop_arg(size, arg1);
|
||||||
|
pop_arg(size, arg2);
|
||||||
|
switch (n) {
|
||||||
|
case 1:
|
||||||
|
switch (size) {
|
||||||
|
case 0x01:
|
||||||
|
*(byte_t*)arg1 = *(byte_t*)arg1 >> *(byte_t*)arg2;
|
||||||
|
case 0x02:
|
||||||
|
*(word_t*)arg1 = *(word_t*)arg1 >> *(word_t*)arg2;
|
||||||
|
case 0x04:
|
||||||
|
*(dword_t*)arg1 = *(dword_t*)arg1 >> *(dword_t*)arg2;
|
||||||
|
case 0x08:
|
||||||
|
*(qword_t*)arg1 = *(qword_t*)arg1 >> *(qword_t*)arg2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
switch (size) {
|
||||||
|
case 0x01:
|
||||||
|
*(byte_t*)arg1 = *(byte_t*)arg1 << *(byte_t*)arg2;
|
||||||
|
case 0x02:
|
||||||
|
*(word_t*)arg1 = *(word_t*)arg1 << *(word_t*)arg2;
|
||||||
|
case 0x04:
|
||||||
|
*(dword_t*)arg1 = *(dword_t*)arg1 << *(dword_t*)arg2;
|
||||||
|
case 0x08:
|
||||||
|
*(qword_t*)arg1 = *(qword_t*)arg1 << *(qword_t*)arg2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
switch (size) {
|
||||||
|
case 0x01:
|
||||||
|
*(byte_t*)arg1 = *(byte_t*)arg1 | *(byte_t*)arg2;
|
||||||
|
case 0x02:
|
||||||
|
*(word_t*)arg1 = *(word_t*)arg1 | *(word_t*)arg2;
|
||||||
|
case 0x04:
|
||||||
|
*(dword_t*)arg1 = *(dword_t*)arg1 | *(dword_t*)arg2;
|
||||||
|
case 0x08:
|
||||||
|
*(qword_t*)arg1 = *(qword_t*)arg1 | *(qword_t*)arg2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
switch (size) {
|
||||||
|
case 0x01:
|
||||||
|
*(byte_t*)arg1 = *(byte_t*)arg1 & *(byte_t*)arg2;
|
||||||
|
case 0x02:
|
||||||
|
*(word_t*)arg1 = *(word_t*)arg1 & *(word_t*)arg2;
|
||||||
|
case 0x04:
|
||||||
|
*(dword_t*)arg1 = *(dword_t*)arg1 & *(dword_t*)arg2;
|
||||||
|
case 0x08:
|
||||||
|
*(qword_t*)arg1 = *(qword_t*)arg1 & *(qword_t*)arg2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
switch (size) {
|
||||||
|
case 0x01:
|
||||||
|
*(byte_t*)arg1 = *(byte_t*)arg1 ^ *(byte_t*)arg2;
|
||||||
|
case 0x02:
|
||||||
|
*(word_t*)arg1 = *(word_t*)arg1 ^ *(word_t*)arg2;
|
||||||
|
case 0x04:
|
||||||
|
*(dword_t*)arg1 = *(dword_t*)arg1 ^ *(dword_t*)arg2;
|
||||||
|
case 0x08:
|
||||||
|
*(qword_t*)arg1 = *(qword_t*)arg1 ^ *(qword_t*)arg2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sp -= size;
|
||||||
|
size_t i = 0;
|
||||||
|
while (i < size) {
|
||||||
|
stack[sp + i] = arg1[i];
|
||||||
|
i ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void nt_shr(void) {
|
||||||
|
logic_operation(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void nt_shl(void) {
|
||||||
|
logic_operation(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void nt_or(void) {
|
||||||
|
logic_operation(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void nt_and(void) {
|
||||||
|
logic_operation(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void nt_xor(void) {
|
||||||
|
logic_operation(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void nt_goto(void) {
|
||||||
|
pop_arg(2, arg1);
|
||||||
|
cnt = *(word_t*)arg1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bez_bnez(__e_byte_t mode) {
|
||||||
|
size_t size = buf[cnt++];
|
||||||
|
pop_arg(size & 0x0F, arg1);
|
||||||
|
__e_byte_t res = 0;
|
||||||
|
switch (size) {
|
||||||
|
case 0x01:
|
||||||
|
if (*(byte_t*)arg1 == 0) res = 1;
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
if (*(word_t*)arg1 == 0) res = 1;
|
||||||
|
break;
|
||||||
|
case 0x04:
|
||||||
|
if (*(dword_t*)arg1 == 0) res = 1;
|
||||||
|
break;
|
||||||
|
case 0x08:
|
||||||
|
if (*(qword_t*)arg1 == 0) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF1:
|
||||||
|
if (*(sbyte_t*)arg1 == 0) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF2:
|
||||||
|
if (*(sword_t*)arg1 == 0) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF4:
|
||||||
|
if (*(sdword_t*)arg1 == 0) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF8:
|
||||||
|
if (*(sqword_t*)arg1 == 0) res = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (mode) res = !res;
|
||||||
|
pop_arg(2, arg2);
|
||||||
|
if (res) {
|
||||||
|
cnt = *(word_t*)arg2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void push_arg(size_t size, __e_byte_t* arg) {
|
||||||
|
sp -= size;
|
||||||
|
size_t i = 0;
|
||||||
|
while (i < size) {
|
||||||
|
stack[sp + i] = arg[i];
|
||||||
|
i ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void n_up_down_eq(__e_byte_t mode) {
|
||||||
|
size_t size = buf[cnt++];
|
||||||
|
pop_arg(size & 0x0F, arg1);
|
||||||
|
pop_arg(size & 0x0F, arg2);
|
||||||
|
__e_byte_t res = 0;
|
||||||
|
switch (mode & 0x0F) {
|
||||||
|
case 0:
|
||||||
|
switch (size) {
|
||||||
|
case 0x01:
|
||||||
|
if (*(byte_t*)arg1 == *(byte_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
if (*(word_t*)arg1 == *(word_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0x04:
|
||||||
|
if (*(dword_t*)arg1 == *(dword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0x08:
|
||||||
|
if (*(qword_t*)arg1 == *(qword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF1:
|
||||||
|
if (*(qword_t*)arg1 == *(qword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF2:
|
||||||
|
if (*(sword_t*)arg1 == *(sword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF4:
|
||||||
|
if (*(sdword_t*)arg1 == *(sdword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF8:
|
||||||
|
if (*(sqword_t*)arg1 == *(sqword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
switch (size) {
|
||||||
|
case 0x01:
|
||||||
|
if (*(byte_t*)arg1 > *(byte_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
if (*(word_t*)arg1 > *(word_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0x04:
|
||||||
|
if (*(dword_t*)arg1 > *(dword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0x08:
|
||||||
|
if (*(qword_t*)arg1 > *(qword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF1:
|
||||||
|
if (*(qword_t*)arg1 > *(qword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF2:
|
||||||
|
if (*(sword_t*)arg1 > *(sword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF4:
|
||||||
|
if (*(sdword_t*)arg1 > *(sdword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF8:
|
||||||
|
if (*(sqword_t*)arg1 > *(sqword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
switch (size) {
|
||||||
|
case 0x01:
|
||||||
|
if (*(byte_t*)arg1 < *(byte_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
if (*(word_t*)arg1 < *(word_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0x04:
|
||||||
|
if (*(dword_t*)arg1 < *(dword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0x08:
|
||||||
|
if (*(qword_t*)arg1 < *(qword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF1:
|
||||||
|
if (*(qword_t*)arg1 < *(qword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF2:
|
||||||
|
if (*(sword_t*)arg1 < *(sword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF4:
|
||||||
|
if (*(sdword_t*)arg1 < *(sdword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
case 0xF8:
|
||||||
|
if (*(sqword_t*)arg1 < *(sqword_t*)arg2) res = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ((mode & 0xF0) == 0xF0) res = !res;
|
||||||
|
pop_arg(2, arg2);
|
||||||
|
if (res) {
|
||||||
|
cnt = *(word_t*)arg2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void eq(void) {
|
||||||
|
n_up_down_eq(0x00);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void neq(void) {
|
||||||
|
n_up_down_eq(0xF0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void up(void) {
|
||||||
|
n_up_down_eq(0x01);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void down(void) {
|
||||||
|
n_up_down_eq(0x02);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void upne(void) {
|
||||||
|
n_up_down_eq(0xF1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void downe(void) {
|
||||||
|
n_up_down_eq(0xF2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bnez(void) {
|
||||||
|
bez_bnez(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void bez(void) {
|
||||||
|
bez_bnez(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mwrt(void) {
|
||||||
|
size_t size = buf[cnt++];
|
||||||
|
pop_arg(2, arg1);
|
||||||
|
pop_arg(size, arg2);
|
||||||
|
word_t pos = *(word_t*)arg1;
|
||||||
|
size_t i = 0;
|
||||||
|
while (i < size) {
|
||||||
|
stack[i + pos] = arg2[i];
|
||||||
|
i ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mrd(void) {
|
||||||
|
size_t size = buf[cnt++];
|
||||||
|
pop_arg(2, arg1);
|
||||||
|
word_t pos = *(word_t*)arg1;
|
||||||
|
sp -= size;
|
||||||
|
size_t i = 0;
|
||||||
|
while (i < size) {
|
||||||
|
stack[sp + i] = stack[pos + i];
|
||||||
|
i ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void get_sp(void) {
|
||||||
|
push_arg(2, (__e_byte_t*)&sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_sp(void) {
|
||||||
|
pop_arg(2, arg1);
|
||||||
|
sp = *(word_t*)arg1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static word_t get_pop_sp_word(void) {
|
||||||
|
pop_arg(2, arg1);
|
||||||
|
return *(word_t*)arg1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static byte_t get_pop_sp_byte(void) {
|
||||||
|
pop_arg(1, arg1);
|
||||||
|
return *(byte_t*)arg1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void nt_fs_syscall(void) {
|
||||||
|
switch (get_pop_sp_byte()) {
|
||||||
|
case 0x00:
|
||||||
|
{
|
||||||
|
fputs((char*)stack + sp, stdout);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x01:
|
||||||
|
{
|
||||||
|
char ch = getchar();
|
||||||
|
pop_arg(1, (__e_byte_t*)&ch);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x02:
|
||||||
|
{
|
||||||
|
fGH6VSEzu7qNiGVE_stat = get_pop_sp_word();
|
||||||
|
cnt = __ntsys_buffer_size - 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void (*fn_fGH6VSEzu7qNiGVE[])(void) = {
|
||||||
|
/* Операции со стеком (0 - 2) */
|
||||||
|
push, pop, push_str,
|
||||||
|
/* Арифметические операции (3 - 6) */
|
||||||
|
add, sub, mul, div_r,
|
||||||
|
/* Логические операции (7 - 12) */
|
||||||
|
nt_not, nt_shr, nt_shl, nt_or,
|
||||||
|
nt_and, nt_xor,
|
||||||
|
/* Переход (13) */
|
||||||
|
nt_goto,
|
||||||
|
/* Условия (14 - 21) */
|
||||||
|
bnez, bez,
|
||||||
|
up, down,
|
||||||
|
eq, neq,
|
||||||
|
upne, downe,
|
||||||
|
/* Работа с памятью (22 - 23) */
|
||||||
|
mwrt, mrd,
|
||||||
|
/* Адресация на стеке (24 - 25) */
|
||||||
|
get_sp, set_sp,
|
||||||
|
/* Системные вызовы (26) */
|
||||||
|
nt_fs_syscall
|
||||||
|
};
|
||||||
|
|
||||||
|
#undef stack
|
||||||
|
#undef sp
|
||||||
|
#undef buf
|
||||||
|
#undef cnt
|
||||||
|
#undef ip
|
||||||
|
|
||||||
|
#undef arg1
|
||||||
|
#undef arg2
|
||||||
|
|
||||||
#endif /* __LIB_ntfiles_H */
|
#endif /* __LIB_ntfiles_H */
|
||||||
91
ntsys.h
91
ntsys.h
@ -33,7 +33,14 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "ntfiles.h"
|
|
||||||
|
typedef unsigned char __e_byte_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
__e_byte_t e_magic[3];
|
||||||
|
__e_byte_t e_filesize[4];
|
||||||
|
__e_byte_t e_memorysize[2];
|
||||||
|
} __e_image_header_t;
|
||||||
|
|
||||||
#if (!defined(EXIT_SUCCESS))
|
#if (!defined(EXIT_SUCCESS))
|
||||||
#define EXIT_SUCCESS 0
|
#define EXIT_SUCCESS 0
|
||||||
@ -43,6 +50,16 @@
|
|||||||
#define EXIT_FAILURE 1
|
#define EXIT_FAILURE 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
__e_byte_t* __ntsys_stack = NULL;
|
||||||
|
unsigned int __ntsys_stack_pointer = 0;
|
||||||
|
__e_byte_t* __ntsys_buffer = NULL;
|
||||||
|
size_t __ntsys_buffer_size = 0;
|
||||||
|
unsigned int __ntsys_buffer_ptr = 0;
|
||||||
|
int fGH6VSEzu7qNiGVE_stat = EXIT_SUCCESS;
|
||||||
|
|
||||||
|
|
||||||
|
#include "ntfiles.h"
|
||||||
|
|
||||||
static void ntsys_error(char* _err) {
|
static void ntsys_error(char* _err) {
|
||||||
printf("\033[1mntsys: \033[91m%s\033[0m\n", _err);
|
printf("\033[1mntsys: \033[91m%s\033[0m\n", _err);
|
||||||
}
|
}
|
||||||
@ -61,15 +78,52 @@ static void __help(void) {
|
|||||||
" " "--help / -h - show this help" "\n"
|
" " "--help / -h - show this help" "\n"
|
||||||
" " "--version / -v - show version" "\n"
|
" " "--version / -v - show version" "\n"
|
||||||
" " "--asm / -a - compile assembler program" "\n"
|
" " "--asm / -a - compile assembler program" "\n"
|
||||||
" " "--out / -o - set output file name" "\0"
|
" " "--out / -o - set output file name" "\n"
|
||||||
|
" " "--debug / -d - display debugging info" "\0"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
static int __exe_run(__e_byte_t* memory, unsigned int memorysize, unsigned long filesize, FILE* fp, __e_byte_t debug) {
|
||||||
static int __exe_run(__e_byte_t* memory, unsigned int memorysize, unsigned long filesize, FILE* fp) {
|
__ntsys_stack_pointer = memorysize;
|
||||||
|
__ntsys_stack = memory;
|
||||||
|
__e_byte_t* buff = malloc(filesize - 8);
|
||||||
|
__ntsys_buffer = buff;
|
||||||
|
__ntsys_buffer_size = fread(buff, 1, filesize - 8, fp);
|
||||||
|
__ntsys_buffer_ptr = 0;
|
||||||
|
if (!debug) {
|
||||||
|
while (__ntsys_buffer_ptr < __ntsys_buffer_size) {
|
||||||
|
__e_byte_t cmd = buff[__ntsys_buffer_ptr];
|
||||||
|
__ntsys_buffer_ptr ++;
|
||||||
|
fn_fGH6VSEzu7qNiGVE[cmd]();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
putchar('\n');
|
||||||
|
while (__ntsys_buffer_ptr < __ntsys_buffer_size) {
|
||||||
|
__e_byte_t cmd = buff[__ntsys_buffer_ptr];
|
||||||
|
fprintf(stdout, "Command %d 0x%X\n"
|
||||||
|
"Position %d 0x%X\n"
|
||||||
|
"Stack point %d 0x%X\n\n"
|
||||||
|
, cmd, cmd,
|
||||||
|
__ntsys_buffer_ptr, __ntsys_buffer_ptr,
|
||||||
|
__ntsys_stack_pointer, __ntsys_stack_pointer);
|
||||||
|
__ntsys_buffer_ptr ++;
|
||||||
|
fn_fGH6VSEzu7qNiGVE[cmd]();
|
||||||
|
FILE* df = fopen("dump.bin", "wb");
|
||||||
|
if (df == NULL) {
|
||||||
|
ntsys_error("Cannot open dump file!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
fwrite(__ntsys_stack, 1, memorysize, df);
|
||||||
|
fclose(df);
|
||||||
|
puts("Press any key to continue...");
|
||||||
|
getchar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(buff);
|
||||||
|
if (fGH6VSEzu7qNiGVE_stat != EXIT_SUCCESS) return fGH6VSEzu7qNiGVE_stat;
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ntsys_api_call(char* filename) {
|
int ntsys_api_call(char* filename, unsigned char debug) {
|
||||||
|
|
||||||
/* File data */
|
/* File data */
|
||||||
|
|
||||||
@ -78,7 +132,7 @@ int ntsys_api_call(char* filename) {
|
|||||||
|
|
||||||
/* Parser */
|
/* Parser */
|
||||||
|
|
||||||
FILE* fp = fopen(filename, "r");
|
FILE* fp = fopen(filename, "rb");
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
ntsys_error("Cannot open file!");
|
ntsys_error("Cannot open file!");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
@ -89,8 +143,8 @@ int ntsys_api_call(char* filename) {
|
|||||||
head.e_magic[2] = (__e_byte_t)0;
|
head.e_magic[2] = (__e_byte_t)0;
|
||||||
int __i = 1;
|
int __i = 1;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
if (*((char *)&__i) == 1) {
|
if (!(*((char *)&__i) == 1)) {
|
||||||
/* LITTLE ENDIAN */
|
/* BIG ENDIAN */
|
||||||
head.e_memorysize[0] = head_bin[7];
|
head.e_memorysize[0] = head_bin[7];
|
||||||
head.e_memorysize[1] = head_bin[6];
|
head.e_memorysize[1] = head_bin[6];
|
||||||
i = 3;
|
i = 3;
|
||||||
@ -100,7 +154,7 @@ int ntsys_api_call(char* filename) {
|
|||||||
i --;
|
i --;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* BIG ENDIAN */
|
/* LITTLE ENDIAN */
|
||||||
head.e_memorysize[0] = head_bin[6];
|
head.e_memorysize[0] = head_bin[6];
|
||||||
head.e_memorysize[1] = head_bin[7];
|
head.e_memorysize[1] = head_bin[7];
|
||||||
while (i != 4) {
|
while (i != 4) {
|
||||||
@ -114,15 +168,26 @@ int ntsys_api_call(char* filename) {
|
|||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
unsigned long int filesize = 0;
|
unsigned long int filesize = 0;
|
||||||
|
if (sizeof(dword_t) != 4 || sizeof(qword_t) != 8 || sizeof(word_t) != 2) goto __exit_datatype_error;
|
||||||
switch (4) {
|
switch (4) {
|
||||||
case sizeof(NAME_OF_64_BITS_TYPE): filesize = *((NAME_OF_64_BITS_TYPE*)head.e_filesize); break;
|
case sizeof(NAME_OF_64_BITS_TYPE): filesize = *((NAME_OF_64_BITS_TYPE*)head.e_filesize); break;
|
||||||
case sizeof(NAME_OF_32_BITS_TYPE): filesize = *((NAME_OF_32_BITS_TYPE*)head.e_filesize); break;
|
case sizeof(NAME_OF_32_BITS_TYPE): filesize = *((NAME_OF_32_BITS_TYPE*)head.e_filesize); break;
|
||||||
default:
|
default:
|
||||||
|
__exit_datatype_error:
|
||||||
ntsys_error("Unknown data type! You must recompile the program and specify a different type.");
|
ntsys_error("Unknown data type! You must recompile the program and specify a different type.");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
unsigned int mem_size = (unsigned int)*((NAME_OF_16_BITS_TYPE*)head.e_memorysize);
|
||||||
__e_byte_t* memory = malloc(*((NAME_OF_16_BITS_TYPE*)head.e_memorysize));
|
__e_byte_t* memory = malloc(*((NAME_OF_16_BITS_TYPE*)head.e_memorysize));
|
||||||
int stat = __exe_run(memory, (unsigned int)*((NAME_OF_16_BITS_TYPE*)head.e_memorysize), filesize, fp);
|
if (memory == NULL) {
|
||||||
|
ntsys_error("Out of memory!");
|
||||||
|
return EXIT_FAILURE;
|
||||||
|
}
|
||||||
|
if (debug) {
|
||||||
|
printf("File size %lu 0x%lX\n", filesize, filesize);
|
||||||
|
printf("Memory size %u 0x%X\n", mem_size, mem_size);
|
||||||
|
}
|
||||||
|
int stat = __exe_run(memory, mem_size, filesize, fp, debug);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
free(memory);
|
free(memory);
|
||||||
return stat;
|
return stat;
|
||||||
@ -138,12 +203,16 @@ int _lib_ntsys_main(int argc, char** argv) {
|
|||||||
char* asm_out = "out.exe";
|
char* asm_out = "out.exe";
|
||||||
char mode = 'R';
|
char mode = 'R';
|
||||||
unsigned char out = 0;
|
unsigned char out = 0;
|
||||||
|
unsigned char debug = 0;
|
||||||
while (t < argc) {
|
while (t < argc) {
|
||||||
char* str = argv[t];
|
char* str = argv[t];
|
||||||
if (str[0] == '-') {
|
if (str[0] == '-') {
|
||||||
unsigned char f = 0;
|
unsigned char f = 0;
|
||||||
if (str[1] == '-') f = 1;
|
if (str[1] == '-') f = 1;
|
||||||
switch (str[1 + f]) {
|
switch (str[1 + f]) {
|
||||||
|
case 'd':
|
||||||
|
debug = 1;
|
||||||
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
__help();
|
__help();
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
@ -175,7 +244,7 @@ int _lib_ntsys_main(int argc, char** argv) {
|
|||||||
ntsys_error("Please specify the file name!");
|
ntsys_error("Please specify the file name!");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
if (mode == 'R') return ntsys_api_call(filename);
|
if (mode == 'R') return ntsys_api_call(filename, debug);
|
||||||
return ntsys_compile_asm(filename, asm_out);
|
return ntsys_compile_asm(filename, asm_out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
BIN
test/arifmetic_operation_test.exe
Normal file
BIN
test/arifmetic_operation_test.exe
Normal file
Binary file not shown.
BIN
test/goto_operator_test.exe
Normal file
BIN
test/goto_operator_test.exe
Normal file
Binary file not shown.
BIN
test/if_goto_operation_test.exe
Normal file
BIN
test/if_goto_operation_test.exe
Normal file
Binary file not shown.
BIN
test/logic_operation_test.exe
Normal file
BIN
test/logic_operation_test.exe
Normal file
Binary file not shown.
BIN
test/memory_read_write_test.exe
Normal file
BIN
test/memory_read_write_test.exe
Normal file
Binary file not shown.
BIN
test/syscall_test.exe
Normal file
BIN
test/syscall_test.exe
Normal file
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user