Minor refactoring of UXN and ASM...

This commit is contained in:
xolatile
2024-11-15 03:16:58 -05:00
parent e1d5794d41
commit d746cc3586
5 changed files with 514 additions and 477 deletions

View File

@ -22,59 +22,65 @@
#define SHIFT_BEGIN (ROL)
#define SHIFT_END (SAR)
#if DEBUG == 1
static const char * size_name [] = {
"\033[1;36md8 \033[0m", "\033[1;36md16\033[0m", "\033[1;36md32\033[0m", "\033[1;36md64\033[0m"
"d8", "d16", "d32", "d64"
};
static const char * type_name [] = {
"\033[1;34mrel\033[0m", "\033[1;34mreg\033[0m", "\033[1;34mmem\033[0m", "\033[1;34mimm\033[0m"
"rel", "reg", "mem", "imm"
};
static const char * data_name [] = {
"\033[1;33masmdirmem\033[0m", "\033[1;33masmdirrel\033[0m", "\033[1;33masmdirimm\033[0m", "\033[1;33masmdirrep\033[0m",
"\033[1;33madd\033[0m", "\033[1;33mor\033[0m", "\033[1;33madc\033[0m", "\033[1;33msbb\033[0m",
"\033[1;33mand\033[0m", "\033[1;33msub\033[0m", "\033[1;33mxor\033[0m", "\033[1;33mcmp\033[0m",
"\033[1;33minc\033[0m", "\033[1;33mdec\033[0m", "\033[1;33mnot\033[0m", "\033[1;33mneg\033[0m",
"\033[1;33mmul\033[0m", "\033[1;33mimul\033[0m", "\033[1;33mdiv\033[0m", "\033[1;33midiv\033[0m",
"\033[1;33mfadd\033[0m", "\033[1;33mfmul\033[0m", "\033[1;33mfcom\033[0m", "\033[1;33mfcomp\033[0m",
"\033[1;33mfsub\033[0m", "\033[1;33mfsubr\033[0m", "\033[1;33mfdiv\033[0m", "\033[1;33mfdivr\033[0m",
"\033[1;33mrol\033[0m", "\033[1;33mror\033[0m", "\033[1;33mrcl\033[0m", "\033[1;33mrcr\033[0m",
"\033[1;33msal\033[0m", "\033[1;33mshr\033[0m", "\033[1;33mshl\033[0m", "\033[1;33msar\033[0m",
"\033[1;33mnop\033[0m", "\033[1;33mretn\033[0m", "\033[1;33mretf\033[0m", "\033[1;33mleave\033[0m",
"\033[1;33mpopf\033[0m", "\033[1;33mpushf\033[0m",
"\033[1;33msyscall\033[0m", "\033[1;33mcpuid\033[0m", "\033[1;33mfnop\033[0m", "\033[1;33mfchs\033[0m",
"\033[1;33mfabs\033[0m", "\033[1;33mftst\033[0m", "\033[1;33mfxam\033[0m", "\033[1;33mfld1\033[0m",
"\033[1;33mfldl2t\033[0m", "\033[1;33mfldl2e\033[0m", "\033[1;33mfldpi\033[0m", "\033[1;33mfldlg2\033[0m",
"\033[1;33mfldln2\033[0m", "\033[1;33mfldz\033[0m", "\033[1;33mf2xm1\033[0m", "\033[1;33mfyl2x\033[0m",
"\033[1;33mfptan\033[0m", "\033[1;33mfpatan\033[0m", "\033[1;33mfxtract\033[0m", "\033[1;33mfprem1\033[0m",
"\033[1;33mfdecstp\033[0m", "\033[1;33mfincstp\033[0m", "\033[1;33mfprem\033[0m", "\033[1;33mfyl2xp1\033[0m",
"\033[1;33mfsqrt\033[0m", "\033[1;33mfsincos\033[0m", "\033[1;33mfrndint\033[0m", "\033[1;33mfscale\033[0m",
"\033[1;33mfsin\033[0m", "\033[1;33mfcos\033[0m",
"\033[1;33menter\033[0m", "\033[1;33mcall\033[0m", "\033[1;33min\033[0m", "\033[1;33mout\033[0m",
"\033[1;33mjmp\033[0m", "\033[1;33mmov\033[0m", "\033[1;33mpop\033[0m", "\033[1;33mpush\033[0m",
"\033[1;33mjo\033[0m", "\033[1;33mjno\033[0m", "\033[1;33mjb\033[0m", "\033[1;33mjae\033[0m",
"\033[1;33mje\033[0m", "\033[1;33mjne\033[0m", "\033[1;33mjbe\033[0m", "\033[1;33mja\033[0m",
"\033[1;33mjs\033[0m", "\033[1;33mjns\033[0m", "\033[1;33mjpe\033[0m", "\033[1;33mjpo\033[0m",
"\033[1;33mjl\033[0m", "\033[1;33mjge\033[0m", "\033[1;33mjle\033[0m", "\033[1;33mjg\033[0m",
"\033[1;33mcmovo\033[0m", "\033[1;33mcmovno\033[0m", "\033[1;33mcmovb\033[0m", "\033[1;33mcmovae\033[0m",
"\033[1;33mcmove\033[0m", "\033[1;33mcmovne\033[0m", "\033[1;33mcmovbe\033[0m", "\033[1;33mcmova\033[0m",
"\033[1;33mcmovs\033[0m", "\033[1;33mcmovns\033[0m", "\033[1;33mcmovpe\033[0m", "\033[1;33mcmovpo\033[0m",
"\033[1;33mcmovl\033[0m", "\033[1;33mcmovge\033[0m", "\033[1;33mcmovle\033[0m", "\033[1;33mcmovg\033[0m",
"\033[1;33mseto\033[0m", "\033[1;33msetno\033[0m", "\033[1;33msetb\033[0m", "\033[1;33msetae\033[0m",
"\033[1;33msete\033[0m", "\033[1;33msetne\033[0m", "\033[1;33msetbe\033[0m", "\033[1;33mseta\033[0m",
"\033[1;33msets\033[0m", "\033[1;33msetns\033[0m", "\033[1;33msetpe\033[0m", "\033[1;33msetpo\033[0m",
"\033[1;33msetl\033[0m", "\033[1;33msetge\033[0m", "\033[1;33msetle\033[0m", "\033[1;33msetg\033[0m",
"\033[1;33mbswap\033[0m", "\033[1;33mbsf\033[0m", "\033[1;33mbsr\033[0m", "\033[1;33mloop\033[0m",
"\033[1;33mloope\033[0m", "\033[1;33mloopne\033[0m"
"asmdirmem", "asmdirrel", "asmdirimm", "asmdirrep",
"add", "or", "adc", "sbb",
"and", "sub", "xor", "cmp",
"inc", "dec", "not", "neg",
"mul", "imul", "div", "idiv",
"fadd", "fmul", "fcom", "fcomp",
"fsub", "fsubr", "fdiv", "fdivr",
"rol", "ror", "rcl", "rcr",
"sal", "shr", "shl", "sar",
"nop", "retn", "retf", "leave",
"popf", "pushf",
"syscall", "cpuid", "fnop", "fchs",
"fabs", "ftst", "fxam", "fld1",
"fldl2t", "fldl2e", "fldpi", "fldlg2",
"fldln2", "fldz", "f2xm1", "fyl2x",
"fptan", "fpatan", "fxtract", "fprem1",
"fdecstp", "fincstp", "fprem", "fyl2xp1",
"fsqrt", "fsincos", "frndint", "fscale",
"fsin", "fcos",
"enter", "call", "in", "out",
"jmp", "mov", "pop", "push",
"jo", "jno", "jb", "jae",
"je", "jne", "jbe", "ja",
"js", "jns", "jpe", "jpo",
"jl", "jge", "jle", "jg",
"cmovo", "cmovno", "cmovb", "cmovae",
"cmove", "cmovne", "cmovbe", "cmova",
"cmovs", "cmovns", "cmovpe", "cmovpo",
"cmovl", "cmovge", "cmovle", "cmovg",
"seto", "setno", "setb", "setae",
"sete", "setne", "setbe", "seta",
"sets", "setns", "setpe", "setpo",
"setl", "setge", "setle", "setg",
"bswap", "bsf", "bsr", "loop",
"loope", "loopne"
};
#endif
static unsigned int empty_count = 1;
static unsigned int empty_holes = 1;
static unsigned int * empty_array = NULL;
static unsigned int * empty_imbue = NULL;
static unsigned int * empty_store = NULL;
static void replace (unsigned char * destination, unsigned char * source, unsigned long size) {
static void replace (unsigned char * destination,
unsigned char * source,
unsigned long size) {
for (--size; size != (unsigned long) -1; --size) {
destination [size] = source [size];
}
@ -279,7 +285,7 @@ static unsigned int build_jump_if (unsigned int * array) {
size = array [1],
location = array [3];
debug_printf ("> %s %s \033[1;35mrel\033[0m %u", data_name [array [0]], size_name [array [1]], array [3]);
debug_printf ("> %s %s rel %u", data_name [array [0]], size_name [array [1]], array [3]);
inset (far (location) && (size == D32), 0x0f);
@ -319,7 +325,7 @@ static unsigned int build_set_if (unsigned int * array) {
to = array [2],
destination = array [3];
debug_printf ("> %s \033[1;35md8 \033[0m %s %u", data_name [array [0]], type_name [array [2]], array [3]);
debug_printf ("> %s d8 %s %u", data_name [array [0]], type_name [array [2]], array [3]);
inset ((to == REG) && (front (destination)), 0x40);
inset ((to == REG) && (upper (destination)), 0x41);
@ -454,7 +460,7 @@ static unsigned int build_shift (unsigned int * array) {
destination = array [3],
offset = array [5];
debug_printf ("> %s %s %s %u \033[1;35mimm\033[0m %u", data_name [array [0]], size_name [array [1]], type_name [array [2]], array [3], array [5]);
debug_printf ("> %s %s %s %u imm %u", data_name [array [0]], size_name [array [1]], type_name [array [2]], array [3], array [5]);
short_prefix (size);
@ -534,7 +540,7 @@ static unsigned int build_swap (unsigned int * array) {
unsigned int size = array [1],
destination = array [3];
debug_printf ("> %s %s \033[1;35mreg\033[0m %u", data_name [array [0]], size_name [array [1]], array [3]);
debug_printf ("> %s %s reg %u", data_name [array [0]], size_name [array [1]], array [3]);
long_prefix (size, REG, destination, 0, 0);
@ -550,7 +556,7 @@ static unsigned int build_bit_scan (unsigned int * array) {
from = array [4],
source = array [5];
debug_printf ("> %s %s \033[1;35mreg\033[0m %u %s %u", data_name [array [0]], size_name [array [1]], array [3], type_name [array [4]], array [5]);
debug_printf ("> %s %s reg %u %s %u", data_name [array [0]], size_name [array [1]], array [3], type_name [array [4]], array [5]);
short_prefix (size);
@ -570,7 +576,7 @@ static unsigned int build_bit_scan (unsigned int * array) {
static unsigned int build_loop (unsigned int * array) {
unsigned int location = array [3];
debug_printf ("> %s \033[1;35md8 \033[0m \033[1;35mrel\033[0m %u", data_name [array [0]], array [3]);
debug_printf ("> %s d8 rel %u", data_name [array [0]], array [3]);
inset (array [0] == LOOPNE, 0xe0);
inset (array [0] == LOOPE, 0xe1);
@ -581,17 +587,11 @@ static unsigned int build_loop (unsigned int * array) {
return (3);
}
static unsigned int fault (unsigned int * array) {
debug_printf ("> fault : \033[1;31m%u\033[0m", array [0]);
return (0);
}
static unsigned int (* build_instruction []) (unsigned int * array) = {
store_memory, // ASMDIRMEM : LABEL
store_relative, // ASMDIRREL : "IMPLEMENTED"
store_immediate,// ASMDIRIMM : LITERAL
fault, // ASMDIRREP : UNIMPLEMENTED
NULL, // ASMDIRREP : UNIMPLEMENTED
build_double, build_double, build_double, build_double, build_double, build_double, build_double, build_double,
build_single, build_single, build_single, build_single, build_single, build_single, build_single, build_single,
build_float, build_float, build_float, build_float, build_float, build_float, build_float, build_float,
@ -611,7 +611,6 @@ static unsigned int (* build_instruction []) (unsigned int * array) = {
build_swap, build_bit_scan, build_bit_scan, build_loop, build_loop, build_loop
};
unsigned int nopification = 1;
unsigned int text_entry_point = 0;
unsigned int text_sector_size = 0;
unsigned char * text_sector_byte = NULL;
@ -634,19 +633,17 @@ int assemble (unsigned int count, unsigned int * array) {
unsigned int check_at;
unsigned int byte;
inset ((nopification) && (array [index] > ASMDIRREP), 0x90);
#if DEBUG == 1
inset (array [index] > ASMDIRREP, 0x90);
#endif
check_at = text_sector_size;
index += build_instruction [array [index]] (& array [index]);
debug_printf (" -- \033[0;35m");
for (byte = check_at; byte < text_sector_size; ++byte) {
debug_printf ("%02X ", text_sector_byte [byte]);
}
debug_printf ("\033[0m\n");
}
text_entry_point = empty_store [0];

View File

@ -1,40 +1,38 @@
#ifndef ASSEMBLER_H
#define ASSEMBLER_H
// Instruction aliases
#define JNPE JPO
#define JNPO JPE
#define JNB JAE
#define JNBE JA
#define JNA JBE
#define JNAE JB
#define JNL JGE
#define JNLE JG
#define JNG JLE
#define JNGE JL
#define JNPE (JPO)
#define JNPO (JPE)
#define JNB (JAE)
#define JNBE (JA)
#define JNA (JBE)
#define JNAE (JB)
#define JNL (JGE)
#define JNLE (JG)
#define JNG (JLE)
#define JNGE (JL)
#define CMOVNPE CMOVPO
#define CMOVNPO CMOVPE
#define CMOVNB CMOVAE
#define CMOVNBE CMOVA
#define CMOVNA CMOVBE
#define CMOVNAE CMOVB
#define CMOVNL CMOVGE
#define CMOVNLE CMOVG
#define CMOVNG CMOVLE
#define CMOVNGE CMOVL
#define CMOVNPE (CMOVPO)
#define CMOVNPO (CMOVPE)
#define CMOVNB (CMOVAE)
#define CMOVNBE (CMOVA)
#define CMOVNA (CMOVBE)
#define CMOVNAE (CMOVB)
#define CMOVNL (CMOVGE)
#define CMOVNLE (CMOVG)
#define CMOVNG (CMOVLE)
#define CMOVNGE (CMOVL)
#define SETNPE SETPO
#define SETNPO SETPE
#define SETNB SETAE
#define SETNBE SETA
#define SETNA SETBE
#define SETNAE SETB
#define SETNL SETGE
#define SETNLE SETG
#define SETNG SETLE
#define SETNGE SETL
// ---
#define SETNPE (SETPO)
#define SETNPO (SETPE)
#define SETNB (SETAE)
#define SETNBE (SETA)
#define SETNA (SETBE)
#define SETNAE (SETB)
#define SETNL (SETGE)
#define SETNLE (SETG)
#define SETNG (SETLE)
#define SETNGE (SETL)
enum {
D8, D16, D32, D64
@ -46,37 +44,67 @@ enum {
enum {
ASMDIRMEM, ASMDIRREL, ASMDIRIMM, ASMDIRREP,
ADD, OR, ADC, SBB, AND, SUB, XOR, CMP,
INC, DEC, NOT, NEG, MUL, IMUL, DIV, IDIV,
FADD, FMUL, FCOM, FCOMP, FSUB, FSUBR, FDIV, FDIVR,
ROL, ROR, RCL, RCR, SAL, SHR, SHL, SAR,
NOP, RETN, RETF, LEAVE, POPF, PUSHF,
SYSCALL, CPUID, FNOP, FCHS, FABS, FTST, FXAM, FLD1,
FLDL2T, FLDL2E, FLDPI, FLDLG2, FLDLN2, FLDZ, F2XM1, FYL2X,
FPTAN, FPATAN, FXTRACT, FPREM1, FDECSTP, FINCSTP, FPREM, FYL2XP1,
FSQRT, FSINCOS, FRNDINT, FSCALE, FSIN, FCOS,
ENTER, CALL, IN, OUT, JMP, MOV, POP, PUSH,
JO, JNO, JB, JAE, JE, JNE, JBE, JA,
JS, JNS, JPE, JPO, JL, JGE, JLE, JG,
CMOVO, CMOVNO, CMOVB, CMOVAE, CMOVE, CMOVNE, CMOVBE, CMOVA,
CMOVS, CMOVNS, CMOVPE, CMOVPO, CMOVL, CMOVGE, CMOVLE, CMOVG,
SETO, SETNO, SETB, SETAE, SETE, SETNE, SETBE, SETA,
SETS, SETNS, SETPE, SETPO, SETL, SETGE, SETLE, SETG,
BSWAP, BSF, BSR, LOOP, LOOPE, LOOPNE
ADD, OR, ADC, SBB,
AND, SUB, XOR, CMP,
INC, DEC, NOT, NEG,
MUL, IMUL, DIV, IDIV,
FADD, FMUL, FCOM, FCOMP,
FSUB, FSUBR, FDIV, FDIVR,
ROL, ROR, RCL, RCR,
SAL, SHR, SHL, SAR,
NOP, RETN, RETF, LEAVE,
POPF, PUSHF,
SYSCALL, CPUID, FNOP, FCHS,
FABS, FTST, FXAM, FLD1,
FLDL2T, FLDL2E, FLDPI, FLDLG2,
FLDLN2, FLDZ, F2XM1, FYL2X,
FPTAN, FPATAN, FXTRACT, FPREM1,
FDECSTP, FINCSTP, FPREM, FYL2XP1,
FSQRT, FSINCOS, FRNDINT, FSCALE,
FSIN, FCOS,
ENTER, CALL, IN, OUT,
JMP, MOV, POP, PUSH,
JO, JNO, JB, JAE,
JE, JNE, JBE, JA,
JS, JNS, JPE, JPO,
JL, JGE, JLE, JG,
CMOVO, CMOVNO, CMOVB, CMOVAE,
CMOVE, CMOVNE, CMOVBE, CMOVA,
CMOVS, CMOVNS, CMOVPE, CMOVPO,
CMOVL, CMOVGE, CMOVLE, CMOVG,
SETO, SETNO, SETB, SETAE,
SETE, SETNE, SETBE, SETA,
SETS, SETNS, SETPE, SETPO,
SETL, SETGE, SETLE, SETG,
BSWAP, BSF, BSR, LOOP,
LOOPE, LOOPNE
};
enum {
GR0, GR1, GR2, GR3, GR4, GR5, GR6, GR7,
GR8, GR9, GR10, GR11, GR12, GR13, GR14, GR15
GR0, GR1, GR2, GR3,
GR4, GR5, GR6, GR7,
GR8, GR9, GR10, GR11,
GR12, GR13, GR14, GR15
};
enum {
VR0, VR1, VR2, VR3,
VR4, VR5, VR6, VR7,
VR8, VR9, VR10, VR11,
VR12, VR13, VR14, VR15,
VR16, VR17, VR18, VR19,
VR20, VR21, VR22, VR23,
VR24, VR25, VR26, VR27,
VR28, VR29, VR30, VR31
};
extern unsigned int nopification;
extern unsigned int text_entry_point;
extern unsigned int text_sector_size;
extern unsigned char * text_sector_byte;
extern int was_instruction_array_empty;
extern int assemble (unsigned int count, unsigned int * array);
extern int assemble (unsigned int count,
unsigned int * array);
#endif

View File

@ -1,5 +1,6 @@
#include "assembler.h"
#include "unix.h"
#include "debug.h"
#include <string.h>
@ -44,16 +45,22 @@ void elf_main_header(unsigned char has_program,
elf_main_header_byte[18] = (for_x86_64) ? 0x3e : 0x00;
memcpy(& elf_main_header_byte[24], & enter, sizeof(enter));
debug_printf("UNX -- ELF64 main header\n");
}
void elf_text_sector(unsigned long text_size, unsigned long data_size) {
void elf_text_sector(unsigned long text_size,
unsigned long data_size) {
unsigned long text = ELF_HEADER_SIZE + text_size - data_size;
memcpy(& elf_text_sector_byte[32], & text, sizeof(text));
memcpy(& elf_text_sector_byte[40], & text, sizeof(text));
debug_printf("UNX -- ELF64 text sector\n");
}
void elf_data_sector(unsigned long text_size, unsigned long data_size) {
void elf_data_sector(unsigned long text_size,
unsigned long data_size) {
unsigned long data = data_size;
unsigned long core = ELF_HEADER_SIZE + text_size - data_size;
unsigned long move = 0x401000 + core;
@ -63,4 +70,6 @@ void elf_data_sector(unsigned long text_size, unsigned long data_size) {
memcpy(& elf_data_sector_byte[24], & move, sizeof(move));
memcpy(& elf_data_sector_byte[32], & data, sizeof(data));
memcpy(& elf_data_sector_byte[40], & data, sizeof(data));
debug_printf("UNX -- ELF64 data sector\n");
}

View File

@ -1,12 +1,13 @@
#ifndef UNIX_H
#define UNIX_H
#define ELF_MAIN_HEADER_SIZE (0x40)
#define ELF_TEXT_SECTOR_SIZE (0x38)
#define ELF_DATA_SECTOR_SIZE (0x38)
#define ELF_HEADER_SIZE (ELF_MAIN_HEADER_SIZE \
+ ELF_TEXT_SECTOR_SIZE \
+ ELF_DATA_SECTOR_SIZE)
#define ELF_HEADER_SIZE (ELF_MAIN_HEADER_SIZE + \
ELF_TEXT_SECTOR_SIZE + \
ELF_DATA_SECTOR_SIZE)
extern unsigned char elf_main_header_byte[ELF_MAIN_HEADER_SIZE];
extern unsigned char elf_text_sector_byte[ELF_TEXT_SECTOR_SIZE];
@ -16,8 +17,10 @@ extern void elf_main_header(unsigned char has_program,
unsigned char for_linux,
unsigned char for_x86_64);
extern void elf_text_sector(unsigned long text_size, unsigned long data_size);
extern void elf_data_sector(unsigned long text_size, unsigned long data_size);
extern void elf_text_sector(unsigned long text_size,
unsigned long data_size);
extern void elf_data_sector(unsigned long text_size,
unsigned long data_size);
#define UNIX_H
#endif