From c320371432b9d87142971aa1586ec827675a0a33 Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sat, 8 Apr 2023 19:26:31 +0100 Subject: [PATCH] Completed add, sub, cmp and jump simulations --- 8086_sim/.gitignore | 8 ++ 8086_sim/flag_access.cpp | 57 ++++++++++ 8086_sim/include/flag_access.h | 17 +++ 8086_sim/listing_0046_add_sub_cmp.asm | 28 +++++ 8086_sim/listing_0047_challenge_flags.asm | 36 +++++++ 8086_sim/listing_0048_ip_register.asm | 23 ++++ 8086_sim/listing_0049_conditional_jumps.asm | 24 +++++ 8086_sim/listing_0050_challenge_jumps.asm | 38 +++++++ 8086_sim/sim86 | Bin 0 -> 31160 bytes 8086_sim/sim86.cpp | 112 ++++++++++++++++++-- 10 files changed, 333 insertions(+), 10 deletions(-) create mode 100644 8086_sim/.gitignore create mode 100644 8086_sim/flag_access.cpp create mode 100644 8086_sim/include/flag_access.h create mode 100644 8086_sim/listing_0046_add_sub_cmp.asm create mode 100644 8086_sim/listing_0047_challenge_flags.asm create mode 100644 8086_sim/listing_0048_ip_register.asm create mode 100644 8086_sim/listing_0049_conditional_jumps.asm create mode 100644 8086_sim/listing_0050_challenge_jumps.asm create mode 100755 8086_sim/sim86 diff --git a/8086_sim/.gitignore b/8086_sim/.gitignore new file mode 100644 index 0000000..b28fd9b --- /dev/null +++ b/8086_sim/.gitignore @@ -0,0 +1,8 @@ +listing_0043_immediate_movs +listing_0044_register_movs +listing_0045_challenge_register_movs +listing_0046_add_sub_cmp +listing_0047_challenge_flags +listing_0048_ip_register +listing_0049_conditional_jumps +listing_0050_challenge_jumps diff --git a/8086_sim/flag_access.cpp b/8086_sim/flag_access.cpp new file mode 100644 index 0000000..ed49cab --- /dev/null +++ b/8086_sim/flag_access.cpp @@ -0,0 +1,57 @@ +#include "include/flag_access.h" +#include "include/aliases.h" +#include + +const char *get_flag_string(flag_access flag); + +static bool flags[FLAG_COUNT] = {false}; + +bool get_flag(flag_access flag) { + if (flag < FLAG_COUNT) { + return flags[flag]; + } + + return false; +} + +void set_flags(u16 value) { + if (value == 0) { + flags[FLAG_ZERO] = true; + flags[FLAG_SIGN] = false; + } else if ((value & 0x8000) == 0x8000) { + flags[FLAG_ZERO] = false; + flags[FLAG_SIGN] = true; + } else { + flags[FLAG_ZERO] = false; + flags[FLAG_SIGN] = false; + } +} + +void print_flags() { + printf("\t"); + + for (u32 i = 0; i < FLAG_COUNT; ++i) { + if (flags[i]) { + printf("%s", get_flag_string((flag_access)i)); + } + } + + printf("\n"); +} + +const char *get_flag_string(flag_access flag) { + const char *output = ""; + + switch (flag) { + case FLAG_ZERO: + output = "Z"; + break; + case FLAG_SIGN: + output = "S"; + break; + default: + break; + } + + return output; +} diff --git a/8086_sim/include/flag_access.h b/8086_sim/include/flag_access.h new file mode 100644 index 0000000..facf825 --- /dev/null +++ b/8086_sim/include/flag_access.h @@ -0,0 +1,17 @@ +#ifndef FLAG_ACCESS_H +#define FLAG_ACCESS_H + +#include "aliases.h" + +enum flag_access : u8 { + FLAG_ZERO, + FLAG_SIGN, + + FLAG_COUNT +}; + +bool get_flag(flag_access flag); +void set_flags(u16 value); +void print_flags(); + +#endif // !FLAG_ACCESS_H diff --git a/8086_sim/listing_0046_add_sub_cmp.asm b/8086_sim/listing_0046_add_sub_cmp.asm new file mode 100644 index 0000000..09f8205 --- /dev/null +++ b/8086_sim/listing_0046_add_sub_cmp.asm @@ -0,0 +1,28 @@ +; ======================================================================== +; +; (C) Copyright 2023 by Molly Rocket, Inc., All Rights Reserved. +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event will the authors be held liable for any damages +; arising from the use of this software. +; +; Please see https://computerenhance.com for further information +; +; ======================================================================== + +; ======================================================================== +; LISTING 46 +; ======================================================================== + +bits 16 + +mov bx, -4093 +mov cx, 3841 +sub bx, cx + +mov sp, 998 +mov bp, 999 +cmp bp, sp + +add bp, 1027 +sub bp, 2026 diff --git a/8086_sim/listing_0047_challenge_flags.asm b/8086_sim/listing_0047_challenge_flags.asm new file mode 100644 index 0000000..f0279f7 --- /dev/null +++ b/8086_sim/listing_0047_challenge_flags.asm @@ -0,0 +1,36 @@ +; ======================================================================== +; +; (C) Copyright 2023 by Molly Rocket, Inc., All Rights Reserved. +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event will the authors be held liable for any damages +; arising from the use of this software. +; +; Please see https://computerenhance.com for further information +; +; ======================================================================== + +; ======================================================================== +; LISTING 47 +; ======================================================================== + +bits 16 + +add bx, 30000 +add bx, 10000 +sub bx, 5000 +sub bx, 5000 + +mov bx, 1 +mov cx, 100 +add bx, cx + +mov dx, 10 +sub cx, dx + +add bx, 40000 +add cx, -90 + +mov sp, 99 +mov bp, 98 +cmp bp, sp diff --git a/8086_sim/listing_0048_ip_register.asm b/8086_sim/listing_0048_ip_register.asm new file mode 100644 index 0000000..af716bd --- /dev/null +++ b/8086_sim/listing_0048_ip_register.asm @@ -0,0 +1,23 @@ +; ======================================================================== +; +; (C) Copyright 2023 by Molly Rocket, Inc., All Rights Reserved. +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event will the authors be held liable for any damages +; arising from the use of this software. +; +; Please see https://computerenhance.com for further information +; +; ======================================================================== + +; ======================================================================== +; LISTING 48 +; ======================================================================== + +bits 16 + +mov cx, 200 +mov bx, cx +add cx, 1000 +mov bx, 2000 +sub cx, bx diff --git a/8086_sim/listing_0049_conditional_jumps.asm b/8086_sim/listing_0049_conditional_jumps.asm new file mode 100644 index 0000000..65112c7 --- /dev/null +++ b/8086_sim/listing_0049_conditional_jumps.asm @@ -0,0 +1,24 @@ +; ======================================================================== +; +; (C) Copyright 2023 by Molly Rocket, Inc., All Rights Reserved. +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event will the authors be held liable for any damages +; arising from the use of this software. +; +; Please see https://computerenhance.com for further information +; +; ======================================================================== + +; ======================================================================== +; LISTING 49 +; ======================================================================== + +bits 16 + +mov cx, 3 +mov bx, 1000 +loop_start: +add bx, 10 +sub cx, 1 +jnz loop_start diff --git a/8086_sim/listing_0050_challenge_jumps.asm b/8086_sim/listing_0050_challenge_jumps.asm new file mode 100644 index 0000000..8d2f484 --- /dev/null +++ b/8086_sim/listing_0050_challenge_jumps.asm @@ -0,0 +1,38 @@ +; ======================================================================== +; +; (C) Copyright 2023 by Molly Rocket, Inc., All Rights Reserved. +; +; This software is provided 'as-is', without any express or implied +; warranty. In no event will the authors be held liable for any damages +; arising from the use of this software. +; +; Please see https://computerenhance.com for further information +; +; ======================================================================== + +; ======================================================================== +; LISTING 50 +; ======================================================================== + +bits 16 + +mov ax, 10 +mov bx, 10 +mov cx, 10 + +label_0: +cmp bx, cx +je label_1 + +add ax, 1 +jp label_2 + +label_1: +sub bx, 5 +jb label_3 + +label_2: +sub cx, 2 + +label_3: +loopnz label_0 diff --git a/8086_sim/sim86 b/8086_sim/sim86 new file mode 100755 index 0000000000000000000000000000000000000000..89fe10fdb0cacd7cda9355f7f1bc96d26ae10fa4 GIT binary patch literal 31160 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 L-5aA26J`GiuM~o& literal 0 HcmV?d00001 diff --git a/8086_sim/sim86.cpp b/8086_sim/sim86.cpp index b9e578d..f1b2525 100644 --- a/8086_sim/sim86.cpp +++ b/8086_sim/sim86.cpp @@ -1,11 +1,18 @@ #include "include/aliases.h" +#include "include/flag_access.h" #include "include/reg_access.h" #include "include/sim86_lib.h" #include #include #include -void decode_operand(instruction_operand operand); +struct basic_string { + char str[4096]; +}; + +u16 get_operand_value(instruction_operand operand); +basic_string get_operand_string(instruction_operand operand); +void print_instruction(instruction inst); void mov_to_register(const register_access ®, const instruction_operand &source); @@ -44,6 +51,8 @@ int main(int argc, char *argv[]) { bool accessed_registers[REGISTER_COUNT] = {false}; + printf("\nDisassembly:\n"); + while (offset < size) { instruction decoded; Sim86_Decode8086Instruction(size - offset, buffer + offset, &decoded); @@ -51,46 +60,129 @@ int main(int argc, char *argv[]) { if (decoded.Op) { offset += decoded.Size; - if (decoded.Op == Op_mov) { - instruction_operand dest = decoded.Operands[0]; - instruction_operand source = decoded.Operands[1]; + print_instruction(decoded); + + instruction_operand dest = decoded.Operands[0]; + instruction_operand source = decoded.Operands[1]; + + switch (decoded.Op) { + case Op_mov: { if (dest.Type == Operand_Register) { mov_to_register(dest.Register, source); accessed_registers[dest.Register.Index] = true; } + + break; + } + case Op_add: { + if (dest.Type == Operand_Register) { + u16 value = get_register(dest.Register); + + value += get_operand_value(source); + set_flags(value); + + set_register(dest.Register, value); + } + + break; + } + case Op_sub: + case Op_cmp: { + if (dest.Type == Operand_Register) { + u16 value = get_register(dest.Register); + + value -= get_operand_value(source); + set_flags(value); + + if (decoded.Op == Op_sub) { + set_register(dest.Register, value); + } + } + + break; + } + case Op_jne: { + if (!get_flag(FLAG_ZERO)) { + i16 inst_offset = get_operand_value(dest); + + offset += inst_offset; + } + } + default: + break; } } } + printf("\nFinal registers:\n"); + for (u32 i = 0; i < REGISTER_COUNT; ++i) { if (accessed_registers[i]) { register_access reg = {i, 0, 2}; u16 value = get_register(reg); - printf("%s: 0x%04x (%d)\n", get_register_name(reg), value, value); + printf("\t%s: 0x%04x (%d)\n", get_register_name(reg), value, value); } } + // Print the instruction pointer register + printf("\tip: 0x%04x (%d)\n", offset, offset); + + printf("\nFinal flags:\n"); + print_flags(); + return 0; } -void decode_operand(instruction_operand operand) { +u16 get_operand_value(instruction_operand operand) { switch (operand.Type) { case Operand_Register: - printf("Register operand: %d, %d, %d\n", operand.Register.Index, - operand.Register.Offset, operand.Register.Count); + return get_register(operand.Register); + break; case Operand_Memory: - // printf("Memory operand\n"); + return 0; + break; case Operand_Immediate: - // printf("Immediate operand\n"); + return operand.Immediate.Value; + + break; + default: + return 0; + break; + } +} + +basic_string get_operand_string(instruction_operand operand) { + basic_string output = {""}; + + switch (operand.Type) { + case Operand_Register: + sprintf(output.str, "%s", get_register_name(operand.Register)); + + break; + case Operand_Memory: + sprintf(output.str, "%s", "MEM OPERAND"); + + break; + case Operand_Immediate: + sprintf(output.str, "%d", operand.Immediate.Value); + break; default: break; } + + return output; +} + +void print_instruction(instruction inst) { + printf("\t%s %s, %s\n", Sim86_MnemonicFromOperationType(inst.Op), + get_operand_string(inst.Operands[0]).str, + get_operand_string(inst.Operands[1]).str); } void mov_to_register(const register_access ®,