New special instruction building...
This commit is contained in:
parent
6c1e05c926
commit
48e2061aaa
@ -9,10 +9,12 @@ int main (void) {
|
||||
|
||||
output_array = malloc (144UL * sizeof (* output_array));
|
||||
|
||||
assemble (ADC, D64, REG, R1, REG, R2);
|
||||
assemble (ADC, D32, REG, R1, MEM, 12);
|
||||
assemble (ADC, D16, MEM, 12, REG, R10);
|
||||
assemble (ADC, D8, REG, R3, IMM, 0X77);
|
||||
build_regular (ADC, D64, REG, R1, REG, R2);
|
||||
build_regular (ADC, D32, REG, R1, MEM, 12);
|
||||
build_regular (ADC, D16, MEM, 12, REG, R10);
|
||||
build_regular (ADC, D8, REG, R3, IMM, 0X77);
|
||||
build_special_1 (LOCK);
|
||||
build_special_2 (PAUSE);
|
||||
|
||||
for (index = 0; index < output_count; ++index) {
|
||||
printf ("%02X \n", output_array [index]);
|
||||
|
@ -19,6 +19,15 @@ splint assembler.h:
|
||||
-- no warnings at all.
|
||||
*/
|
||||
|
||||
#define REGULAR_START (ADD)
|
||||
#define REGULAR_COUNT (UMUL - REGULAR_START)
|
||||
#define IRREGULAR_START (UMUL)
|
||||
#define IRREGULAR_COUNT (NOP - IRREGULAR_START)
|
||||
#define SPECIAL_1_START (NOP)
|
||||
#define SPECIAL_1_COUNT (SYSENTER - SPECIAL_1_START)
|
||||
#define SPECIAL_2_START (SYSENTER)
|
||||
#define SPECIAL_2_COUNT (ENTER - SPECIAL_2_START)
|
||||
|
||||
typedef signed int form;
|
||||
typedef unsigned int next;
|
||||
typedef unsigned char byte;
|
||||
@ -56,7 +65,7 @@ static void build_long_prefix (form when,
|
||||
|
||||
static void build_register_direction (form when,
|
||||
form destination,
|
||||
form source) {
|
||||
form source) { /* LENGTH */
|
||||
place (when, (byte) (0XC0 + 0X01 * (destination % 8) + 0X08 * (source % 8)));
|
||||
}
|
||||
|
||||
@ -84,124 +93,12 @@ static void build_regular_instruction (form when,
|
||||
+ 0XC0 * ((from == IMM) && (to == REG))));
|
||||
}
|
||||
|
||||
/* EXPERIMENTAL CODE */
|
||||
|
||||
//~static void add (void) { place (0XFF); } /* REGULAR */
|
||||
//~static void or (void) { place (0XFF); }
|
||||
//~static void adc (void) { place (0XFF); }
|
||||
//~static void sbb (void) { place (0XFF); }
|
||||
//~static void and (void) { place (0XFF); }
|
||||
//~static void sub (void) { place (0XFF); }
|
||||
//~static void xor (void) { place (0XFF); }
|
||||
//~static void cmp (void) { place (0XFF); }
|
||||
//~static void umul (void) { place (0XFF); } /* IRREGULAR */
|
||||
//~static void udiv (void) { place (0XFF); } /* STDLIB CANCER FIX */
|
||||
//~static void imul (void) { place (0XFF); }
|
||||
//~static void idiv (void) { place (0XFF); }
|
||||
//~static void inc (void) { place (0XFF); }
|
||||
//~static void dec (void) { place (0XFF); }
|
||||
//~static void not (void) { place (0XFF); }
|
||||
//~static void neg (void) { place (0XFF); }
|
||||
|
||||
//~static void enter (form dynamic_storage,
|
||||
//~form nesting_level) {
|
||||
//~place (0XC8);
|
||||
//~place ((byte) (dynamic_storage / 1) % 256); /* FIX LATER */
|
||||
//~place ((byte) (dynamic_storage / 256) % 256);
|
||||
//~place ((byte) (nesting_level / 1) % 256);
|
||||
//~}
|
||||
|
||||
//~static void leave (void) {
|
||||
//~place (0XC9);
|
||||
//~}
|
||||
|
||||
//~static void call (void) { place (0XFF); }
|
||||
//~static void ret (void) { place (0XC3); } /* NEAR, NOT FAR (INTERSEGMENT) */
|
||||
//~static void sysenter (void) { place (0X0F); place (0X34); }
|
||||
//~static void sysexit (void) { place (0X0F); place (0X35); }
|
||||
//~static void syscall (void) { place (0X0F); place (0X05); }
|
||||
//~static void sysret (void) { place (0X0F); place (0X07); }
|
||||
//~static void jmp (void) { place (0XFF); }
|
||||
//~static void jpe (void) { place (0XFF); }
|
||||
//~static void js (void) { place (0XFF); }
|
||||
//~static void jpo (void) { place (0XFF); }
|
||||
//~static void je (void) { place (0XFF); }
|
||||
//~static void jne (void) { place (0XFF); }
|
||||
//~static void jz (void) { place (0XFF); }
|
||||
//~static void jnz (void) { place (0XFF); }
|
||||
//~static void ja (void) { place (0XFF); }
|
||||
//~static void jna (void) { place (0XFF); }
|
||||
//~static void jb (void) { place (0XFF); }
|
||||
//~static void jnb (void) { place (0XFF); }
|
||||
//~static void mov (void) { place (0XFF); } /* EXTEND */
|
||||
//~static void cmovpe (void) { place (0XFF); }
|
||||
//~static void cmovs (void) { place (0XFF); }
|
||||
//~static void cmovpo (void) { place (0XFF); }
|
||||
//~static void cmove (void) { place (0XFF); }
|
||||
//~static void cmovne (void) { place (0XFF); }
|
||||
//~static void cmovz (void) { place (0XFF); }
|
||||
//~static void cmovnz (void) { place (0XFF); }
|
||||
//~static void cmova (void) { place (0XFF); }
|
||||
//~static void cmovna (void) { place (0XFF); }
|
||||
//~static void cmovb (void) { place (0XFF); }
|
||||
//~static void cmovnb (void) { place (0XFF); }
|
||||
//~static void lock (void) { place (0XF0); }
|
||||
//~static void hlt (void) { place (0XF4); }
|
||||
//~static void in (void) { place (0XFF); }
|
||||
//~static void out (void) { place (0XFF); }
|
||||
//~static void push (void) { place (0XFF); }
|
||||
//~static void pop (void) { place (0XFF); }
|
||||
//~static void bswap (void) { place (0XFF); }
|
||||
//~static void test (void) { place (0XFF); }
|
||||
//~static void rcl (void) { place (0XFF); }
|
||||
//~static void rcr (void) { place (0XFF); }
|
||||
//~static void rol (void) { place (0XFF); }
|
||||
//~static void ror (void) { place (0XFF); }
|
||||
//~static void shl (void) { place (0XFF); }
|
||||
//~static void shr (void) { place (0XFF); }
|
||||
//~static void sal (void) { place (0XFF); }
|
||||
//~static void sar (void) { place (0XFF); }
|
||||
//~static void rep (void) { place (0XFF); }
|
||||
//~static void repe (void) { place (0XFF); }
|
||||
//~static void repne (void) { place (0XFF); }
|
||||
//~static void repz (void) { place (0XFF); }
|
||||
//~static void loop (void) { place (0XFF); }
|
||||
//~static void loope (void) { place (0XFF); }
|
||||
//~static void loopne (void) { place (0XFF); }
|
||||
//~static void pause (void) { place (0XF3); place (0X90); }
|
||||
//~static void xadd (void) { place (0XFF); }
|
||||
//~static void xchg (void) { place (0XFF); }
|
||||
//~static void lea (void) { place (0XFF); }
|
||||
//~static void popcnt (void) { place (0XFF); }
|
||||
//~static void inti (void) { place (0XFF); }
|
||||
//~static void bsf (void) { place (0XFF); }
|
||||
//~static void bsr (void) { place (0XFF); }
|
||||
//~static void bound (void) { place (0XFF); }
|
||||
//~static void fadd (void) { place (0XFF); }
|
||||
//~static void fsub (void) { place (0XFF); }
|
||||
//~static void fmul (void) { place (0XFF); }
|
||||
//~static void fdiv (void) { place (0XFF); }
|
||||
//~static void fnop (void) { place (0XFF); }
|
||||
//~static void fxam (void) { place (0XFF); }
|
||||
//~static void fabs (void) { place (0XFF); }
|
||||
//~static void fscale (void) { place (0XFF); }
|
||||
//~static void fsin (void) { place (0XFF); }
|
||||
//~static void fcos (void) { place (0XFF); }
|
||||
//~static void fsqrt (void) { place (0XFF); }
|
||||
//~static void fchs (void) { place (0XFF); }
|
||||
//~static void fxch (void) { place (0XFF); }
|
||||
//~static void frem (void) { place (0XFF); }
|
||||
//~static void fldpi (void) { place (0XFF); }
|
||||
//~static void fldz (void) { place (0XFF); }
|
||||
//~static void cpuid (void) { place (0X0F); place (0XA2); }
|
||||
//~static void movbe (void) { place (0XFF); } /* [48]0F38[F0-RM/F1-MR][05+8R] */
|
||||
|
||||
static void assemble (operation_index operation,
|
||||
size_index size,
|
||||
type_index to,
|
||||
form destination,
|
||||
type_index from,
|
||||
form source) {
|
||||
static void build_regular (operation_index operation,
|
||||
size_index size,
|
||||
type_index to,
|
||||
form destination,
|
||||
type_index from,
|
||||
form source) {
|
||||
build_short_prefix (size == D16);
|
||||
|
||||
build_long_prefix ((size == D64)
|
||||
@ -220,3 +117,21 @@ static void assemble (operation_index operation,
|
||||
build_register_redirection ((to == REG) && (from == MEM), destination);
|
||||
build_register_redirection ((to == MEM) && (from == REG), source);
|
||||
}
|
||||
|
||||
static void build_special_1 (operation_index operation) {
|
||||
const byte data [1 * SPECIAL_1_COUNT] = {
|
||||
0X90, 0XC3, 0XCB, 0XC9, 0XF0, 0XF4
|
||||
};
|
||||
|
||||
place (1, data [operation - SPECIAL_1_START]);
|
||||
}
|
||||
|
||||
static void build_special_2 (operation_index operation) {
|
||||
const byte data [2 * SPECIAL_2_COUNT] = {
|
||||
0X0F, 0X0F, 0X0F, 0X0F, 0XF3, 0X0F,
|
||||
0X34, 0X35, 0X05, 0X07, 0X90, 0XA2
|
||||
};
|
||||
|
||||
place (1, data [operation - SPECIAL_2_START]);
|
||||
place (1, data [operation - SPECIAL_2_START + SPECIAL_2_COUNT]);
|
||||
}
|
||||
|
@ -14,27 +14,28 @@ typedef enum {
|
||||
AND, SUB, XOR, CMP,
|
||||
UMUL, UDIV, IMUL, IDIV,
|
||||
INC, DEC, NOT, NEG,
|
||||
ENTER, LEAVE, CALL, RET,
|
||||
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,
|
||||
LOCK, HLT, IN, OUT,
|
||||
PUSH, POP, BSWAP, TEST,
|
||||
RCL, RCR, ROL, ROR,
|
||||
SHL, SHR, SAL, SAR,
|
||||
REP, REPE, REPNE, REPZ,
|
||||
LOOP, LOOPE, LOOPNE, PAUSE,
|
||||
LOOP, LOOPE, LOOPNE, MOVBE,
|
||||
XADD, XCHG, LEA, POPCNT,
|
||||
INTI, BSF, BSR, BOUND,
|
||||
FADD, FSUB, FMUL, FDIV,
|
||||
FNOP, FXAM, FABS, FSCALE,
|
||||
FSIN, FCOS, FSQRT, FCHS,
|
||||
FXCH, FREM, FLDPI, FLDZ,
|
||||
CPUID, MOVBE,
|
||||
} operation_index;
|
||||
|
||||
typedef enum {
|
||||
|
Loading…
x
Reference in New Issue
Block a user