This commit is contained in:
anon 2024-07-06 02:02:11 +02:00
commit bfd7a1ab04
4 changed files with 239 additions and 22 deletions

@ -4,19 +4,25 @@
#include "../source/assembler.h"
#include "../source/assembler.c"
static unsigned int array [29] = {
#define COUNT (29+24)
static unsigned int array [COUNT] = {
ADC, D64, REG, R1, REG, R2,
ADC, D32, REG, R1, MEM, 12,
ADC, D16, MEM, 12, REG, R10,
ADC, D8, REG, R3, IMM, 0X77,
INC, D16, REG, R0, LOCK
INC, D16, REG, R0, LOCK,
CMOVG, D64, REG, R1, REG, R1,
CMOVG, D64, REG, R1, REG, R9,
CMOVG, D64, REG, R9, REG, R1,
CMOVG, D64, REG, R9, REG, R9
};
int main (void) {
unsigned int index;
token_array = malloc (144UL * sizeof (* token_array));
assemble (29, array);
assemble (COUNT, array);
printf ("> %u\n", token_count);

@ -12,7 +12,7 @@ entry $
; 66 41 81 C1 FF 7F | add r9w 07fffh
; 66 81 05 00 11 00 00 FF 7F | add [x] 07fffh
nop
fff: nop
add r9w, [x2]
nop
add [x2], r9w
@ -354,11 +354,103 @@ entry $
;~idiv cx
nop
nop
nop
nnn: nop
jmp nnn
nop
jmp fff
nop
jmp rax
nop
jmp rcx
nop
jmp r8
nop
jmp r9
nop
jmp word[x2]
nop
jmp qword[x8]
nop
nop
nop
nop
jo nnn
nop
jno fff
nop
jb fff
nop
jae fff
nop
je fff
nop
jne fff
nop
jbe fff
nop
ja fff
nop
js fff
nop
jns fff
nop
jpe fff
nop
jpo fff
nop
jl fff
nop
jge fff
nop
jle fff
nop
jg fff
nop
nop
nop
nop
cmovo cx, r9w
nop
cmovg cx, r9w
nop
cmovo ecx, r9d
nop
cmovg ecx, r9d
nop
cmovo rcx, r9
nop
cmovg rcx, r9 ; 49 0F 4F C9
nop
xor rcx, rcx
nop
xor r9, rcx;+1
nop
xor rcx, r9;+4
nop
xor r9, r9;+1+4
nop
nop
nop
nop
cmovg rcx, rcx; 48 0F 4F C9
nop
cmovg rcx, r9; 49 0F 4F C9
nop
cmovg r9, rcx; 4C 0F 4F C9
nop
cmovg r9, r9; 4D 0F 4F C9
nop
nop
nop
nop

@ -27,14 +27,28 @@ splint assembler.h:
#define SPECIAL_1_END (HLT)
#define SPECIAL_2_BEGIN (SYSENTER)
#define SPECIAL_2_END (CPUID)
#define JUMP_IF_BEGIN (JO)
#define JUMP_IF_END (JG)
#define MOVE_IF_BEGIN (CMOVO)
#define MOVE_IF_END (CMOVG)
#define REGULAR_COUNT (REGULAR_END - REGULAR_BEGIN + 1)
#define IRREGULAR_COUNT (IRREGULAR_END - IRREGULAR_BEGIN + 1)
#define SPECIAL_1_COUNT (SPECIAL_1_END - SPECIAL_1_BEGIN + 1)
#define SPECIAL_2_COUNT (SPECIAL_2_END - SPECIAL_2_BEGIN + 1)
#define JUMP_IF_COUNT (JUMP_IF_END - JUMP_IF_BEGIN + 1)
#define MOVE_IF_COUNT (MOVE_IF_END - MOVE_IF_BEGIN + 1)
// Regulates displacement, immediate, label, variable, constant, string data.
static next * empty_from;
static next * empty_to;
static next * imbue_with;
static next * imbue_size;
// Main function.
static void place (form when,
byte data) {
/* */
token_array [token_count] = data;
token_count += (next) when;
@ -44,56 +58,94 @@ static form valid (form data) { return ((data >= 0) && (data <= 15)); }
static form lower (form data) { return ((data >= 0) && (data <= 7)); }
static form upper (form data) { return ((data >= 8) && (data <= 15)); }
// Important stuff that I need to handle later, it saves bytes!
static form far (next label) { return (1); /* DO NOT CHANGE YET! */ }
static form near (next label) { return (0); /* DO NOT CHANGE YET! */ }
// --
static void displacement (form size,
next data) {
/* */
(void) size;
place (1, (data >> 24) & 0XFF);
place (1, (data >> 16) & 0XFF);
place (1, (data >> 8) & 0XFF);
place (1, (data >> 0) & 0XFF);
}
// --
static void immediate (form size,
next data) {
/* */
(void) size;
place (1, (data >> 24) & 0XFF);
place (1, (data >> 16) & 0XFF);
place (1, (data >> 8) & 0XFF);
place (1, (data >> 0) & 0XFF);
}
static void build_short_prefix (form when) {
place (when, 0X66);
}
// 40-4D!0X02
static void build_long_prefix (form use_big_registers,
form use_new_destination,
form use_new_source) {
/* */
place (use_big_registers || use_new_destination || use_new_source,
(byte) (0X40
+ 0X01 * use_new_destination
+ 0X04 * use_new_source
+ 0X01 * use_new_source
+ 0X04 * use_new_destination
+ 0X08 * use_big_registers));
}
// C0-FF
static void build_register_direction (form when,
next destination,
next source) {
/* */
place (when, (byte) (0XC0
+ 0X01 * (destination % 8)
+ 0X08 * (source % 8)));
+ 0X01 * (destination & 0X07)
+ 0X08 * (source & 0X07)));
}
// 05-3D
static void build_register_redirection (form when,
next direction) {
/* */
place (when, (byte) (0X05
+ 0X08 * (direction % 8)));
+ 0X08 * (direction & 0X07)));
}
// 80/81
static void build_constant (form when,
size_index size) {
/* */
place (when, (byte) (0X80
+ 0X01 * (size != D8)));
}
// REGULAR_BEGIN-REGULAR_END D8-D64 REG/MEM R0-R15/MEM -||-/IMM -||-/IMM
static void build_regular (operation_index operation,
size_index size,
type_index to,
next destination,
type_index from,
next source) {
/* */
build_short_prefix (size == D16);
build_long_prefix (size == D64,
(to == REG) && (upper (destination)),
(from == REG) && (upper (source)));
(to == REG) && (upper ((form) destination)),
(from == REG) && (upper ((form) source)));
build_constant (from == IMM, size);
place (1, (byte) (0X08 * (operation - REGULAR_BEGIN)
+ destination % 8 * ((to == REG) && (from == IMM))
+ (destination & 0X07) * ((to == REG) && (from == IMM))
+ 0X01 * (size != D8)
+ 0X02 * ((from == MEM) && (to == REG))
+ 0X04 * ((from == IMM) && (to == MEM))
@ -106,27 +158,30 @@ static void build_regular (operation_index operation,
build_register_redirection ((to == MEM) && (from == REG), source);
}
// IRREGULAR_BEGIN-IRREGULAR_END D8-D64 REG/MEM R0-R15/MEM
static void build_irregular (operation_index operation,
size_index size,
type_index to,
next destination) {
/* */
build_short_prefix (size == D16);
build_long_prefix (size == D64,
(to == REG) && (upper (destination)), 0);
(to == REG) && (upper ((form) destination)), 0);
place (1, (byte) (0XF6
+ 0X08 * ((operation == INC) || (operation == DEC))
+ 0X01 * (size != D8)));
+ 0X01 * (size != D8)));
place (to == REG, (byte) (0XC0
+ 0X08 * (operation - IRREGULAR_BEGIN))
+ 0X01 * (destination % 8));
+ 0X01 * (destination & 0X07));
place (to == MEM, (byte) (0X05
+ 0X08 * (operation - IRREGULAR_BEGIN)));
}
// SPECIAL_1_BEGIN-SPECIAL_1_END
static void build_special_1 (operation_index operation) {
const byte data [1 * SPECIAL_1_COUNT] = {
0X90, 0XC3, 0XCB, 0XC9, 0XF0, 0XF4
@ -135,6 +190,7 @@ static void build_special_1 (operation_index operation) {
place (1, data [operation - SPECIAL_1_BEGIN]);
}
// SPECIAL_2_BEGIN-SPECIAL_2_END
static void build_special_2 (operation_index operation) {
const byte data [2 * SPECIAL_2_COUNT] = {
0X0F, 0X0F, 0X0F, 0X0F, 0XF3, 0X0F,
@ -145,10 +201,51 @@ static void build_special_2 (operation_index operation) {
place (1, data [operation - SPECIAL_2_BEGIN + SPECIAL_2_COUNT]);
}
// JUMP_IF_BEGIN-JUMP_IF_END D8/32 IMM8/32
static void build_jump_if (operation_index operation,
size_index size,
next location) {
/* */
(void) size; /* HIGHLY DEPENDS FOR FAR AND NEAR JUMPS! */
place (far (location), 0X0F); /* EVERYTHING IS FAR JUMP! */
place (far (location), (byte) (0X80 + operation - JUMP_IF_BEGIN));
place (near (location), (byte) (0X70 + operation - JUMP_IF_BEGIN));
//~displacement (4, 0X12345678);
}
// MOVE_IF_BEGIN-MOVE_IF_END D16-D64 REG R0-R15 -||-/MEM -||-/MEM
static void build_move_if (operation_index operation,
size_index size,
type_index to,
next destination,
type_index from,
next source) {
/* */
build_short_prefix (size == D16);
build_long_prefix (size == D64,
(to == REG) && (upper ((form) destination)),
(from == REG) && (upper ((form) source)));
place (1, 0X0F);
place (1, (byte) (0X40 + operation - MOVE_IF_BEGIN));
build_register_direction ((to == REG) && (from == REG),
destination, source);
build_register_redirection ((to == REG) && (from == MEM), destination);
//~displacement (4, 0X12345678); // Not implemented at this point!
}
next token_count;
byte * token_array;
void assemble (next count, next * array) {
void assemble (next count,
next * array) {
/* */
next index;
for (index = 0; index < count; ++index) {
@ -171,6 +268,17 @@ void assemble (next count, next * array) {
&& (array [index] <= SPECIAL_2_END)) {
build_special_2 (array [index + 0]);
index += 0;
} else if ((array [index] >= JUMP_IF_BEGIN)
&& (array [index] <= JUMP_IF_END)) {
build_jump_if (array [index + 0], array [index + 1],
array [index + 2]);
index += 2;
} else if ((array [index] >= MOVE_IF_BEGIN)
&& (array [index] <= MOVE_IF_END)) {
build_move_if (array [index + 0], array [index + 1],
array [index + 2], array [index + 3],
array [index + 4], array [index + 5]);
index += 5;
}
}
}

@ -15,19 +15,30 @@ typedef enum {
typedef enum {
ADD, OR, ADC, SBB,
AND, SUB, XOR, CMP,
/* */
INC, DEC, NOT, NEG,
UMUL, IMUL, UDIV, IDIV,
/* */
NOP, RETN, RETF, LEAVE,
LOCK, HLT,
/* */
SYSENTER, SYSEXIT, SYSCALL, SYSRET,
PAUSE, CPUID,
/* */
ENTER, CALL, IN, OUT,
JMP, JPE, JS, JPO,
JE, JNE, JZ, JNZ,
JA, JNA, JB, JNB,
MOV, CMOVPE, CMOVS, CMOVPO,
CMOVE, CMOVNE, CMOVZ, CMOVNZ,
CMOVA, CMOVNA, CMOVB, CMOVNB,
/* */
JMP,
JO, JNO, JB, JAE,
JE, JNE, JBE, JA,
JS, JNS, JPE, JPO,
JL, JGE, JLE, JG,
/* */
MOV,
CMOVO, CMOVNO, CMOVB, CMOVAE,
CMOVE, CMOVNE, CMOVBE, CMOVA,
CMOVS, CMOVNS, CMOVPE, CMOVPO,
CMOVL, CMOVGE, CMOVLE, CMOVG,
/* */
PUSH, POP, BSWAP, TEST,
RCL, RCR, ROL, ROR,
SHL, SHR, SAL, SAR,