From c55c133d8fc7a2f960fc9a775e8f0627edf2c840 Mon Sep 17 00:00:00 2001 From: xolatile Date: Sat, 16 Nov 2024 14:24:51 -0500 Subject: [PATCH] Cleaned 99% of clang -Weverything warnings in ASM and UXN... --- source/assembler.c | 321 ++++++++++++++++++++++++--------------------- source/assembler.h | 42 +++--- source/compile.c | 4 +- source/compile.h | 4 +- source/debug.h | 4 +- source/unix.c | 79 +++++------ source/unix.h | 30 ++--- test/heyo.eax | 1 - 8 files changed, 250 insertions(+), 235 deletions(-) diff --git a/source/assembler.c b/source/assembler.c index c9374da..fefb20c 100644 --- a/source/assembler.c +++ b/source/assembler.c @@ -4,23 +4,23 @@ #include #define DOUBLE_BEGIN (ADD) -#define DOUBLE_END (CMP) +//~#define DOUBLE_END (CMP) #define SINGLE_BEGIN (INC) -#define SINGLE_END (IDIV) +//~#define SINGLE_END (IDIV) #define STATIC_1_BEGIN (NOP) -#define STATIC_1_END (PUSHF) +//~#define STATIC_1_END (PUSHF) #define STATIC_2_BEGIN (SYSCALL) -#define STATIC_2_END (FCOS) +//~#define STATIC_2_END (FCOS) #define JUMP_IF_BEGIN (JO) -#define JUMP_IF_END (JG) +//~#define JUMP_IF_END (JG) #define MOVE_IF_BEGIN (CMOVO) -#define MOVE_IF_END (CMOVG) +//~#define MOVE_IF_END (CMOVG) #define SET_IF_BEGIN (SETO) -#define SET_IF_END (SETG) +//~#define SET_IF_END (SETG) #define FLOAT_BEGIN (FADD) -#define FLOAT_END (FDIVR) +//~#define FLOAT_END (FDIVR) #define SHIFT_BEGIN (ROL) -#define SHIFT_END (SAR) +//~#define SHIFT_END (SAR) #if DEBUG == 1 @@ -73,50 +73,50 @@ static const char * operation_name [] = { #endif -static uint32_t empty_count = 1; -static uint32_t empty_holes = 1; -static uint32_t * empty_array = NULL; -static uint32_t * empty_imbue = NULL; -static uint32_t * empty_store = NULL; +static int empty_count = 1; +static int empty_holes = 1; +static int * empty_array = NULL; +static int * empty_imbue = NULL; +static int * empty_store = NULL; -static void replace(uint8_t * destination, - uint8_t * source, - uint64_t size) { - for (--size; size != ~0ul; --size) { +static void replace(char * destination, + char * source, + int size) { + for (--size; size != -1; --size) { destination[size] = source[size]; } } -static void inset(int32_t when, - uint32_t data) { - text_sector_byte[text_sector_size] = (uint8_t)data; +static void inset(int when, + int data) { + text_sector_byte[text_sector_size] = (char)data; - text_sector_size += (uint32_t)when; + text_sector_size += (int)when; } -static void inset_immediate(int32_t when, - uint32_t size, - uint32_t data) { +static void inset_immediate(int when, + int size, + int data) { inset((when), (data >> 0) & 0xff); inset((when) && (size >= D16), (data >> 8) & 0xff); inset((when) && (size >= D32), (data >> 16) & 0xff); inset((when) && (size >= D32), (data >> 24) & 0xff); } -static void inset_memory(int32_t when, - uint32_t size, - uint32_t data, - uint32_t base) { +static void inset_memory(int when, + int size, + int data, + int base) { empty_array[empty_holes] = text_sector_size; empty_imbue[empty_holes] = data; - empty_holes += (uint32_t)when; + empty_holes += (int)when; inset_immediate(when, size, base); } -static uint32_t store_relative(uint32_t * array) { - uint32_t relative = array[1]; +static int store_relative(int * array) { + int relative = array[1]; empty_array[empty_holes] = text_sector_size; empty_imbue[empty_holes] = relative; @@ -126,8 +126,8 @@ static uint32_t store_relative(uint32_t * array) { return 1; } -static uint32_t store_memory(uint32_t * array) { - uint32_t memory = array[1]; +static int store_memory(int * array) { + int memory = array[1]; empty_store[memory] = text_sector_size; @@ -136,95 +136,85 @@ static uint32_t store_memory(uint32_t * array) { return 1; } -static uint32_t store_immediate(uint32_t * array) { - uint32_t size = array[1], +static int store_immediate(int * array) { + int size = array[1], amount = array[2]; - for (uint32_t index = 0; index < amount; ++index) { + for (int index = 0; index < amount; ++index) { inset_immediate(1, size, array[3 + index]); } return amount + 2; } -static int32_t front(uint32_t data) { - return (data >= GR4) && (data <= GR7); -} - -static int32_t lower(uint32_t data) { - return data <= GR7; -} - -static int32_t upper(uint32_t data) { - return (data >= GR8) && (data <= GR15); -} +static int front(int data) { return (data >= GR4) && (data <= GR7); } +static int upper(int data) { return (data >= GR8) && (data <= GR15); } +static int lower(int data) { return data <= GR7; } // We don't use these yet, hardcoded. -static int32_t far(uint32_t label) { - return label && 1; +static int far(int label) { return label && 1; } +static int near(int label) { return label && 0; } + +static int trr(int to, int from) { + return (to == REG) && (from == REG); } -// We don't use these yet, hardcoded. -static int32_t near(uint32_t label) { - return label && 0; -} - -static void short_prefix(uint32_t size) { - inset(size == D16, 0x66); -} - -static int32_t trm(uint32_t to, uint32_t from) { +static int trm(int to, int from) { return (to == REG) && (from == MEM); } -static int32_t tmr(uint32_t to, uint32_t from) { +static int tmr(int to, int from) { return (to == MEM) && (from == REG); } -static int32_t tmi(uint32_t to, uint32_t from) { +static int tmi(int to, int from) { return (to == MEM) && (from == IMM); } -static int32_t trl(uint32_t to, uint32_t from) { - return (to == REG) && (from == REL); -} - -static int32_t tri(uint32_t to, uint32_t from) { +static int tri(int to, int from) { return (to == REG) && (from == IMM); } -static void long_prefix(uint32_t size, - uint32_t to, - uint32_t destination, - uint32_t from, - uint32_t source) { - uint32_t to_upper = (to == REG) && (upper(destination)); - uint32_t from_upper = (from == REG) && (upper(source)); +static int trl(int to, int from) { + return (to == REG) && (from == REL); +} + +static void short_prefix(int size) { + inset(size == D16, 0x66); +} + +static void long_prefix(int size, + int to, + int destination, + int from, + int source) { + int to_upper = (to == REG) && (upper(destination)); + int from_upper = (from == REG) && (upper(source)); // Refactor. inset ((size == D64) || (to_upper) || (from_upper), 0x40 + 0x01 * to_upper + 0x04 * from_upper + 0x08 * (size == D64)); } -static void modify_registers(uint32_t to, - uint32_t destination, - uint32_t from, - uint32_t source) { +static void modify_registers(int to, + int destination, + int from, + int source) { // Refactor. - inset ((to == REG) && (from == REG), 0xc0 + 0x01 * (destination & 0x07) + 0x08 * (source & 0x07)); + inset (trr(to, from), 0xc0 + 0x01 * (destination & 0x07) + 0x08 * (source & 0x07)); } -static void modify_memory(uint32_t operation, - uint32_t to, - uint32_t from) { +static void modify_memory(int operation, + int to, + int from) { // Refactor. inset ((tmr(to, from)) || (trm(to, from)), 0x05 + 0x08 * operation * (tmi(to, from))); } // REFACTORING IN PROGRESS -static uint32_t build_double(uint32_t * array) { - uint32_t operation = array[0], +static int build_double(int * array) { + int operation = array[0], size = array[1], to = array[2], destination = array[3], @@ -235,6 +225,14 @@ static uint32_t build_double(uint32_t * array) { debug_error(to > MEM, "to : double = %i; -- XBA\n", to); debug_error(from > IMM, "from : double = %i; -- XBA\n", from); + debug_printf("@y%s@- @b%s@- @c%s@- %u @c%s@- %u", + operation_name [operation], + size_name [size], + operand_name [to], + destination, + operand_name [from], + source); + short_prefix(size); long_prefix(size, to, destination, from, source); @@ -277,8 +275,8 @@ static uint32_t build_double(uint32_t * array) { return 5; } -static uint32_t build_single(uint32_t * array) { - uint32_t operation = array[0], +static int build_single(int * array) { + int operation = array[0], size = array[1], to = array[2], destination = array[3]; @@ -286,6 +284,12 @@ static uint32_t build_single(uint32_t * array) { debug_error(size > D64, "size : single = %i; -- XBA\n", size); debug_error(to > MEM, "to : single = %i; -- XBA\n", to); + debug_printf("@y%s@- @b%s@- @c%s@- %u", + operation_name [operation], + size_name [size], + operand_name [to], + destination); + short_prefix(size); long_prefix(size, to, destination, 0, 0); @@ -305,35 +309,39 @@ static uint32_t build_single(uint32_t * array) { return 3; } -static uint32_t build_static_1(uint32_t * array) { - uint32_t operation = array[0]; +static int build_static_1(int * array) { + int operation = array[0]; - const uint8_t data[] = { + const unsigned char data[] = { 0x90, 0xc3, 0xcb, 0xc9, 0x9d, 0x9c }; + debug_printf("@y%s@-", operation_name [operation]); + inset(1, data[operation - STATIC_1_BEGIN]); return 0; } -static uint32_t build_static_2(uint32_t * array) { - uint32_t operation = array[0]; +static int build_static_2(int * array) { + int operation = array[0]; - const uint16_t data[] = { + const unsigned short data[] = { 0x050f, 0xa20f, 0xd0d9, 0xe0d9, 0xe1d9, 0xe4d9, 0xe5d9, 0xe8d9, 0xe9d9, 0xead9, 0xebd9, 0xecd9, 0xedd9, 0xeed9, 0xf0d9, 0xf1d9, 0xf2d9, 0xf3d9, 0xf4d9, 0xf5d9, 0xf6d9, 0xf7d9, 0xf8d9, 0xf9d9, 0xfad9, 0xfbd9, 0xfcd9, 0xfdd9, 0xfed9, 0xffd9 }; + debug_printf("@y%s@-", operation_name [operation]); + inset_immediate(1, D16, data[operation - STATIC_2_BEGIN]); return 0; } -static uint32_t build_jump_if(uint32_t * array) { - uint32_t operation = array[0], +static int build_jump_if(int * array) { + int operation = array[0], size = array[1], location = array[3]; @@ -347,8 +355,8 @@ static uint32_t build_jump_if(uint32_t * array) { return 3; } -static uint32_t build_move_if(uint32_t * array) { - uint32_t operation = array[0], +static int build_move_if(int * array) { + int operation = array[0], size = array[1], to = array[2], destination = array[3], @@ -369,8 +377,8 @@ static uint32_t build_move_if(uint32_t * array) { return 5; } -static uint32_t build_set_if(uint32_t * array) { - uint32_t operation = array[0], +static int build_set_if(int * array) { + int operation = array[0], to = array[2], destination = array[3]; @@ -388,8 +396,8 @@ static uint32_t build_set_if(uint32_t * array) { return 3; } -static uint32_t build_jump(uint32_t * array) { - uint32_t size = array[1], +static int build_jump(int * array) { + int size = array[1], to = array[2], destination = array[3]; @@ -408,8 +416,8 @@ static uint32_t build_jump(uint32_t * array) { } // Please refactor this entire crap... -static uint32_t build_move(uint32_t * array) { - uint32_t size = array[1], +static int build_move(int * array) { + int size = array[1], to = array[2], destination = array[3], from = array[4], @@ -421,7 +429,7 @@ static uint32_t build_move(uint32_t * array) { debug_error(to > MEM, "to : move = %i; -- XBA\n", to); debug_error(from > IMM, "from : move = %i; -- XBA\n", from); - debug_printf("@ymov@- %s %s %u %s %u %u", + debug_printf("@ymov@- @b%s@- @c%s@- %u @c%s@- %u %u", size_name [size], operand_name [to], destination, @@ -433,7 +441,7 @@ static uint32_t build_move(uint32_t * array) { long_prefix(size, to, destination, from, source); - inset((to == REG) && (from == REG), 0x88 + 0x01 * (size != D8)); + inset(trr(to, from), 0x88 + 0x01 * (size != D8)); inset(trm(to, from), 0x8a + 0x01 * (size != D8)); inset(tmr(to, from), 0x88 + 0x01 * (size != D8)); @@ -462,9 +470,13 @@ static uint32_t build_move(uint32_t * array) { return 5 + (size == D64); } -static uint32_t build_call(uint32_t * array) { - uint32_t from = array[1], - source = array[2]; +static int build_call(int * array) { + int from = array[1], + source = array[2]; + + debug_printf("@ycall@- @c%s@- %u", + operand_name [from], + source); inset((from == REG) && (upper(source)), 0x41); @@ -478,10 +490,12 @@ static uint32_t build_call(uint32_t * array) { return 2; } -static uint32_t build_enter(uint32_t * array) { - uint32_t dynamic_storage = array[1], +static int build_enter(int * array) { + int dynamic_storage = array[1], nesting_level = array[2]; + debug_printf("@yenter@- %u %u", dynamic_storage, nesting_level); + inset(1, 0xc8); inset_immediate(1, D16, dynamic_storage); @@ -490,27 +504,28 @@ static uint32_t build_enter(uint32_t * array) { return 2; } -static uint32_t build_float(uint32_t * array) { - uint32_t operation = array[0], - size = array[1], - from = array[2], - source = array[3]; +// Check if this works at all... +static int build_float(int * array) { + int operation = array[0], + size = array[1], + from = array[2], + source = array[3]; inset(from == MEM, 0xd8 + 0x04 * (size == D64)); - modify_memory(operation, 0, from); + modify_memory(operation - FLOAT_BEGIN, 0, from); inset_memory(from == MEM, size, source, 0); return 3; } -static uint32_t build_shift(uint32_t * array) { - uint32_t operation = array[0], - size = array[1], - to = array[2], - destination = array[3], - offset = array[5]; +static int build_shift(int * array) { + int operation = array[0], + size = array[1], + to = array[2], + destination = array[3], + offset = array[5]; short_prefix(size); @@ -518,8 +533,8 @@ static uint32_t build_shift(uint32_t * array) { inset(1, 0xc0 + 0x01 * (size != D8)); - inset(to == REG, 0x05 + 0x08 * (operation & 7)); - inset(to == MEM, 0xc0 + 0x08 * (operation & 7)); + inset(to == REG, 0x05 + 0x08 * ((operation - SHIFT_BEGIN) & 7)); + inset(to == MEM, 0xc0 + 0x08 * ((operation - SHIFT_BEGIN) & 7)); inset_memory(to == MEM, D32, destination, 0x1000 - text_sector_size - 4); @@ -528,8 +543,8 @@ static uint32_t build_shift(uint32_t * array) { return 5; } -static uint32_t build_in_out(uint32_t * array) { - uint32_t move = array[0], +static int build_in_out(int * array) { + int move = array[0], size = array[1], type = array[2], port = array[3]; @@ -544,8 +559,8 @@ static uint32_t build_in_out(uint32_t * array) { return 3; } -static uint32_t build_pop(uint32_t * array) { - uint32_t size = array[1], +static int build_pop(int * array) { + int size = array[1], to = array[2], destination = array[3]; @@ -562,8 +577,8 @@ static uint32_t build_pop(uint32_t * array) { return 3; } -static uint32_t build_push(uint32_t * array) { - uint32_t size = array[1], +static int build_push(int * array) { + int size = array[1], from = array[2], source = array[3]; @@ -583,8 +598,8 @@ static uint32_t build_push(uint32_t * array) { return 3; } -static uint32_t build_swap(uint32_t * array) { - uint32_t size = array[1], +static int build_swap(int * array) { + int size = array[1], destination = array[3]; long_prefix(size, REG, destination, 0, 0); @@ -595,8 +610,8 @@ static uint32_t build_swap(uint32_t * array) { return 3; } -static uint32_t build_bit_scan(uint32_t * array) { - uint32_t size = array[1], +static int build_bit_scan(int * array) { + int size = array[1], destination = array[3], from = array[4], source = array[5]; @@ -616,8 +631,8 @@ static uint32_t build_bit_scan(uint32_t * array) { return 5; } -static uint32_t build_loop(uint32_t * array) { - uint32_t location = array[3]; +static int build_loop(int * array) { + int location = array[3]; inset(array[0] == LOOPNE, 0xe0); inset(array[0] == LOOPE, 0xe1); @@ -628,7 +643,7 @@ static uint32_t build_loop(uint32_t * array) { return 3; } -static uint32_t (*build_instruction[])(uint32_t * array) = { +static int (*build_instruction[])(int * array) = { store_memory, // ASMDIRMEM : LABEL store_relative, // ASMDIRREL : "IMPLEMENTED" store_immediate,// ASMDIRIMM : LITERAL @@ -669,15 +684,15 @@ static uint32_t (*build_instruction[])(uint32_t * array) = { build_loop, build_loop }; -uint32_t main_entry_point = 0; -uint32_t text_sector_size = 0; -uint8_t * text_sector_byte = NULL; -uint32_t data_sector_size = 0; // This is unused, and it should be used... -uint8_t * data_sector_byte = NULL; // This is unused, and it should be used... +int main_entry_point = 0; +int text_sector_size = 0; +char * text_sector_byte = NULL; +int data_sector_size = 0; // This is unused, and it should be used... +char * data_sector_byte = NULL; // This is unused, and it should be used... -int32_t was_instruction_array_empty = 0; +int was_instruction_array_empty = 0; -int32_t assemble (uint32_t count, uint32_t * array) { +int assemble (int count, int * array) { if ((!count) || (!array)) { was_instruction_array_empty = 1; return EXIT_FAILURE; @@ -687,29 +702,31 @@ int32_t assemble (uint32_t count, uint32_t * array) { empty_imbue = calloc(1024ul, sizeof(*empty_imbue)); empty_store = calloc(1024ul, sizeof(*empty_store)); - for (uint32_t index = 0; index < count; ++index) { - uint32_t size = text_sector_size; + for (int index = 0; index < count; ++index) { + inset(array[index] > ASMDIRREP, 0x90); + + int size = text_sector_size; index += build_instruction[array[index]](&array[index]); debug_printf(" -- "); - for (uint32_t byte = 0; byte < text_sector_size - size; ++byte) { - debug_printf("%02X ", text_sector_byte[byte]); + for (int byte = size; byte < text_sector_size; ++byte) { + debug_printf("@p%02X@- ", (unsigned char)text_sector_byte[byte]); } debug_printf("\n"); } main_entry_point = empty_store[0]; - for (uint32_t index = 1; index < empty_holes; ++index) { - uint32_t set = 0; - uint32_t get = empty_array[index]; + for (int index = 1; index < empty_holes; ++index) { + int set = 0; + int get = empty_array[index]; - replace((uint8_t*)&set, &text_sector_byte[get], sizeof(set)); + replace((char*)&set, &text_sector_byte[get], (int)sizeof(set)); set += empty_store[empty_imbue[index]]; - replace(&text_sector_byte[get], (uint8_t*)&set, sizeof(get)); + replace(&text_sector_byte[get], (char*)&set, (int)sizeof(get)); } free(empty_array); diff --git a/source/assembler.h b/source/assembler.h index 74b7e0d..1cee73c 100644 --- a/source/assembler.h +++ b/source/assembler.h @@ -1,8 +1,6 @@ #ifndef ASSEMBLER_H #define ASSEMBLER_H -#include - #define JNPE (JPO) #define JNPO (JPE) #define JNB (JAE) @@ -36,16 +34,16 @@ #define SETNG (SETLE) #define SETNGE (SETL) -typedef enum { +enum { D8, D16, D32, D64, D80, D128, D256, D512 -} size_type_t; +}; -typedef enum { +enum { REL, REG, MEM, IMM -} operand_type_t; +}; -typedef enum { +enum { ASMDIRMEM, ASMDIRREL, ASMDIRIMM, ASMDIRREP, ADD, OR, ADC, SBB, AND, SUB, XOR, CMP, @@ -81,21 +79,21 @@ typedef enum { SETL, SETGE, SETLE, SETG, BSWAP, BSF, BSR, LOOP, LOOPE, LOOPNE -} operation_type_t; +}; -typedef enum { +enum { GR0, GR1, GR2, GR3, GR4, GR5, GR6, GR7, GR8, GR9, GR10, GR11, GR12, GR13, GR14, GR15 -} general_register_t; +}; -typedef enum { +enum { FR0, FR1, FR2, FR3, FR4, FR5, FR6, FR7 -} float_register_t; +}; -typedef enum { +enum { VR0, VR1, VR2, VR3, VR4, VR5, VR6, VR7, VR8, VR9, VR10, VR11, @@ -104,17 +102,17 @@ typedef enum { VR20, VR21, VR22, VR23, VR24, VR25, VR26, VR27, VR28, VR29, VR30, VR31 -} vector_register_t; // We don't use them currently. +}; // We don't use them currently. -extern uint32_t main_entry_point; -extern uint32_t text_sector_size; -extern uint8_t * text_sector_byte; -extern uint32_t data_sector_size; // This is unused, and it should be used... -extern uint8_t * data_sector_byte; // This is unused, and it should be used... +extern int main_entry_point; +extern int text_sector_size; +extern char * text_sector_byte; +extern int data_sector_size; // This is unused, and it should be used... +extern char * data_sector_byte; // This is unused, and it should be used... -extern int32_t was_instruction_array_empty; +extern int was_instruction_array_empty; -extern int32_t assemble(uint32_t count, - uint32_t * array); +extern int assemble(int count, + int * array); #endif diff --git a/source/compile.c b/source/compile.c index b493ec8..e559b3f 100644 --- a/source/compile.c +++ b/source/compile.c @@ -15,8 +15,8 @@ #include "debug.h" #include "printf2.h" -unsigned int * token_array = NULL; -unsigned int token_count = 0; +int * token_array = NULL; +int token_count = 0; char * output_file_name = "a.out"; diff --git a/source/compile.h b/source/compile.h index 764c1a7..f7c3e50 100644 --- a/source/compile.h +++ b/source/compile.h @@ -1,8 +1,8 @@ #ifndef COMPILE_H #define COMPILE_H -extern unsigned int * token_array; -extern unsigned int token_count; +extern int * token_array; +extern int token_count; extern char * output_file_name; diff --git a/source/debug.h b/source/debug.h index 82dfe48..0c110d6 100644 --- a/source/debug.h +++ b/source/debug.h @@ -98,8 +98,8 @@ void debug_dump_symbols(void) { __attribute__((unused)) static void debug_token_dump(void) { - extern unsigned int * token_array; - extern unsigned int token_count; + extern int * token_array; + extern int token_count; FILE * o = fopen("token_dump", "wb"); fwrite(token_array, sizeof(int), token_count, o); fclose(o); diff --git a/source/unix.c b/source/unix.c index 3b1f3a8..292d16c 100644 --- a/source/unix.c +++ b/source/unix.c @@ -3,43 +3,46 @@ #include -uint8_t 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 +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, + // Redo this part... + // These should not be hardcoded. + 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 }; -uint8_t 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 +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 }; -uint8_t 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 +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 }; -void elf_main_header(uint32_t entry_point, - uint8_t has_program, - uint8_t for_linux, - uint8_t for_x86_64) { - uint32_t enter = entry_point + 0x4000b0u; +void elf_main_header(int entry_point, + int has_program, + int for_linux, + int for_x86_64) { + int enter = entry_point + 0x4000b0; + // Latter 3 variables are determined by system, architecture and '-c' flag. 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; @@ -47,19 +50,19 @@ void elf_main_header(uint32_t entry_point, memcpy(&elf_main_header_byte[24], &enter, sizeof(enter)); } -void elf_text_sector(uint64_t text_size, - uint64_t data_size) { - unsigned long text = ELF_HEADER_SIZE + text_size - data_size; +void elf_text_sector(int text_size, + int data_size) { + int 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)); } -void elf_data_sector(uint64_t text_size, - uint64_t data_size) { - uint64_t data = data_size; - uint64_t core = ELF_HEADER_SIZE + text_size - data_size; - uint64_t move = 0x401000ul + core; +void elf_data_sector(int text_size, + int data_size) { + int data = data_size; + int core = ELF_HEADER_SIZE + text_size - data_size; + int move = 0x401000 + core; memcpy(&elf_data_sector_byte[ 8], &core, sizeof(core)); memcpy(&elf_data_sector_byte[16], &move, sizeof(move)); diff --git a/source/unix.h b/source/unix.h index 16a6986..33c405f 100644 --- a/source/unix.h +++ b/source/unix.h @@ -1,29 +1,27 @@ #ifndef UNIX_H #define UNIX_H -#include - -#define ELF_MAIN_HEADER_SIZE (0x40ul) -#define ELF_TEXT_SECTOR_SIZE (0x38ul) -#define ELF_DATA_SECTOR_SIZE (0x38ul) +#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) -extern uint8_t elf_main_header_byte[ELF_MAIN_HEADER_SIZE]; -extern uint8_t elf_text_sector_byte[ELF_TEXT_SECTOR_SIZE]; -extern uint8_t elf_data_sector_byte[ELF_DATA_SECTOR_SIZE]; +extern char elf_main_header_byte[ELF_MAIN_HEADER_SIZE]; +extern char elf_text_sector_byte[ELF_TEXT_SECTOR_SIZE]; +extern char elf_data_sector_byte[ELF_DATA_SECTOR_SIZE]; -extern void elf_main_header(uint32_t entry_point, - uint8_t has_program, - uint8_t for_linux, - uint8_t for_x86_64); +extern void elf_main_header(int entry_point, + int has_program, + int for_linux, + int for_x86_64); -extern void elf_text_sector(uint64_t text_size, - uint64_t data_size); +extern void elf_text_sector(int text_size, + int data_size); -extern void elf_data_sector(uint64_t text_size, - uint64_t data_size); +extern void elf_data_sector(int text_size, + int data_size); #endif diff --git a/test/heyo.eax b/test/heyo.eax index 00679d3..76a8868 100644 --- a/test/heyo.eax +++ b/test/heyo.eax @@ -20,7 +20,6 @@ end procedure unix program main begin - mov r10d 0x11223344 fastcall heyo fastcall cyaa fastcall heyo