This commit is contained in:
anon 2024-07-23 14:01:05 +02:00
commit 34900fcb9a
4 changed files with 162 additions and 89 deletions

View File

@ -19,8 +19,8 @@
static int assemble_clean_up_queued = 0;
static unsigned int empty_count = 0;
static unsigned int empty_holes = 0;
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;
@ -64,10 +64,7 @@ static void asmdirimm (int when, unsigned int size, unsigned int data) {
static void input_at (int when, unsigned int size, unsigned int data, unsigned int base) {
asmdirrel (when, data);
input ((when), (base >> 0) & 0xff);
input ((when) && (size >= D16), (base >> 8) & 0xff);
input ((when) && (size >= D32), (base >> 16) & 0xff);
input ((when) && (size >= D32), (base >> 24) & 0xff);
input_by (when, size, base);
}
static int front (unsigned int data) {
@ -90,11 +87,11 @@ static int near (unsigned int label) {
return (label && 0);
}
static void build_short (int when) {
static void build_short_prefix (int when) {
input (when, 0x66);
}
static void build_long (unsigned int registers, unsigned int to, unsigned int from) {
static void build_long_prefix (unsigned int registers, unsigned int to, unsigned int from) {
input (registers || to || from, 0x40 + 0x01 * to + 0x04 * from + 0x08 * registers);
}
@ -111,11 +108,9 @@ static void build_constant (int when, unsigned int size) {
}
static void build_regular (unsigned int operation, unsigned int size, unsigned int to, unsigned int destination, unsigned int from, unsigned int source) {
build_short (size == D16);
build_short_prefix (size == D16);
build_long (size == D64,
(to == REG) && (upper (destination)),
(from == REG) && (upper (source)));
build_long_prefix (size == D64, (to == REG) && (upper (destination)), (from == REG) && (upper (source)));
input ((size == D8) && (to == REG)
&& ((from == REG) || (from == IMM))
@ -126,9 +121,7 @@ static void build_regular (unsigned int operation, unsigned int size, unsigned i
input ((from == IMM) && (to == REG) && (destination == 0), 0x05 + 0x08 * (operation & 0x07) - 0x01 * (size == D8));
build_constant ((from == IMM)
&& ! ((to == REG) && (destination == 0)),
size);
build_constant ((from == IMM) && ! ((to == REG) && (destination == 0)), size);
input (! ((from == IMM) && (to == REG) && (destination == 0)),
(destination & 0x07) * ((to == REG) && (from == IMM))
@ -153,16 +146,15 @@ static void build_regular (unsigned int operation, unsigned int size, unsigned i
}
static void build_irregular (unsigned int operation, unsigned int size, unsigned int to, unsigned int destination) {
build_short (size == D16);
build_short_prefix (size == D16);
build_long (size == D64, (to == REG) && (upper (destination)), 0);
build_long_prefix (size == D64, (to == REG) && (upper (destination)), 0);
input ((size == D8) && (to == REG) && front (destination), 0x40);
input (1, 0xf7 + 0x08 * ((operation == INC) || (operation == DEC)) - 0x01 * (size == D8));
input (to == REG, 0xc0 + 0x08 * (operation - IRREGULAR_BEGIN) + 0x01 * (destination & 0x07));
input (to == MEM, 0x05 + 0x08 * (operation - IRREGULAR_BEGIN));
}
@ -191,9 +183,9 @@ static void build_jump_if (unsigned int operation, unsigned int size, unsigned i
}
static void build_move_if (unsigned int operation, unsigned int size, unsigned int to, unsigned int destination, unsigned int from, unsigned int source) {
build_short (size == D16);
build_short_prefix (size == D16);
build_long (size == D64, (to == REG) && (upper (destination)), (from == REG) && (upper (source)));
build_long_prefix (size == D64, (to == REG) && (upper (destination)), (from == REG) && (upper (source)));
input (1, 0x0f);
input (1, 0x40 + operation - MOVE_IF_BEGIN);
@ -211,26 +203,25 @@ static void build_jump (unsigned int size, unsigned int to, unsigned int destina
input (to == MEM, 0xff);
input (to == MEM, 0x25);
input_at (to == REL, D32, destination, - (text_sector_size + 4));
input_at (to == REL, D32, destination, -(text_sector_size + 4));
input_at (to == MEM, D32, destination, 0x4010b0);
}
static void build_move (unsigned int size, unsigned int to, unsigned int destination, unsigned int from, unsigned int source) {
build_short (size == D16);
build_short_prefix (size == D16);
build_long (size == D64, (to == REG) && (upper (destination)), (from == REG) && (upper (source)));
build_long_prefix (size == D64, (to == REG) && (upper (destination)), (from == REG) && (upper (source)));
input ((to == REG) && (from == REG), 0x88 + (size != D8));
input ((to == REG) && (from == MEM), 0x8a + (size != D8));
input ((to == MEM) && (from == REG), 0x88 + (size != D8));
input ((to == REG) && (from == REG), 0x88 + 0x01 * (size != D8));
input ((to == REG) && (from == MEM), 0x8a + 0x01 * (size != D8));
input ((to == MEM) && (from == REG), 0x88 + 0x01 * (size != D8));
build_at ((to == REG) && (from == MEM), destination);
build_at ((to == MEM) && (from == REG), source);
input ((to == REG) && ((from == IMM) || (from == REL)), 0xb8 + 0x01 * (destination & 0x07));
input ((to == MEM) && (from == IMM), 0xc6 + (size != D8));
input ((to == MEM) && (from == IMM), 0xc6 + 0x01 * (size != D8));
input ((to == MEM) && (from == IMM), 0x05);
input_at ((to == REG) && (from == MEM), D32, source, 0x1000);
@ -247,7 +238,7 @@ static void build_call (unsigned int from, unsigned int source) {
input (from == REL, 0xe8);
input (from == REG, 0xff);
input_at (from == REL, D32, source, - (text_sector_size + 4));
input_at (from == REL, D32, source, -(text_sector_size + 4));
input (from == REG, (0xd0 + 0x01 * (source & 0x07)));
}
@ -260,7 +251,7 @@ static void build_enter (unsigned int dynamic_storage, unsigned int nesting_leve
}
static void build_in_out (unsigned int move, unsigned int size, unsigned int type, unsigned int port) {
build_short (size == D16);
build_short_prefix (size == D16);
input (1, 0xe4 + 0x01 * (size != D8) + 0x02 * (move != OUT) + 0x08 * (type == REG));
@ -268,7 +259,7 @@ static void build_in_out (unsigned int move, unsigned int size, unsigned int typ
}
static void build_pop (unsigned int size, unsigned int to, unsigned int destination) {
build_short (size == D16);
build_short_prefix (size == D16);
input ((to == REG) && (upper (destination)), 0x41);
@ -280,7 +271,7 @@ static void build_pop (unsigned int size, unsigned int to, unsigned int destinat
}
static void build_push (unsigned int size, unsigned int from, unsigned int source) {
build_short (size == D16);
build_short_prefix (size == D16);
input ((from == REG) && (upper (source)), 0x41);
@ -314,11 +305,11 @@ static void assemble_clean_up (void) {
unsigned int text_sector_size = 0;
unsigned char * text_sector_byte = NULL;
int was_instruction_array_empty = 0;
int was_instruction_array_empty = 0;
unsigned int text_entry_point = 0;
void assemble (unsigned int count, unsigned int * array) {
unsigned int index = 0;
unsigned int index;
if ((count == 0) || (array == NULL)) {
was_instruction_array_empty = 1;
@ -335,7 +326,7 @@ void assemble (unsigned int count, unsigned int * array) {
assemble_clean_up_queued = !assemble_clean_up_queued;
}
while (index < count) {
for (index = 0; index < count; ++index) {
if (array [index] == ASMDIRREL) {
asmdirrel (1, array [index + 1]);
index += 1;
@ -343,10 +334,9 @@ void assemble (unsigned int count, unsigned int * array) {
asmdirmem (1, array [index + 1]);
index += 1;
} else if (array [index] == ASMDIRIMM) {
unsigned int repeat = 0;
while (repeat < array [index + 2]) {
unsigned int repeat;
for (repeat = 0; repeat < array [index + 2]; ++repeat) {
asmdirimm (1, array [index + 1], array [index + 3 + repeat]);
++repeat;
}
index += array [index + 2] + 2;
} else if ((array [index] >= REGULAR_BEGIN) && (array [index] <= REGULAR_END)) {
@ -394,24 +384,20 @@ void assemble (unsigned int count, unsigned int * array) {
} else {
return;
}
++index;
}
text_entry_point = empty_store [0];
index = 0;
while (index < empty_holes) {
for (index = 1; index < empty_holes; ++index) {
unsigned int set = 0;
unsigned int get = empty_array [index];
replace ((unsigned char *) & set, & text_sector_byte [get], sizeof (set));
printf ("@%08x :%08x <> %08x + %08x -> %08x\n", get, empty_imbue [index], set, empty_store [empty_imbue [index]], set + empty_store [empty_imbue [index]]);
set += empty_store [empty_imbue [index]];
replace (& text_sector_byte [get], (unsigned char *) & set, sizeof (set));
++index;
}
}

View File

@ -8,7 +8,6 @@ begin
mov esi heyo_data
mov edx 12
syscall
lol:
exit 86
exit 255
end program

110
test/major_stress_test.eax Normal file
View File

@ -0,0 +1,110 @@
fast procedure read_character
begin
mov eax 0
mov edi r12d
mov esi r13d
mov edx 1
syscall
end procedure
fast procedure write_character
begin
mov eax 1
mov edi r12d
mov esi r13d
mov edx 1
syscall
end procedure
fast procedure write_string
begin
mov eax 1
mov edi r12d
mov esi r13d
mov edx r14d
syscall
end procedure
fast procedure write_space
s8 space = " "
begin
mov eax 1
mov edi 1
mov esi space
mov edx 1
syscall
end procedure
fast procedure write_line_feed
s8 line_feed = "\n"
begin
mov eax 1
mov edi 1
mov esi line_feed
mov edx 1
syscall
end procedure
unix program main
s8 <> failure = "> nop file\n\0"
s8 <> digits = "0123456789abcdef"
s32 file = 0
s8 byte = 0
begin
pop r11
cmp r11 2
je skip
mov r12d 1
mov r13d failure
mov r14d 12
fastcall write_string
exit 1
skip:
pop r11
pop r11
mov eax 2
mov edi r11d
xor esi esi
xor edx edx
syscall
mov [file] eax
main_loop:
mov r12d [file]
mov r13d byte
call read_character
mov r10d eax
mov r15b [byte]
cmp r15b 144
jne main_loop_skip
fastcall write_line_feed
main_loop_skip:
mov r12d 1
mov r13d digits
sar r15d 4
add r13d r15d
call write_character
mov r12d 1
mov r13d digits
mov r15b [byte]
and r15d 15
add r13d r15d
fastcall write_character
fastcall write_space
cmp r10d 0
jne main_loop
fastcall write_line_feed
mov eax 3
mov edi [file]
syscall
exit 0
end program

View File

@ -1,45 +1,23 @@
fast procedure heyo
s8 <> h = "Heyo world!\n"
begin
nop mov eax 1
nop mov edi 1
nop mov esi h
nop mov edx 12
nop syscall
end procedure
format ELF64 executable 3
fast procedure lnao
s8 <> l = "Lnao world!!!!\n"
begin
nop mov eax 1
nop mov edi 1
nop mov esi l
nop mov edx 15
nop syscall
end procedure
segment readable executable
fast procedure cyaa
s8 <> c = "Cyaa world!!!\n"
begin
nop mov eax 1
nop mov edi 1
nop mov esi c
nop mov edx 14
nop syscall
end procedure
entry $
unix program main
s8 <> m = "Meme world!!\n"
begin
nop fastcall heyo
nop mov eax 1
nop mov edi 1
nop mov esi m
nop mov edx 13
nop syscall
nop fastcall cyaa
nop fastcall lnao
nop mov eax 60
nop mov edi 60
nop syscall
end program
jmp cyaa
mov eax, 1
mov edi, 1
mov esi, heyo
mov edx, 12
syscall
cyaa:
mov eax, 60
mov edi, 60
syscall
segment readable writable
heyo: db 'Heyo world!', 10