about summary refs log tree commit diff stats
path: root/subx/012indirect_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/012indirect_addressing.cc
parent9ecbcc552ee4646bdec8181bb6a8757a7b0fd700 (diff)
downloadmu-099ed980c4e137fe37a5150668561175aab87c0d.tar.gz
4083
subx: 'pop'
Diffstat (limited to 'subx/012indirect_addressing.cc')
-rw-r--r--subx/012indirect_addressing.cc30
1 files changed, 30 insertions, 0 deletions
diff --git a/subx/012indirect_addressing.cc b/subx/012indirect_addressing.cc
index b4821856..37d82a3f 100644
--- a/subx/012indirect_addressing.cc
+++ b/subx/012indirect_addressing.cc
@@ -364,3 +364,33 @@ case 6: {
   break;
 }
 
+//:: pop
+
+:(scenario pop_mem_at_r32)
+% Reg[0].i = 0x60;
+% Reg[ESP].u = 0x10;
+% SET_WORD_IN_MEM(0x10, 0x00000030);
+# op  ModRM   SIB   displacement  immediate
+  8f  00                                      # pop stack into *EAX (reg 0)
++run: pop into effective address
++run: effective address is mem at address 0x60 (reg 0)
++run: storing 0x00000030
++run: ESP is now 0x00000014
+
+:(before "End Single-Byte Opcodes")
+case 0x8f: {  // pop stack into r/m32
+  uint8_t modrm = next();
+  uint8_t subop = (modrm>>3)&0x7;
+  switch (subop) {
+    case 0: {
+      trace(2, "run") << "pop into effective address" << end();
+      int32_t* dest = effective_address(modrm);
+      *dest = *reinterpret_cast<uint32_t*>(&Mem.at(Reg[ESP].u));
+      trace(2, "run") << "storing 0x" << HEXWORD << *dest << end();
+      Reg[ESP].u += 4;
+      trace(2, "run") << "ESP is now 0x" << HEXWORD << Reg[ESP].u << end();
+      break;
+    }
+  }
+  break;
+}