Merge branch 'master' of https://codeberg.org/eaxcc/eaxcc
This commit is contained in:
commit
34900fcb9a
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
110
test/major_stress_test.eax
Normal 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
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user