Fixed tiny bug, we can have multiple variables now...
This commit is contained in:
@ -24,7 +24,7 @@
|
|||||||
#define MOVE_IF_COUNT (MOVE_IF_END - MOVE_IF_BEGIN + 1)
|
#define MOVE_IF_COUNT (MOVE_IF_END - MOVE_IF_BEGIN + 1)
|
||||||
|
|
||||||
// Regulates displacement, immediate, label, variable, constant, string data.
|
// Regulates displacement, immediate, label, variable, constant, string data.
|
||||||
#define TESTING_FOR_NOW (144)
|
#define TESTING_FOR_NOW (4)
|
||||||
static next empty_count = 0;
|
static next empty_count = 0;
|
||||||
static next empty_holes = 0;
|
static next empty_holes = 0;
|
||||||
static next empty_array [TESTING_FOR_NOW] = { 0 };
|
static next empty_array [TESTING_FOR_NOW] = { 0 };
|
||||||
@ -51,42 +51,44 @@ static void print (form when,
|
|||||||
/* 64-BIT SUPPORT */
|
/* 64-BIT SUPPORT */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void asmdirrel (next data) {
|
static void asmdirrel (form when,
|
||||||
|
next data) {
|
||||||
empty_array [empty_holes] = text_sector_size;
|
empty_array [empty_holes] = text_sector_size;
|
||||||
empty_imbue [empty_holes] = data;
|
empty_imbue [empty_holes] = data;
|
||||||
|
|
||||||
empty_holes += 1;
|
empty_holes += (next) when;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void asmdirmem (void) {
|
static void asmdirmem (form when) {
|
||||||
empty_store [empty_count] = text_sector_size;
|
empty_store [empty_count] = text_sector_size;
|
||||||
|
|
||||||
empty_count += 1;
|
empty_count += (next) when;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void delay (form when,
|
static void delay (form when,
|
||||||
size_index size,
|
size_index size,
|
||||||
next data) {
|
next data) {
|
||||||
/* */
|
/* */
|
||||||
place ((when != 0) && (size >= D8), (byte) 0x00);
|
asmdirrel (when, data);
|
||||||
place ((when != 0) && (size >= D16), (byte) 0x40);
|
|
||||||
place ((when != 0) && (size >= D32), (byte) 0x10);
|
place ((when != 0) && (size >= D8), (byte) 0xb0);
|
||||||
|
place ((when != 0) && (size >= D16), (byte) 0x10);
|
||||||
|
place ((when != 0) && (size >= D32), (byte) 0x40);
|
||||||
place ((when != 0) && (size >= D32), (byte) 0x00);
|
place ((when != 0) && (size >= D32), (byte) 0x00);
|
||||||
/* NO DEREFERENCING */
|
/* NO DEREFERENCING */
|
||||||
/* 64-BIT SUPPORT */
|
/* 64-BIT SUPPORT */
|
||||||
|
|
||||||
asmdirrel (data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void asmdirimm (size_index size,
|
static void asmdirimm (form when,
|
||||||
next redo,
|
size_index size,
|
||||||
|
//~next redo,
|
||||||
next data) {
|
next data) {
|
||||||
/* */
|
/* */
|
||||||
next i;
|
//~next i;
|
||||||
|
|
||||||
for (i = 0; i < redo; ++i) {
|
//~for (i = 0; i < redo; ++i) {
|
||||||
print (1, size, data);
|
print (when, size, data);
|
||||||
}
|
//~}
|
||||||
}
|
}
|
||||||
|
|
||||||
static form front (form data) { return ((data >= 4) && (data <= 7)); }
|
static form front (form data) { return ((data >= 4) && (data <= 7)); }
|
||||||
@ -311,7 +313,7 @@ static void build_move (size_index size,
|
|||||||
build_register_redirection ((to == REG) && (from == MEM), destination);
|
build_register_redirection ((to == REG) && (from == MEM), destination);
|
||||||
build_register_redirection ((to == MEM) && (from == REG), source);
|
build_register_redirection ((to == MEM) && (from == REG), source);
|
||||||
|
|
||||||
place ((to == REG) && (from == IMM), (byte) (0xb8
|
place ((to == REG) && ((from == IMM) || (from == REL)), (byte) (0xb8
|
||||||
//~+ 0x08 * (size != D8)
|
//~+ 0x08 * (size != D8)
|
||||||
+ 0x01 * (destination & 0x07)));
|
+ 0x01 * (destination & 0x07)));
|
||||||
|
|
||||||
@ -319,11 +321,11 @@ static void build_move (size_index size,
|
|||||||
place ((to == MEM) && (from == IMM), (byte) (0x05));
|
place ((to == MEM) && (from == IMM), (byte) (0x05));
|
||||||
|
|
||||||
delay ((to == REG) && (from == MEM), D32, source);
|
delay ((to == REG) && (from == MEM), D32, source);
|
||||||
delay ((to == REG) && (from == REL), D32, source);
|
|
||||||
print ((to == REG) && (from == IMM), size, source);
|
print ((to == REG) && (from == IMM), size, source);
|
||||||
delay ((to == MEM) && (from == REG), D32, (next) ~0);
|
delay ((to == MEM) && (from == REG), D32, (next) ~0);
|
||||||
delay ((to == MEM) && (from == IMM), D32, (next) ~0);
|
delay ((to == MEM) && (from == IMM), D32, (next) ~0);
|
||||||
print ((to == MEM) && (from == IMM), size, source);
|
print ((to == MEM) && (from == IMM), size, source);
|
||||||
|
delay ((to == REG) && (from == REL), D32, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
next text_sector_size = 0;
|
next text_sector_size = 0;
|
||||||
@ -343,15 +345,17 @@ void assemble (next count,
|
|||||||
|
|
||||||
for (index = 0; index < count; ++index) {
|
for (index = 0; index < count; ++index) {
|
||||||
if (array [index] == ASMDIRREL) {
|
if (array [index] == ASMDIRREL) {
|
||||||
asmdirrel (array [index + 1]);
|
asmdirrel (1, array [index + 1]);
|
||||||
index += 1;
|
index += 1;
|
||||||
|
printf ("array <%u> %08x\n", empty_holes - 1, empty_array [empty_holes - 1]);
|
||||||
|
printf ("imbue <%u> %08x\n", empty_holes - 1, empty_imbue [empty_holes - 1]);
|
||||||
} else if (array [index] == ASMDIRMEM) {
|
} else if (array [index] == ASMDIRMEM) {
|
||||||
asmdirmem ();
|
asmdirmem (1);
|
||||||
index += 0;
|
index += 1;
|
||||||
//~} else if (array [index] == ASMDIRIMM) {
|
printf ("store <%u> %08x\n", empty_count - 1, empty_store [empty_count - 1]);
|
||||||
//~asmdirimm (array [index + 1], array [index + 2],
|
} else if (array [index] == ASMDIRIMM) {
|
||||||
//~array [index + 3]);
|
asmdirimm (1, array [index + 1], array [index + 2]);
|
||||||
//~index += 3;
|
index += 2;
|
||||||
//~} else if (array [index] == ASMDIRREP) {
|
//~} else if (array [index] == ASMDIRREP) {
|
||||||
} else if ((array [index] >= REGULAR_BEGIN)
|
} else if ((array [index] >= REGULAR_BEGIN)
|
||||||
&& (array [index] <= REGULAR_END)) {
|
&& (array [index] <= REGULAR_END)) {
|
||||||
@ -395,16 +399,18 @@ void assemble (next count,
|
|||||||
array [index + 5]);
|
array [index + 5]);
|
||||||
index += 5;
|
index += 5;
|
||||||
} else {
|
} else {
|
||||||
exit (array [index]); // For debugging only!
|
//~exit (array [index]); // For debugging only!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (index = 0; index < empty_holes; ++index) {
|
for (index = 0; index < empty_holes; ++index) {
|
||||||
next set = 0, get = empty_array [index];
|
next set = 0, get = empty_array [index];
|
||||||
memcpy (& set, & text_sector_byte [get], sizeof (set));
|
memcpy (& set, & text_sector_byte [get], sizeof (set));
|
||||||
set += empty_store [empty_imbue [index]];
|
set += empty_store [empty_imbue [index]];
|
||||||
memcpy (& text_sector_byte [get], & set, sizeof (set));
|
memcpy (& text_sector_byte [get], & set, sizeof (set));
|
||||||
|
//~text_sector_byte [get + 3] += (byte) ((empty_store [empty_imbue [index]] >> 0) & 0xff);
|
||||||
|
//~text_sector_byte [get + 2] += (byte) ((empty_store [empty_imbue [index]] >> 8) & 0xff);
|
||||||
|
//~text_sector_byte [get + 1] += (byte) ((empty_store [empty_imbue [index]] >> 16) & 0xff);
|
||||||
|
//~text_sector_byte [get + 0] += (byte) ((empty_store [empty_imbue [index]] >> 24) & 0xff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,13 +4,21 @@ segment readable executable
|
|||||||
|
|
||||||
entry $
|
entry $
|
||||||
|
|
||||||
|
nop
|
||||||
mov eax, 1
|
mov eax, 1
|
||||||
|
nop
|
||||||
mov edi, 1
|
mov edi, 1
|
||||||
|
nop
|
||||||
mov esi, heyo
|
mov esi, heyo
|
||||||
|
nop
|
||||||
mov edx, 12
|
mov edx, 12
|
||||||
|
nop
|
||||||
syscall
|
syscall
|
||||||
|
nop
|
||||||
mov eax, 60
|
mov eax, 60
|
||||||
|
nop
|
||||||
mov edi, 60
|
mov edi, 60
|
||||||
|
nop
|
||||||
syscall
|
syscall
|
||||||
|
|
||||||
segment readable writable
|
segment readable writable
|
||||||
|
@ -9,16 +9,44 @@
|
|||||||
static unsigned int array [] = {
|
static unsigned int array [] = {
|
||||||
NOP, MOV, D32, REG, R0, IMM, 1,
|
NOP, MOV, D32, REG, R0, IMM, 1,
|
||||||
NOP, MOV, D32, REG, R7, IMM, 1,
|
NOP, MOV, D32, REG, R7, IMM, 1,
|
||||||
//~NOP, MOV, D32, REG, R6, REL, 0,
|
NOP, MOV, D32, REG, R6, REL, 0,
|
||||||
NOP, MOV, D32, REG, R6, IMM, 0x004010DA,
|
NOP, MOV, D32, REG, R2, IMM, 12,
|
||||||
|
NOP, SYSCALL,
|
||||||
|
NOP, MOV, D32, REG, R0, IMM, 1,
|
||||||
|
NOP, MOV, D32, REG, R7, IMM, 1,
|
||||||
|
NOP, MOV, D32, REG, R6, REL, 1,
|
||||||
NOP, MOV, D32, REG, R2, IMM, 12,
|
NOP, MOV, D32, REG, R2, IMM, 12,
|
||||||
NOP, SYSCALL,
|
NOP, SYSCALL,
|
||||||
NOP, MOV, D32, REG, R0, IMM, 60,
|
NOP, MOV, D32, REG, R0, IMM, 60,
|
||||||
NOP, MOV, D32, REG, R7, IMM, 60,
|
NOP, MOV, D32, REG, R7, IMM, 60,
|
||||||
NOP, SYSCALL
|
NOP, SYSCALL,
|
||||||
//~ASMDIRMEM, 0,
|
NOP,
|
||||||
//~ASMDIRIMM, D8, 12,
|
ASMDIRMEM, 0,
|
||||||
//~72, 101, 121, 111, 32, 119, 111, 114, 108, 100, 10, 0
|
ASMDIRIMM, D8, 72,
|
||||||
|
ASMDIRIMM, D8, 101,
|
||||||
|
ASMDIRIMM, D8, 121,
|
||||||
|
ASMDIRIMM, D8, 111,
|
||||||
|
ASMDIRIMM, D8, 32,
|
||||||
|
ASMDIRIMM, D8, 119,
|
||||||
|
ASMDIRIMM, D8, 111,
|
||||||
|
ASMDIRIMM, D8, 114,
|
||||||
|
ASMDIRIMM, D8, 108,
|
||||||
|
ASMDIRIMM, D8, 100,
|
||||||
|
ASMDIRIMM, D8, 33,
|
||||||
|
ASMDIRIMM, D8, 10,
|
||||||
|
ASMDIRMEM, 1,
|
||||||
|
ASMDIRIMM, D8, 67,
|
||||||
|
ASMDIRIMM, D8, 121,
|
||||||
|
ASMDIRIMM, D8, 97,
|
||||||
|
ASMDIRIMM, D8, 97,
|
||||||
|
ASMDIRIMM, D8, 32,
|
||||||
|
ASMDIRIMM, D8, 119,
|
||||||
|
ASMDIRIMM, D8, 111,
|
||||||
|
ASMDIRIMM, D8, 114,
|
||||||
|
ASMDIRIMM, D8, 108,
|
||||||
|
ASMDIRIMM, D8, 100,
|
||||||
|
ASMDIRIMM, D8, 33,
|
||||||
|
ASMDIRIMM, D8, 10
|
||||||
};
|
};
|
||||||
|
|
||||||
int main (void) {
|
int main (void) {
|
||||||
@ -29,8 +57,8 @@ int main (void) {
|
|||||||
file = fopen ("run_me_please", "w+");
|
file = fopen ("run_me_please", "w+");
|
||||||
|
|
||||||
elf_main_header (1, 1, 1, 0);
|
elf_main_header (1, 1, 1, 0);
|
||||||
elf_text_sector (34);
|
elf_text_sector (70);
|
||||||
elf_data_sector (34, 12);
|
elf_data_sector (70, 24);
|
||||||
|
|
||||||
fwrite (elf_main_header_byte, 1UL, ELF_MAIN_HEADER_SIZE, file);
|
fwrite (elf_main_header_byte, 1UL, ELF_MAIN_HEADER_SIZE, file);
|
||||||
fwrite (elf_text_sector_byte, 1UL, ELF_TEXT_SECTOR_SIZE, file);
|
fwrite (elf_text_sector_byte, 1UL, ELF_TEXT_SECTOR_SIZE, file);
|
||||||
@ -42,7 +70,7 @@ int main (void) {
|
|||||||
|
|
||||||
fwrite (text_sector_byte, 1UL, (size_t) text_sector_size, file);
|
fwrite (text_sector_byte, 1UL, (size_t) text_sector_size, file);
|
||||||
|
|
||||||
fwrite ("Heyo world!\n", 1UL, 12, file);
|
//~fwrite ("Heyo world!\n", 1UL, 12, file);
|
||||||
|
|
||||||
free (text_sector_byte);
|
free (text_sector_byte);
|
||||||
|
|
||||||
@ -52,24 +80,46 @@ int main (void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
7F_45_4C_46_02_01_01_03_00_00_00_00_00_00_00_00_
|
||||||
|
02_00_3E_00_01_00_00_00_B0_00_40_00_00_00_00_00_
|
||||||
|
40_00_00_00_00_00_00_00_00_00_00_00_00_00_00_00_
|
||||||
|
00_00_00_00_40_00_38_00_02_00_40_00_00_00_00_00_
|
||||||
|
01_00_00_00_05_00_00_00_00_00_00_00_00_00_00_00_
|
||||||
|
00_00_40_00_00_00_00_00_00_00_40_00_00_00_00_00_
|
||||||
|
D2_00_00_00_00_00_00_00_D2_00_00_00_00_00_00_00_
|
||||||
|
00_10_00_00_00_00_00_00_01_00_00_00_06_00_00_00_
|
||||||
|
D2_00_00_00_00_00_00_00_D2_10_40_00_00_00_00_00_
|
||||||
|
D2_10_40_00_00_00_00_00_0C_00_00_00_00_00_00_00_
|
||||||
|
0C_00_00_00_00_00_00_00_00_10_00_00_00_00_00_00_
|
||||||
|
90_B8_01_00_00_00_
|
||||||
|
90_BF_01_00_00_00_
|
||||||
|
90_BE_00_40_10_2A_
|
||||||
|
90_BA_0C_00_00_00_
|
||||||
|
90_0F_05_
|
||||||
|
90_B8_3C_00_00_00_
|
||||||
|
90_BF_3C_00_00_00_
|
||||||
|
90_0F_05_
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
GOOD
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
7F 45 4C 46 02 01 01 03 00 00 00 00 00 00 00 00
|
7F 45 4C 46 02 01 01 03 00 00 00 00 00 00 00 00
|
||||||
02 00 3E 00 01 00 00 00 B0 00 40 00 00 00 00 00
|
02 00 3E 00 01 00 00 00 B0 00 40 00 00 00 00 00
|
||||||
40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
|
||||||
00 00 00 00 40 00 38 00 02 00 40 00 00 00 00 00
|
00 00 00 00 40 00 38 00 02 00 40 00 00 00 00 00
|
||||||
01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00
|
01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00
|
||||||
00 00 40 00 00 00 00 00 00 00 40 00 00 00 00 00
|
00 00 40 00 00 00 00 00 00 00 40 00 00 00 00 00
|
||||||
D2 00 00 00 00 00 00 00 D2 00 00 00 00 00 00 00
|
DA 00 00 00 00 00 00 00 DA 00 00 00 00 00 00 00
|
||||||
00 10 00 00 00 00 00 00 01 00 00 00 06 00 00 00
|
00 10 00 00 00 00 00 00 01 00 00 00 06 00 00 00
|
||||||
D2 00 00 00 00 00 00 00 D2 10 40 00 00 00 00 00
|
DA 00 00 00 00 00 00 00 DA 10 40 00 00 00 00 00
|
||||||
D2 10 40 00 00 00 00 00 0C 00 00 00 00 00 00 00
|
DA 10 40 00 00 00 00 00 0C 00 00 00 00 00 00 00
|
||||||
0C 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00
|
0C 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00
|
||||||
C0 01 00 00 00
|
90 B8 01 00 00 00
|
||||||
C7 01 00 00 00
|
90 BF 01 00 00 00
|
||||||
C6 00 10 40 00
|
90 BE DA 10 40 00
|
||||||
C2 0C 00 00 00
|
90 BA 0C 00 00 00
|
||||||
0F 05
|
90 0F 05
|
||||||
C0 3C 00 00 00
|
90 B8 3C 00 00 00
|
||||||
C7 3C 00 00 00
|
90 BF 3C 00 00 00
|
||||||
0F 05
|
90 0F 05 48 65 79 6F 20 77 6F 72 6C 64 21 0A
|
||||||
48 65 79 6F 20 77 6F 72 6C 64 21 0A
|
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user