diff --git a/1-1/8086coded b/1-1/8086coded index 272f292..6bf35b6 100755 Binary files a/1-1/8086coded and b/1-1/8086coded differ diff --git a/1-1/decoder.c b/1-1/decoder.c index d639512..ed4c8e3 100644 --- a/1-1/decoder.c +++ b/1-1/decoder.c @@ -4,9 +4,9 @@ enum DT_INSTRUCTIONS { - MOV_RM_TF_R = 0b1000'10, //d w + MOV_RM_TF_R = 0b1000'10, //d w MOV_I_T_RM = 0b1100'011, // w - MOV_I_T_R = 0b1011, // w reg + 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, @@ -54,6 +54,7 @@ typedef struct uint64_t size; } binary_data; +FILE *output; void MOV_RM_TF_R_parse(uint8_t byte1, uint8_t byte2, uint8_t byte3, uint8_t byte4) { @@ -67,8 +68,9 @@ void MOV_RM_TF_R_parse(uint8_t byte1, uint8_t byte2, uint8_t byte3, uint8_t byte bool reg_is_dest = (byte1 & dest_mask); //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\n", REG_ENCODING_TXT[dest_value], REG_ENCODING_TXT[src_value]); + 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]); return; } @@ -83,6 +85,9 @@ int main(int argc, char** argv) 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++) { @@ -92,7 +97,6 @@ int main(int argc, char** argv) //For now we're just checking for RM_TF_R manip_inst = (manip_inst >> 2); if (manip_inst != MOV_RM_TF_R) break; - printf("%s ", "mov"); if (bytes_read >= bin.size) break; fread(byte, sizeof(byte), 1, bin.binary); bytes_read++;