diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2017-10-18 02:13:34 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2017-10-18 02:13:34 -0700 |
commit | 099ed980c4e137fe37a5150668561175aab87c0d (patch) | |
tree | d156dea0c638158ef1a4ada8dcf0b3bcad2f39b5 /subx/012indirect_addressing.cc | |
parent | 9ecbcc552ee4646bdec8181bb6a8757a7b0fd700 (diff) | |
download | mu-099ed980c4e137fe37a5150668561175aab87c0d.tar.gz |
4083
subx: 'pop'
Diffstat (limited to 'subx/012indirect_addressing.cc')
-rw-r--r-- | subx/012indirect_addressing.cc | 30 |
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; +} |