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

File diff suppressed because it is too large Load Diff

View File

@ -1,82 +1,110 @@
#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
D8, D16, D32, D64
};
enum {
REL, REG, MEM, IMM
REL, REG, MEM, IMM
};
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
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
};
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

@ -21,12 +21,12 @@ unsigned int token_count = 0;
char * output_file_name = "a.out";
int compile_init(void) {
token_array = calloc(1440UL, sizeof(*token_array));
token_array = calloc(1440UL, sizeof(*token_array));
return 0;
}
int compile_deinit(void) {
free(token_array);
free(token_array);
return 0;
}
@ -71,14 +71,14 @@ int write_output(FILE * file) {
checked_fwrite(elf_text_sector_byte, 1UL, ELF_TEXT_SECTOR_SIZE, file);
checked_fwrite(elf_data_sector_byte, 1UL, ELF_DATA_SECTOR_SIZE, file);
checked_fwrite(text_sector_byte, sizeof(*text_sector_byte), (size_t)text_sector_size, file);
checked_fwrite(text_sector_byte, sizeof(*text_sector_byte), (size_t)text_sector_size, file);
} break;
case SHELL: {
elf_main_header(1, 1, 1);
elf_text_sector(text_sector_size, 0);
elf_data_sector(text_sector_size, 0);
checked_fwrite(text_sector_byte, sizeof(*text_sector_byte), (size_t)text_sector_size, file);
checked_fwrite(text_sector_byte, sizeof(*text_sector_byte), (size_t)text_sector_size, file);
} break;
}

View File

@ -1,66 +1,75 @@
#include "assembler.h"
#include "unix.h"
#include "debug.h"
#include <string.h>
unsigned char elf_main_header_byte[ELF_MAIN_HEADER_SIZE] = {
0X7F, 0X45, 0X4C, 0X46, 0X02, 0X01, 0X01, 0X03,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X02, 0X00, 0X3E, 0X00, 0X01, 0X00, 0X00, 0X00,
0XB0, 0X00, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00,
0X40, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X40, 0X00, 0X38, 0X00,
0X02, 0X00, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00
0X7F, 0X45, 0X4C, 0X46, 0X02, 0X01, 0X01, 0X03,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X02, 0X00, 0X3E, 0X00, 0X01, 0X00, 0X00, 0X00,
0XB0, 0X00, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00,
0X40, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X40, 0X00, 0X38, 0X00,
0X02, 0X00, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00
};
unsigned char elf_text_sector_byte[ELF_TEXT_SECTOR_SIZE] = {
0X01, 0X00, 0X00, 0X00, 0X05, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00
0X01, 0X00, 0X00, 0X00, 0X05, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00
};
unsigned char elf_data_sector_byte[ELF_DATA_SECTOR_SIZE] = {
0X01, 0X00, 0X00, 0X00, 0X06, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X10, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X10, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00
0X01, 0X00, 0X00, 0X00, 0X06, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X10, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X10, 0X40, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00,
0X00, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00
};
void elf_main_header(unsigned char has_program,
unsigned char for_linux,
unsigned char for_x86_64) {
unsigned int enter = text_entry_point + 0x4000b0u;
unsigned int enter = text_entry_point + 0x4000b0u;
elf_main_header_byte[16] = (has_program) ? 0x02 : 0x03;
elf_main_header_byte[ 7] = (for_linux) ? 0x03 : 0x00;
elf_main_header_byte[18] = (for_x86_64) ? 0x3e : 0x00;
elf_main_header_byte[16] = (has_program) ? 0x02 : 0x03;
elf_main_header_byte[ 7] = (for_linux) ? 0x03 : 0x00;
elf_main_header_byte[18] = (for_x86_64) ? 0x3e : 0x00;
memcpy (& elf_main_header_byte[24], & enter, sizeof(enter));
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) {
unsigned long text = ELF_HEADER_SIZE + text_size - 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));
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) {
unsigned long data = data_size;
unsigned long core = ELF_HEADER_SIZE + text_size - data_size;
unsigned long move = 0x401000 + core;
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;
memcpy (& elf_data_sector_byte[ 8], & core, sizeof(core));
memcpy (& elf_data_sector_byte[16], & move, sizeof(move));
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));
memcpy(& elf_data_sector_byte[ 8], & core, sizeof(core));
memcpy(& elf_data_sector_byte[16], & move, sizeof(move));
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