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>2018-01-24 12:59:14 -0800
committerKartik K. Agaram <vc@akkartik.com>2018-01-24 12:59:14 -0800
commit0cb988d0aed78773fe2c5eec3bc923794f629363 (patch)
tree69c06fc0f003b670aa8ba5c482448ada171f5b79 /subx/012indirect_addressing.cc
parentf7ff8585b9f4ecd6871fb1e3980be9fe6a4486fd (diff)
downloadmu-0cb988d0aed78773fe2c5eec3bc923794f629363.tar.gz
4185
Diffstat (limited to 'subx/012indirect_addressing.cc')
-rw-r--r--subx/012indirect_addressing.cc65
1 files changed, 43 insertions, 22 deletions
diff --git a/subx/012indirect_addressing.cc b/subx/012indirect_addressing.cc
index f41bdfef..ca6843d4 100644
--- a/subx/012indirect_addressing.cc
+++ b/subx/012indirect_addressing.cc
@@ -6,15 +6,15 @@
 % SET_WORD_IN_MEM(0x60, 1);
 # op  ModR/M  SIB   displacement  immediate
   01  18                                     # add EBX to *EAX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: add EBX to effective address
 +run: effective address is mem at address 0x60 (EAX)
 +run: storing 0x00000011
 
 :(before "End Mod Special-cases")
 case 0:
-  // mod 0 is usually indirect addressing
   switch (rm) {
-  default:
+  default:  // mod 0 is usually indirect addressing
     trace(2, "run") << "effective address is mem at address 0x" << std::hex << Reg[rm].u << " (" << rname(rm) << ")" << end();
     assert(Reg[rm].u + sizeof(int32_t) <= Mem.size());
     result = reinterpret_cast<int32_t*>(&Mem.at(Reg[rm].u));  // rely on the host itself being in little-endian order
@@ -31,6 +31,7 @@ case 0:
 % SET_WORD_IN_MEM(0x60, 1);
 # op  ModR/M  SIB   displacement  immediate
   03  18                                      # add *EAX to EBX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: add effective address to EBX
 +run: effective address is mem at address 0x60 (EAX)
 +run: storing 0x00000011
@@ -51,8 +52,9 @@ case 0x03: {  // add r/m32 to r32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 10);
 % Reg[3].i = 1;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   29  18                                      # subtract EBX from *EAX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: subtract EBX from effective address
 +run: effective address is mem at address 0x60 (EAX)
 +run: storing 0x00000009
@@ -63,8 +65,9 @@ case 0x03: {  // add r/m32 to r32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 1);
 % Reg[3].i = 10;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   2b  18                                      # subtract *EAX from EBX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: subtract effective address from EBX
 +run: effective address is mem at address 0x60 (EAX)
 +run: storing 0x00000009
@@ -85,8 +88,9 @@ case 0x2b: {  // subtract r/m32 from r32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x0a0b0c0d);
 % Reg[3].i = 0xff;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   21  18                                      # and EBX with *EAX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: and EBX with effective address
 +run: effective address is mem at address 0x60 (EAX)
 +run: storing 0x0000000d
@@ -97,8 +101,9 @@ case 0x2b: {  // subtract r/m32 from r32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x000000ff);
 % Reg[3].i = 0x0a0b0c0d;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   23  18                                      # and *EAX with EBX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: and effective address with EBX
 +run: effective address is mem at address 0x60 (EAX)
 +run: storing 0x0000000d
@@ -119,8 +124,9 @@ case 0x23: {  // and r/m32 with r32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x0a0b0c0d);
 % Reg[3].i = 0xa0b0c0d0;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   09  18                                      # or EBX with *EAX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: or EBX with effective address
 +run: effective address is mem at address 0x60 (EAX)
 +run: storing 0xaabbccdd
@@ -131,8 +137,9 @@ case 0x23: {  // and r/m32 with r32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x0a0b0c0d);
 % Reg[3].i = 0xa0b0c0d0;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   0b  18                                      # or *EAX with EBX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: or effective address with EBX
 +run: effective address is mem at address 0x60 (EAX)
 +run: storing 0xaabbccdd
@@ -153,8 +160,9 @@ case 0x0b: {  // or r/m32 with r32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0xaabb0c0d);
 % Reg[3].i = 0xa0b0c0d0;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   31  18                                      # xor EBX with *EAX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: xor EBX with effective address
 +run: effective address is mem at address 0x60 (EAX)
 +run: storing 0x0a0bccdd
@@ -165,8 +173,9 @@ case 0x0b: {  // or r/m32 with r32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x0a0b0c0d);
 % Reg[3].i = 0xa0b0c0d0;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   33  18                                      # xor *EAX with EBX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: xor effective address with EBX
 +run: effective address is mem at address 0x60 (EAX)
 +run: storing 0xaabbccdd
@@ -187,8 +196,9 @@ case 0x33: {  // xor r/m32 with r32
 % Reg[3].i = 0x60;
 # word at 0x60 is 0x0f0f00ff
 % SET_WORD_IN_MEM(0x60, 0x0f0f00ff);
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   f7  03                                      # negate *EBX
+# ModR/M in binary: 00 (indirect mode) 000 (unused) 011 (dest EBX)
 +run: 'not' of effective address
 +run: effective address is mem at address 0x60 (EBX)
 +run: storing 0xf0f0ff00
@@ -199,8 +209,9 @@ case 0x33: {  // xor r/m32 with r32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x0a0b0c0d);
 % Reg[3].i = 0x0a0b0c07;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   39  18                                      # compare EBX with *EAX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: compare EBX with effective address
 +run: effective address is mem at address 0x60 (EAX)
 +run: SF=0; ZF=0; OF=0
@@ -209,8 +220,9 @@ case 0x33: {  // xor r/m32 with r32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x0a0b0c07);
 % Reg[3].i = 0x0a0b0c0d;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   39  18                                      # compare EBX with *EAX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: compare EBX with effective address
 +run: effective address is mem at address 0x60 (EAX)
 +run: SF=1; ZF=0; OF=0
@@ -219,8 +231,9 @@ case 0x33: {  // xor r/m32 with r32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x0a0b0c0d);
 % Reg[3].i = 0x0a0b0c0d;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   39  18                                      # compare EBX with *EAX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: compare EBX with effective address
 +run: effective address is mem at address 0x60 (EAX)
 +run: SF=0; ZF=1; OF=0
@@ -231,8 +244,9 @@ case 0x33: {  // xor r/m32 with r32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x0a0b0c07);
 % Reg[3].i = 0x0a0b0c0d;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   3b  18                                      # compare *EAX with EBX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: compare effective address with EBX
 +run: effective address is mem at address 0x60 (EAX)
 +run: SF=0; ZF=0; OF=0
@@ -257,8 +271,9 @@ case 0x3b: {  // set SF if r32 < r/m32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x0a0b0c0d);
 % Reg[3].i = 0x0a0b0c07;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   3b  18                                      # compare *EAX with EBX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: compare effective address with EBX
 +run: effective address is mem at address 0x60 (EAX)
 +run: SF=1; ZF=0; OF=0
@@ -267,8 +282,9 @@ case 0x3b: {  // set SF if r32 < r/m32
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x0a0b0c0d);
 % Reg[3].i = 0x0a0b0c0d;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   3b  18                                      # compare *EAX with EBX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: compare effective address with EBX
 +run: effective address is mem at address 0x60 (EAX)
 +run: SF=0; ZF=1; OF=0
@@ -278,8 +294,9 @@ case 0x3b: {  // set SF if r32 < r/m32
 :(scenario copy_r32_to_mem_at_r32)
 % Reg[3].i = 0xaf;
 % Reg[0].i = 0x60;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   89  18                                      # copy EBX to *EAX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: copy EBX to effective address
 +run: effective address is mem at address 0x60 (EAX)
 +run: storing 0x000000af
@@ -289,8 +306,9 @@ case 0x3b: {  // set SF if r32 < r/m32
 :(scenario copy_mem_at_r32_to_r32)
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x000000af);
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   8b  18                                      # copy *EAX to EBX
+# ModR/M in binary: 00 (indirect mode) 011 (src EAX) 000 (dest EAX)
 +run: copy effective address to EBX
 +run: effective address is mem at address 0x60 (EAX)
 +run: storing 0x000000af
@@ -311,8 +329,9 @@ case 0x8b: {  // copy r32 to r/m32
 :(scenario jump_mem_at_r32)
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 8);
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   ff  20                                      # jump to *EAX
+# ModR/M in binary: 00 (indirect mode) 100 (jump to r/m32) 000 (src EAX)
   05                              00 00 00 01
   05                              00 00 00 02
 +run: inst: 0x00000001
@@ -345,8 +364,9 @@ case 0xff: {
 % Reg[0].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x000000af);
 % Reg[ESP].u = 0x14;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   ff  30                                      # push *EAX to stack
+# ModR/M in binary: 00 (indirect mode) 110 (push r/m32) 000 (src EAX)
 +run: push effective address
 +run: effective address is mem at address 0x60 (EAX)
 +run: decrementing ESP to 0x00000010
@@ -366,8 +386,9 @@ case 6: {  // push r/m32 to stack
 % Reg[0].i = 0x60;
 % Reg[ESP].u = 0x10;
 % SET_WORD_IN_MEM(0x10, 0x00000030);
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   8f  00                                      # pop stack into *EAX
+# ModR/M in binary: 00 (indirect mode) 000 (pop r/m32) 000 (dest EAX)
 +run: pop into effective address
 +run: effective address is mem at address 0x60 (EAX)
 +run: popping value 0x00000030