From eb2c1cb0f9f01a3ac21c94d2513955f3a9744194 Mon Sep 17 00:00:00 2001 From: Hane Date: Sun, 25 Jan 2026 00:11:43 +0100 Subject: [PATCH] 1-2: Complete MOV_RM_TF_R decoding --- 1-1/output.asm | 13 +++ 1-2/8086coded | Bin 0 -> 22112 bytes 1-2/compile.sh | 3 + 1-2/decoder.c | 251 ++++++++++++++++++++++++++++++++++++++++++++ 1-2/listing-40 | Bin 0 -> 39 bytes 1-2/listing-40.asm | 22 ++++ 1-2/nasm-compile.sh | 4 + 7 files changed, 293 insertions(+) create mode 100644 1-1/output.asm create mode 100755 1-2/8086coded create mode 100755 1-2/compile.sh create mode 100644 1-2/decoder.c create mode 100644 1-2/listing-40 create mode 100644 1-2/listing-40.asm create mode 100755 1-2/nasm-compile.sh diff --git a/1-1/output.asm b/1-1/output.asm new file mode 100644 index 0000000..2e7bfbd --- /dev/null +++ b/1-1/output.asm @@ -0,0 +1,13 @@ +bits 16 + +mov cx, bx +mov ch, ah +mov dx, bx +mov si, bx +mov bx, di +mov al, cl +mov ch, ch +mov bx, ax +mov bx, si +mov sp, di +mov bp, ax diff --git a/1-2/8086coded b/1-2/8086coded new file mode 100755 index 0000000000000000000000000000000000000000..0b5107dfb875955d785adeefa19a60aedff875f3 GIT binary patch literal 22112 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 literal 0 HcmV?d00001 diff --git a/1-2/compile.sh b/1-2/compile.sh new file mode 100755 index 0000000..04ac9ca --- /dev/null +++ b/1-2/compile.sh @@ -0,0 +1,3 @@ +#! /usr/bin/env bash + +gcc 1-2/decoder.c -O0 -g -gdwarf -o 1-2/8086coded diff --git a/1-2/decoder.c b/1-2/decoder.c new file mode 100644 index 0000000..6d7b66c --- /dev/null +++ b/1-2/decoder.c @@ -0,0 +1,251 @@ +#include +#include +#include +#include + +enum DT_INSTRUCTIONS + { + MOV_RM_TF_R = 0b1000'10, //d w + MOV_I_T_RM = 0b1100'011, // w + MOV_I_T_R = 0b1011, // w reg + MOV_M_T_A = 0b1010'000, // w + MOV_A_T_M = 0b1010'001, // w + MOV_RM_T_SR = 0b1000'1110, + MOV_SR_T_RM = 0b1000'1100, + }; + +enum MOV_REGISTER_MODE + { + MEM_NO_DISP = 0b00, + MEM_8BIT_DISP = 0b01, + MEM_16BIT_DISP = 0b010, + REG_NO_DISP = 0b11 + }; + +#define REG_ENCODING_TXT_LEN 3 +char REG_ENCODING_TXT[0b10000][REG_ENCODING_TXT_LEN] = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh", + "ax", "cx", "dx", "bx", "sp", "bp", "si", "di"}; + +#define EA_ENCODING_TXT_LEN 8 +char EA_ENCODING_TXT[0b1000][EA_ENCODING_TXT_LEN] = { "bx + si", "bx + di", "bp + si", "bp + di", + "si", "di", "bp", "bx"}; + +enum REG_ENCODING + { + R_AL = 0b000, + R_CL = 0b001, + R_DL = 0b010, + R_BL = 0b011, + R_AH = 0b100, + R_CH = 0b101, + R_DH = 0b110, + R_BH = 0b111 + }; + +enum WREG_ENCODING + { + WR_AX = 0b000, + WR_CX = 0b001, + WR_DX = 0b010, + WR_BX = 0b011, + WR_SP = 0b100, + WR_BP = 0b101, + WR_SI = 0b110, + WR_DI = 0b111 + }; + +typedef struct +{ + FILE *binary; + uint64_t size; +} binary_data; + +FILE *output; +binary_data bin; + +int MOV_RM_TF_R_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int bytes_read) +{ + const uint8_t wide_mask = 0b0000'0001; + const uint8_t dest_mask = 0b0000'0010; + const uint8_t mod_mask = 0b1100'0000; + const uint8_t regm_mask = 0b0011'1000; + + unsigned char byte[1]; + uint8_t low_disp = 0; + uint8_t high_disp = 0; + uint16_t wide_disp = 0; + uint8_t extra_bytes_read = 0; + + bool reg_is_dest = (byte1 & dest_mask); + uint8_t inst_mod = (byte2 & mod_mask) >> 6; + + //Effective Address string compose vars + char ea_string[18] = {'\0'}; + char *ea_string_write_ptr = ea_string; + + //Number of chars disp value takes + int disp_len = 0; + + uint8_t reg_value = 0; + uint8_t ea_table_value = 0; + switch (inst_mod) + { + case (REG_NO_DISP): + //Since we're doing register mode/register to register, both reg and r/m are affected by the W bit + //if D=1, dest is retrieved from the reg field in byte2 and src from r/m + uint8_t dest_value = (reg_is_dest) ? ((byte2 & regm_mask) >> 3) + ((byte1 & wide_mask) * 8) + : (byte2 & (regm_mask >> 3)) + ((byte1 & wide_mask) * 8); + uint8_t src_value = (reg_is_dest) ? (byte2 & (regm_mask >> 3)) + ((byte1 & wide_mask) * 8) + : ((byte2 & regm_mask) >> 3) + ((byte1 & wide_mask) * 8); + printf("%s %s, %s\n", "mov", REG_ENCODING_TXT[dest_value], REG_ENCODING_TXT[src_value]); + fprintf(output, "%s %s, %s\n", "mov", REG_ENCODING_TXT[dest_value], REG_ENCODING_TXT[src_value]); + break; + case (MEM_8BIT_DISP): + fread(byte, sizeof(byte), 1, bin.binary); + extra_bytes_read++; + low_disp = (uint8_t)byte[0]; + reg_value = ((byte2 & regm_mask) >> 3) + ((byte1 & wide_mask) * 8); + ea_table_value = (byte2 & (regm_mask >> 3)); + + //EA STRING GENERATION + *ea_string_write_ptr = '['; + ea_string_write_ptr++; + memcpy(ea_string_write_ptr, EA_ENCODING_TXT[ea_table_value], strlen(EA_ENCODING_TXT[ea_table_value])); + ea_string_write_ptr += strlen(EA_ENCODING_TXT[ea_table_value]); + memcpy(ea_string_write_ptr, " + ", 3); + ea_string_write_ptr += 3; + disp_len = sprintf(ea_string_write_ptr, "%d", low_disp); + ea_string_write_ptr += disp_len; + *ea_string_write_ptr = ']'; + //END + + printf("%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value] + : ea_string) + , (reg_is_dest ? ea_string + : REG_ENCODING_TXT[reg_value])); + fprintf(output, "%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value] + : ea_string) + , (reg_is_dest ? ea_string + : REG_ENCODING_TXT[reg_value])); + break; + case (MEM_16BIT_DISP): + fread(byte, sizeof(byte), 1, bin.binary); + extra_bytes_read++; + low_disp = (uint8_t)byte[0]; + fread(byte, sizeof(byte), 1, bin.binary); + extra_bytes_read++; + high_disp = (uint8_t)byte[0]; + + //Composing wide displacement + wide_disp = high_disp << 8; + wide_disp = wide_disp | low_disp; + reg_value = ((byte2 & regm_mask) >> 3) + ((byte1 & wide_mask) * 8); + ea_table_value = (byte2 & (regm_mask >> 3)); + + //EA STRING GENERATION + *ea_string_write_ptr = '['; + ea_string_write_ptr++; + memcpy(ea_string_write_ptr, EA_ENCODING_TXT[ea_table_value], strlen(EA_ENCODING_TXT[ea_table_value])); + ea_string_write_ptr += strlen(EA_ENCODING_TXT[ea_table_value]); + memcpy(ea_string_write_ptr, " + ", 3); + ea_string_write_ptr += 3; + disp_len = sprintf(ea_string_write_ptr, "%d", wide_disp); + ea_string_write_ptr += disp_len; + *ea_string_write_ptr = ']'; + //END + + printf("%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value] + : ea_string) + , (reg_is_dest ? ea_string + : REG_ENCODING_TXT[reg_value])); + fprintf(output, "%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value] + : ea_string) + , (reg_is_dest ? ea_string + : REG_ENCODING_TXT[reg_value])); + break; + case (MEM_NO_DISP): + //Checking if special case 110 applies + ea_table_value = (byte2 & (regm_mask >> 3)); + //If R/M equals 110, there actually is displacement to worry about + bool is_direct_address = (ea_table_value == 0b110); + if (is_direct_address) + { + fread(byte, sizeof(byte), 1, bin.binary); + extra_bytes_read++; + low_disp = (uint8_t)byte[0]; + fread(byte, sizeof(byte), 1, bin.binary); + extra_bytes_read++; + high_disp = (uint8_t)byte[0]; + + //Composing wide displacement + wide_disp = high_disp << 8; + wide_disp = wide_disp | low_disp; + } + + reg_value = ((byte2 & regm_mask) >> 3) + ((byte1 & wide_mask) * 8); + + if (is_direct_address) + { + //EA STRING GENERATION + *ea_string_write_ptr = '['; + ea_string_write_ptr++; + disp_len = sprintf(ea_string_write_ptr, "%d", wide_disp); + ea_string_write_ptr += disp_len; + *ea_string_write_ptr = ']'; + //END + } + else + { + //EA STRING GENERATION + *ea_string_write_ptr = '['; + ea_string_write_ptr++; + memcpy(ea_string_write_ptr, EA_ENCODING_TXT[ea_table_value], strlen(EA_ENCODING_TXT[ea_table_value])); + ea_string_write_ptr += strlen(EA_ENCODING_TXT[ea_table_value]); + *ea_string_write_ptr = ']'; + //END + } + + printf("%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value] + : ea_string) + , (reg_is_dest ? ea_string + : REG_ENCODING_TXT[reg_value])); + fprintf(output, "%s %s, %s\n", "mov", (reg_is_dest ? REG_ENCODING_TXT[reg_value] + : ea_string) + , (reg_is_dest ? ea_string + : REG_ENCODING_TXT[reg_value])); + break; + } + return extra_bytes_read; +} + +int main(int argc, char** argv) +{ + if (argc != 2) return -1; + if (CHAR_BIT != 8) return -2; + + unsigned char byte[1]; + bin.binary = fopen(argv[1], "rb"); + fseek(bin.binary, 0, SEEK_END); + bin.size = ftell(bin.binary); + fseek(bin.binary, 0, SEEK_SET); + + output = fopen("output.asm", "w"); + fprintf(output, "%s\n\n", "bits 16"); + + for (int bytes_read = 0; bytes_read < bin.size; bytes_read++) + { + fread(byte, sizeof(byte), 1, bin.binary); + uint8_t manip_inst = (uint8_t)byte[0]; + uint8_t inst = (uint8_t)byte[0]; + //For now we're just checking for RM_TF_R + manip_inst = (manip_inst >> 2); + if (manip_inst != MOV_RM_TF_R) break; + if (bytes_read >= bin.size) break; + fread(byte, sizeof(byte), 1, bin.binary); + bytes_read++; + uint8_t inst_byte2 = (uint8_t)byte[0]; + bytes_read += MOV_RM_TF_R_parse(inst, inst_byte2, 0, 0); + } + + return 0; +} diff --git a/1-2/listing-40 b/1-2/listing-40 new file mode 100644 index 0000000000000000000000000000000000000000..63b3ec56fcbcba6dc547e00cc6c39fd843595a02 GIT binary patch literal 39 vcmeBnyxrMz$6H&OqZzyPSQ)zIns^uf=3FSiu=p3}VtxhyY6}nb literal 0 HcmV?d00001 diff --git a/1-2/listing-40.asm b/1-2/listing-40.asm new file mode 100644 index 0000000..bd8aa5f --- /dev/null +++ b/1-2/listing-40.asm @@ -0,0 +1,22 @@ +bits 16 + +; Signed displacements +mov ax, [bx + di - 37] +mov [si - 300], cx +mov dx, [bx - 32] + +; Explicit sizes +mov [bp + di], byte 7 +mov [di + 901], word 347 + +; Direct address +mov bp, [5] +mov bx, [3458] + +; Memory-to-accumulator test +mov ax, [2555] +mov ax, [16] + +; Accumulator-to-memory test +mov [2554], ax +mov [15], ax diff --git a/1-2/nasm-compile.sh b/1-2/nasm-compile.sh new file mode 100755 index 0000000..a4c0a5a --- /dev/null +++ b/1-2/nasm-compile.sh @@ -0,0 +1,4 @@ +#! /usr/bin/env bash + +nasm -f bin 1-2/listing-39.asm -o 1-2/listing-39 +nasm -f bin 1-2/listing-40.asm -o 1-2/listing-40