Minor refactoring of UXN and ASM...
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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");
|
||||
}
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user