From 53463a5c6db17a62adb548b74d7aa04ae87e6535 Mon Sep 17 00:00:00 2001 From: Hane Date: Fri, 23 Jan 2026 20:25:14 +0100 Subject: [PATCH] First assigment done (w/o writing to file) --- 1-1/8086coded | Bin 0 -> 20296 bytes 1-1/compile.sh | 3 ++ 1-1/decoder.c | 104 ++++++++++++++++++++++++++++++++++++++++++++ 1-1/listing-37 | 1 + 1-1/listing-37.asm | 3 ++ 1-1/listing-38 | 1 + 1-1/listing-38.asm | 13 ++++++ 1-1/nasm-compile.sh | 4 ++ 8 files changed, 129 insertions(+) create mode 100755 1-1/8086coded create mode 100755 1-1/compile.sh create mode 100644 1-1/decoder.c create mode 100755 1-1/listing-37 create mode 100644 1-1/listing-37.asm create mode 100644 1-1/listing-38 create mode 100644 1-1/listing-38.asm create mode 100644 1-1/nasm-compile.sh diff --git a/1-1/8086coded b/1-1/8086coded new file mode 100755 index 0000000000000000000000000000000000000000..272f2926810431b99539e97e35b4d82b27c84355 GIT binary patch literal 20296 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 y@faEK3jFB)RLv)KT`L96) +#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 + }; + + +char REG_ENCODING_TXT[0b10000][3] = { "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh", + "ax", "cx", "dx", "bx", "sp", "bp", "si", "di"}; +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; + + +void MOV_RM_TF_R_parse(uint8_t byte1, uint8_t byte2, uint8_t byte3, uint8_t byte4) +{ + 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; + + if ((byte2 & mod_mask) != mod_mask) return; + //Since we're only doing register mode/register to register, both reg and r/m are affected by the W bit + 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]); + return; +} + +int main(int argc, char** argv) +{ + if (argc != 2) return -1; + if (CHAR_BIT != 8) return -2; + + binary_data bin; + 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); + + 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; + printf("%s ", "mov"); + if (bytes_read >= bin.size) break; + fread(byte, sizeof(byte), 1, bin.binary); + bytes_read++; + uint8_t inst_byte2 = (uint8_t)byte[0]; + MOV_RM_TF_R_parse(inst, inst_byte2, 0, 0); + } + + return 0; +} diff --git a/1-1/listing-37 b/1-1/listing-37 new file mode 100755 index 0000000..93b300d --- /dev/null +++ b/1-1/listing-37 @@ -0,0 +1 @@ +‰Ù \ No newline at end of file diff --git a/1-1/listing-37.asm b/1-1/listing-37.asm new file mode 100644 index 0000000..ec70483 --- /dev/null +++ b/1-1/listing-37.asm @@ -0,0 +1,3 @@ +bits 16 + +mov cx, bx diff --git a/1-1/listing-38 b/1-1/listing-38 new file mode 100644 index 0000000..5605230 --- /dev/null +++ b/1-1/listing-38 @@ -0,0 +1 @@ +‰Ùˆå‰Ú‰Þ‰ûˆÈˆí‰Ã‰ó‰ü‰Å \ No newline at end of file diff --git a/1-1/listing-38.asm b/1-1/listing-38.asm new file mode 100644 index 0000000..2e7bfbd --- /dev/null +++ b/1-1/listing-38.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-1/nasm-compile.sh b/1-1/nasm-compile.sh new file mode 100644 index 0000000..4dcedb9 --- /dev/null +++ b/1-1/nasm-compile.sh @@ -0,0 +1,4 @@ +#! /usr/env/bin bash + +nasm -f bin 1-1/listing-38.asm -o 1-1/listing-37 +nasm -f bin 1-1/listing-38.asm -o 1-1/listing-38