Implemented pop, push and flag variations...

This commit is contained in:
xolatile
2024-07-17 09:44:14 -04:00
parent ef1b244239
commit 913c9b88a8
4 changed files with 129 additions and 73 deletions

@ -8,7 +8,7 @@
#define IRREGULAR_BEGIN (INC)
#define IRREGULAR_END (IDIV)
#define SPECIAL_1_BEGIN (NOP)
#define SPECIAL_1_END (HLT)
#define SPECIAL_1_END (PUSHF)
#define SPECIAL_2_BEGIN (SYSENTER)
#define SPECIAL_2_END (CPUID)
#define JUMP_IF_BEGIN (JO)
@ -18,7 +18,7 @@
#define REGULAR_COUNT (REGULAR_END - REGULAR_BEGIN + 1) // 16
#define IRREGULAR_COUNT (IRREGULAR_END - IRREGULAR_BEGIN + 1) // 16
#define SPECIAL_1_COUNT (SPECIAL_1_END - SPECIAL_1_BEGIN + 1) // 6
#define SPECIAL_1_COUNT (SPECIAL_1_END - SPECIAL_1_BEGIN + 1) // 8
#define SPECIAL_2_COUNT (SPECIAL_2_END - SPECIAL_2_BEGIN + 1) // 6
#define JUMP_IF_COUNT (JUMP_IF_END - JUMP_IF_BEGIN + 1) // 16
#define MOVE_IF_COUNT (MOVE_IF_END - MOVE_IF_BEGIN + 1) // 16
@ -219,9 +219,9 @@ static void build_irregular (operation_index operation,
}
static void build_special_1 (operation_index operation) {
// nop, retn, retf, leave, lock, hlt
// nop, retn, retf, leave, lock, hlt, popf, pushf
const byte data [1 * SPECIAL_1_COUNT] = {
0x90, 0xc3, 0xcb, 0xc9, 0xf0, 0xf4
0x90, 0xc3, 0xcb, 0xc9, 0xf0, 0xf4, 0x9d, 0x9c
};
input (1, data [operation - SPECIAL_1_BEGIN]);
@ -328,9 +328,59 @@ static void build_move (size_index size,
static void build_call (type_index from,
next source) {
// call
input ((from == REG) && (upper ((form) source)), (byte) 0x41);
input (from == REL, (byte) 0xe8);
input (from == REG, (byte) 0xff);
input_at (from == REL, D32, source, (next) -(text_sector_size + 4));
input (from == REG, (byte) (0xd0 + 0x01 * (source & 0x07)));
}
/*
static void build_enter (type_index from,
next source) {
// enter
input ((from == REG) && (upper ((form) source)), (byte) 0x41);
input (from == REL, (byte) 0xe8);
input (from == REG, (byte) 0xff);
input_at (from == REL, D32, source, (next) -(text_sector_size + 4));
input (from == REG, (byte) (0xd0 + 0x01 * (source & 0x07)));
}
*/
static void build_pop (size_index size,
type_index to,
next destination) {
// pop
build_short_prefix (size == D16);
input ((to == REG) && (upper ((form) destination)), (byte) 0x41);
input (to == REG, (byte) (0x58 + 0x01 * (destination & 0x07)));
input (to == MEM, (byte) 0x8f);
input (to == MEM, (byte) 0x05);
input_at (to == MEM, D32, destination, 0);
}
static void build_push (size_index size,
type_index from,
next source) {
// push
build_short_prefix (size == D16);
input ((from == REG) && (upper ((form) source)), (byte) 0x41);
input (from == REG, (byte) (0x50 + 0x01 * (source & 0x07)));
input (from == MEM, (byte) 0xff);
input (from == MEM, (byte) 0x35);
input (from == IMM, (byte) 0x68 + 0x02 * (size == D8));
input_at (from == MEM, D32, source, 0);
input_by (from == IMM, size, source);
}
static void assemble_clean_up (void) {
@ -429,6 +479,14 @@ void assemble (next count,
} else if (array [index] == CALL) {
build_call (array [index + 1], array [index + 2]);
index += 2;
} else if (array [index] == POP) {
build_pop (array [index + 1], array [index + 2],
array [index + 3]);
index += 3;
} else if (array [index] == PUSH) {
build_push (array [index + 1], array [index + 2],
array [index + 3]);
index += 3;
} else {
return;
}
@ -438,8 +496,11 @@ void assemble (next count,
for (index = 0; index < empty_holes; ++index) {
next set = 0, get = empty_array [index];
memcpy (& set, & text_sector_byte [get], sizeof (set));
set += empty_store [empty_imbue [index]];
memcpy (& text_sector_byte [get], & set, sizeof (set));
}
}

@ -29,7 +29,7 @@ typedef enum {
MUL, IMUL, DIV, IDIV,
/* */
NOP, RETN, RETF, LEAVE,
LOCK, HLT,
LOCK, HLT, POPF, PUSHF,
/* */
SYSENTER, SYSEXIT, SYSCALL, SYSRET,
PAUSE, CPUID,

@ -1,71 +1,45 @@
; fasm proc.asm proc && chmod +x proc && ./proc
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 main
heyo:
nop
mov eax, 1
nop
mov edi, 1
nop
mov esi, h
nop
mov edx, 12
nop
syscall
nop
call meme
nop
ret
cyaa:
nop
mov eax, 1
nop
mov edi, 1
nop
mov esi, c
nop
mov edx, 12
nop
syscall
nop
ret
main:
nop
call heyo
nop
call cyaa
nop
mov eax, 60
nop
mov edi, 60
nop
syscall
meme:
nop
mov eax, 1
nop
mov edi, 1
nop
mov esi, m
nop
mov edx, 12
nop
syscall
nop
ret
nop
segment readable writable
h: db "Heyo world!", 10
c: db "Cyaa world!", 10
m: db "Meme world!", 10
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

@ -47,12 +47,31 @@ main:
syscall
nop
call cyaa
lod:
nop
mov eax, 60
nop
mov edi, 60
nop
syscall
nop
nop
nop
nop
call rax
nop
call rcx
nop
call r8
nop
call r9
nop
call loc
nop
call lod
nop
nop
nop
segment readable writable
@ -60,6 +79,8 @@ h: db "Heyo world!", 10
m: db "Meme world!!", 10
c: db "Cyaa world!!!", 10
loc: dq 0
;~FASM EAXHLA
;~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 EA 00 40 00 00 00 00 00 02 00 3E 00 01 00 00 00 7C 00 00 00 00 00 00 00