about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2017-10-12 22:36:38 -0700
committerKartik K. Agaram <vc@akkartik.com>2017-10-12 22:36:38 -0700
commit998a943933faea807ca11b9b5c77d44d53e66577 (patch)
tree599667547da9c864d02be12c88196f0dbc6777b2
parented3c266e2d782ffe2857402f6fb3cee339a0f447 (diff)
downloadmu-998a943933faea807ca11b9b5c77d44d53e66577.tar.gz
4045
-rw-r--r--subx/011add.cc27
1 files changed, 24 insertions, 3 deletions
diff --git a/subx/011add.cc b/subx/011add.cc
index 5fe3523b..5bcd62d8 100644
--- a/subx/011add.cc
+++ b/subx/011add.cc
@@ -56,19 +56,21 @@ int32_t* effective_address(uint8_t modrm) {
 % Reg[3].i = 1;
 # op  ModRM   SIB   displacement  immediate
   81  c3                          0a 0b 0c 0d  # add 0x0d0c0b0a to EBX (reg 3)
-+run: add imm32 0x0d0c0b0a to effective address
++run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is reg 3
++run: subop add
 +run: storing 0x0d0c0b0b
 
 :(before "End Single-Byte Opcodes")
 case 0x81: {  // combine imm32 with r/m32
   uint8_t modrm = next();
   int32_t arg2 = imm32();
-  trace(2, "run") << "add imm32 0x" << HEXWORD << arg2 << " to effective address" << end();
+  trace(2, "run") << "combine imm32 0x" << HEXWORD << arg2 << " with effective address" << end();
   int32_t* arg1 = effective_address(modrm);
   uint8_t subop = (modrm>>3)&0x7;  // middle 3 'reg opcode' bits
   switch (subop) {
   case 0:
+    trace(2, "run") << "subop add" << end();
     BINARY_ARITHMETIC_OP(+, *arg1, arg2);
     break;
   // End Op 81 Subops
@@ -93,8 +95,9 @@ case 3:
 % Mem.at(0x60) = 1;
 # op  ModR/M  SIB   displacement  immediate
   81  03                          0a 0b 0c 0d  # add 0x0d0c0b0a to *EBX (reg 3)
-+run: add imm32 0x0d0c0b0a to effective address
++run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is mem at address 0x60 (reg 3)
++run: subop add
 +run: storing 0x0d0c0b0b
 
 //:
@@ -135,3 +138,21 @@ case 0x2d: {  // subtract imm32 from EAX
   BINARY_ARITHMETIC_OP(-, Reg[EAX].i, arg2);
   break;
 }
+
+//:
+
+:(scenario sub_imm32_from_r32)
+% Reg[3].i = 10;
+# op  ModRM   SIB   displacement  immediate
+  81  eb                          01 00 00 00  # subtract 1 from EBX (reg 3)
++run: combine imm32 0x00000001 with effective address
++run: effective address is reg 3
++run: subop subtract
++run: storing 0x00000009
+
+:(before "End Op 81 Subops")
+case 5: {
+  trace(2, "run") << "subop subtract" << end();
+  BINARY_ARITHMETIC_OP(-, *arg1, arg2);
+  break;
+}