about summary refs log tree commit diff stats
path: root/subx/011direct_addressing.cc
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2017-10-18 02:13:34 -0700
committerKartik K. Agaram <vc@akkartik.com>2017-10-18 02:13:34 -0700
commit099ed980c4e137fe37a5150668561175aab87c0d (patch)
treed156dea0c638158ef1a4ada8dcf0b3bcad2f39b5 /subx/011direct_addressing.cc
parent9ecbcc552ee4646bdec8181bb6a8757a7b0fd700 (diff)
downloadmu-099ed980c4e137fe37a5150668561175aab87c0d.tar.gz
4083
subx: 'pop'
Diffstat (limited to 'subx/011direct_addressing.cc')
-rw-r--r--subx/011direct_addressing.cc31
1 files changed, 30 insertions, 1 deletions
diff --git a/subx/011direct_addressing.cc b/subx/011direct_addressing.cc
index a8f3fe7e..b3f234b3 100644
--- a/subx/011direct_addressing.cc
+++ b/subx/011direct_addressing.cc
@@ -219,7 +219,7 @@ case 0x89: {  // copy r32 to r/m32
 
 :(scenario push_r32)
 % Reg[ESP].u = 0x64;
-% Reg[EBX].i = 10;
+% Reg[EBX].i = 0x0000000a;
 # op  ModRM   SIB   displacement  immediate
   53                                          # push EBX (reg 3) to stack
 +run: push reg 3
@@ -246,3 +246,32 @@ case 0x57: {  // push r32 to stack
   trace(2, "run") << "contents at ESP: 0x" << HEXWORD << *reinterpret_cast<uint32_t*>(&Mem.at(Reg[ESP].u)) << end();
   break;
 }
+
+//:: pop
+
+:(scenario pop_r32)
+% Reg[ESP].u = 0x60;
+% SET_WORD_IN_MEM(0x60, 0x0000000a);
+# op  ModRM   SIB   displacement  immediate
+  5b                                          # pop stack to EBX (reg 3)
++run: pop into reg 3
++run: popping value 0x0000000a
++run: ESP is now 0x00000064
+
+:(before "End Single-Byte Opcodes")
+case 0x58:
+case 0x59:
+case 0x5a:
+case 0x5b:
+case 0x5c:
+case 0x5d:
+case 0x5e:
+case 0x5f: {  // pop stack into r32
+  uint8_t reg = op & 0x7;
+  trace(2, "run") << "pop into reg " << NUM(reg) << end();
+  Reg[reg].u = *reinterpret_cast<uint32_t*>(&Mem.at(Reg[ESP].u));
+  trace(2, "run") << "popping value 0x" << HEXWORD << Reg[reg].u << end();
+  Reg[ESP].u += 4;
+  trace(2, "run") << "ESP is now 0x" << HEXWORD << Reg[ESP].u << end();
+  break;
+}