From f984261641044ec8100541c82ec75f3567b9d93b Mon Sep 17 00:00:00 2001 From: Hane Date: Sun, 25 Jan 2026 20:50:45 +0100 Subject: [PATCH] 1-2 challenge: I_T_RM implemented --- 1-2/8086coded | Bin 27368 -> 29216 bytes 1-2/decoder.c | 193 +++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 185 insertions(+), 8 deletions(-) diff --git a/1-2/8086coded b/1-2/8086coded index 751d7956ec597431f672580038203a14f27dfc98..e6816394b480c626ef0e9b6e6a182232000556b3 100755 GIT binary patch literal 29216 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 #include #include +#include + +//TODO: Pass file struct and currently read bytes via param enum DT_INSTRUCTIONS { @@ -18,17 +21,20 @@ enum MOV_REGISTER_MODE { MEM_NO_DISP = 0b00, MEM_8BIT_DISP = 0b01, - MEM_16BIT_DISP = 0b010, + MEM_16BIT_DISP = 0b10, 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"}; + "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"}; + "si", "di", "bp", "bx" }; + +#define WORD_SIGNAL_LEN 6 +char WORD_SIGNAL_TXT[0b10][WORD_SIGNAL_LEN] = { "byte ", "word " }; /* enum REG_ENCODING */ /* { */ @@ -133,6 +139,167 @@ int MOV_I_T_R_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int bytes return extra_bytes_read; } +typedef struct { + char* string; + uint64_t len; +} output_string; + +void fill_ea_string(output_string *str, char* content, int16_t displacement) +{ + //EA STRING GENERATION + char* str_beg = str->string; + uint64_t disp_len = 0; + + *(str->string) = '['; + str->string++; + str->len++; + memcpy(str->string, content, strlen(content)); + str->string += strlen(content); + str->len += strlen(content); + if (displacement) + { + if (strlen(content) > 0) + { + memcpy(str->string, " + ", 3); + str->string += 3; + str->len += 3; + } + disp_len = sprintf(str->string, "%d", displacement); + str->string += disp_len; + str->len += disp_len; + } + *(str->string) = ']'; + str->string = str_beg; + str->len += 2; + //END + + return; +} + +int MOV_I_T_RM_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int bytes_read) +{ + const uint8_t wide_mask = 0b0000'0001; + const uint8_t mod_mask = 0b1100'0000; + const uint8_t regm_mask = 0b0000'0111; + + unsigned char byte[1]; + unsigned char payload[4]; + uint8_t high_disp = 0; + uint16_t wide_disp = 0; + uint8_t high_data = 0; + uint16_t wide_data = 0; + bool is_wide = wide_mask & byte1; + + uint8_t extra_bytes_read = 0; + + //Effective Address string compose vars + char ea_string[18] = {'\0'}; + char *ea_string_write_ptr = ea_string; + + //Immediate value string compose vars + output_string mem_data; + mem_data.len = 0; + mem_data.string = calloc(18, sizeof(char)); //"[bp + di + 65535]\0" + + //Number of chars disp value takes + int disp_len = 0; + enum MOV_REGISTER_MODE inst_mod = (byte2 & mod_mask) >> 6; + uint8_t extra_bytes = 1 + is_wide; + + uint8_t reg_value = 0; + uint8_t ea_table_value = (byte2 & regm_mask); + + switch (inst_mod) + { + case (REG_NO_DISP): + printf("Oh. This happened.\n"); + //This shouldn't happen, right? + break; + case (MEM_NO_DISP): + //If R/M equals 110, there actually is displacement to worry about + bool is_direct_address = (ea_table_value == 0b110); + if (is_direct_address) + extra_bytes += 1 + is_wide; + for (int i = 0; i < extra_bytes; i++) + { + fread(&(payload[i]), sizeof(byte), 1, bin.binary); + extra_bytes_read++; + } + + //Composing displacement and immediate values + if (is_direct_address) + { + wide_disp = payload[0]; + if (is_wide) + { + wide_disp = (payload[1] << 8) + wide_disp; + wide_data = payload[2]; + wide_data = (payload[3] << 8) + wide_data; + } + else + { + wide_data = payload[1]; + } + } + else + { + wide_data = payload[0]; + if (is_wide) + wide_data = (payload[1] << 8) + wide_data; + } + fill_ea_string(&mem_data, (is_direct_address ? "" : EA_ENCODING_TXT[ea_table_value]), wide_disp); + printf("%s %s, %s%d\n", "mov", mem_data.string, WORD_SIGNAL_TXT[is_wide], wide_data); + fprintf(output, "%s %s, %s%d\n", "mov", mem_data.string, WORD_SIGNAL_TXT[is_wide], wide_data); + break; + case (MEM_8BIT_DISP): + //If R/M equals 110, there actually is displacement to worry about + extra_bytes += 1; + for (int i = 0; i < extra_bytes; i++) + { + fread(&(payload[i]), sizeof(byte), 1, bin.binary); + extra_bytes_read++; + } + + //Composing displacement and immediate values + wide_disp = payload[0]; + wide_data = payload[1]; + if (is_wide) + { + wide_data = (payload[2] << 8) + wide_data; + } + + fill_ea_string(&mem_data, EA_ENCODING_TXT[ea_table_value], wide_disp); + printf("%s %s, %s%d\n", "mov", mem_data.string, WORD_SIGNAL_TXT[is_wide], wide_data); + fprintf(output, "%s %s, %s%d\n", "mov", mem_data.string, WORD_SIGNAL_TXT[is_wide], wide_data); + break; + case (MEM_16BIT_DISP): + //If R/M equals 110, there actually is displacement to worry about + extra_bytes += 2; + for (int i = 0; i < extra_bytes; i++) + { + fread(&(payload[i]), sizeof(byte), 1, bin.binary); + extra_bytes_read++; + } + + //Composing displacement and immediate values + wide_disp = payload[0]; + wide_disp = (payload[1] << 8) + wide_disp; + + wide_data = payload[2]; + if (is_wide) + { + wide_data = (payload[3] << 8) + wide_data; + } + + fill_ea_string(&mem_data, EA_ENCODING_TXT[ea_table_value], wide_disp); + printf("%s %s, %s%d\n", "mov", mem_data.string, WORD_SIGNAL_TXT[is_wide], wide_data); + fprintf(output, "%s %s, %s%d\n", "mov", mem_data.string, WORD_SIGNAL_TXT[is_wide], wide_data); + break; + } + + + return extra_bytes_read; +} int MOV_RM_TF_R_parse(uint8_t byte1, uint8_t byte2, binary_data *binary, int bytes_read) { @@ -305,19 +472,29 @@ int main(int argc, char** argv) for (int bytes_read = 0; bytes_read < bin.size; bytes_read++) { + uint8_t inst_byte2 = 0; fread(byte, sizeof(byte), 1, bin.binary); uint8_t manip_inst = (uint8_t)byte[0]; uint8_t inst = (uint8_t)byte[0]; //We're checking for all MOV except segment registers manip_inst = (manip_inst >> 1); - if (manip_inst == MOV_M_T_A || manip_inst == MOV_A_T_M) - { + switch (manip_inst) + { + case MOV_M_T_A: + case MOV_A_T_M: if (bytes_read >= bin.size) break; fread(byte, sizeof(byte), 1, bin.binary); bytes_read++; - uint8_t inst_byte2 = (uint8_t)byte[0]; + inst_byte2 = (uint8_t)byte[0]; bytes_read += MOV_MA_T_AM_parse(inst, inst_byte2, 0, 0, (manip_inst == MOV_M_T_A)); continue; + case MOV_I_T_RM: + if (bytes_read >= bin.size) break; + fread(byte, sizeof(byte), 1, bin.binary); + bytes_read++; + inst_byte2 = (uint8_t)byte[0]; + bytes_read += MOV_I_T_RM_parse(inst, inst_byte2, 0, 0); + continue; } manip_inst = (manip_inst >> 1); if (manip_inst == MOV_RM_TF_R) @@ -325,7 +502,7 @@ int main(int argc, char** argv) if (bytes_read >= bin.size) break; fread(byte, sizeof(byte), 1, bin.binary); bytes_read++; - uint8_t inst_byte2 = (uint8_t)byte[0]; + inst_byte2 = (uint8_t)byte[0]; bytes_read += MOV_RM_TF_R_parse(inst, inst_byte2, 0, 0); continue; } @@ -335,7 +512,7 @@ int main(int argc, char** argv) if (bytes_read >= bin.size) break; fread(byte, sizeof(byte), 1, bin.binary); bytes_read++; - uint8_t inst_byte2 = (uint8_t)byte[0]; + inst_byte2 = (uint8_t)byte[0]; bytes_read += MOV_I_T_R_parse(inst, inst_byte2, 0, 0); continue; }