about summary refs log tree commit diff stats
path: root/subx/013immediate_addressing.cc
diff options
context:
space:
mode:
Diffstat (limited to 'subx/013immediate_addressing.cc')
-rw-r--r--subx/013immediate_addressing.cc90
1 files changed, 55 insertions, 35 deletions
diff --git a/subx/013immediate_addressing.cc b/subx/013immediate_addressing.cc
index 3021617f..14099fee 100644
--- a/subx/013immediate_addressing.cc
+++ b/subx/013immediate_addressing.cc
@@ -2,8 +2,9 @@
 
 :(scenario add_imm32_to_r32)
 % Reg[3].i = 1;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  c3                          0a 0b 0c 0d  # add 0x0d0c0b0a to EBX
+# ModR/M in binary: 11 (direct mode) 000 (add imm32) 011 (dest EBX)
 +run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is EBX
 +run: subop add
@@ -36,6 +37,7 @@ case 0x81: {  // combine imm32 with r/m32
 % SET_WORD_IN_MEM(0x60, 1);
 # op  ModR/M  SIB   displacement  immediate
   81  03                          0a 0b 0c 0d  # add 0x0d0c0b0a to *EBX
+# ModR/M in binary: 00 (indirect mode) 000 (add imm32) 011 (dest EBX)
 +run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is mem at address 0x60 (EBX)
 +run: subop add
@@ -63,31 +65,33 @@ case 0x2d: {  // subtract imm32 from EAX
 :(scenario subtract_imm32_from_mem_at_r32)
 % Reg[3].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 10);
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  2b                          01 00 00 00  # subtract 1 from *EBX
+# ModR/M in binary: 00 (indirect mode) 101 (subtract imm32) 011 (dest EBX)
 +run: combine imm32 0x00000001 with effective address
 +run: effective address is mem at address 0x60 (EBX)
 +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;
+}
+
 //:
 
 :(scenario subtract_imm32_from_r32)
 % Reg[3].i = 10;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  eb                          01 00 00 00  # subtract 1 from EBX
+# ModR/M in binary: 11 (direct mode) 101 (subtract imm32) 011 (dest EBX)
 +run: combine imm32 0x00000001 with effective address
 +run: effective address is EBX
 +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;
-}
-
 //:: and
 
 :(scenario and_imm32_with_eax)
@@ -110,31 +114,33 @@ case 0x25: {  // and imm32 with EAX
 :(scenario and_imm32_with_mem_at_r32)
 % Reg[3].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x000000ff);
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  23                          0a 0b 0c 0d  # and 0x0d0c0b0a with *EBX
+# ModR/M in binary: 00 (indirect mode) 100 (and imm32) 011 (dest EBX)
 +run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is mem at address 0x60 (EBX)
 +run: subop and
 +run: storing 0x0000000a
 
+:(before "End Op 81 Subops")
+case 4: {
+  trace(2, "run") << "subop and" << end();
+  BINARY_BITWISE_OP(&, *arg1, arg2);
+  break;
+}
+
 //:
 
 :(scenario and_imm32_with_r32)
 % Reg[3].i = 0xff;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  e3                          0a 0b 0c 0d  # and 0x0d0c0b0a with EBX
+# ModR/M in binary: 11 (direct mode) 100 (and imm32) 011 (dest EBX)
 +run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is EBX
 +run: subop and
 +run: storing 0x0000000a
 
-:(before "End Op 81 Subops")
-case 4: {
-  trace(2, "run") << "subop and" << end();
-  BINARY_BITWISE_OP(&, *arg1, arg2);
-  break;
-}
-
 //:: or
 
 :(scenario or_imm32_with_eax)
@@ -157,8 +163,9 @@ case 0x0d: {  // or imm32 with EAX
 :(scenario or_imm32_with_mem_at_r32)
 % Reg[3].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0xd0c0b0a0);
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  0b                          0a 0b 0c 0d  # or 0x0d0c0b0a with *EBX
+# ModR/M in binary: 00 (indirect mode) 001 (or imm32) 011 (dest EBX)
 +run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is mem at address 0x60 (EBX)
 +run: subop or
@@ -173,8 +180,9 @@ case 1: {
 
 :(scenario or_imm32_with_r32)
 % Reg[3].i = 0xd0c0b0a0;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  cb                          0a 0b 0c 0d  # or 0x0d0c0b0a with EBX
+# ModR/M in binary: 11 (direct mode) 001 (or imm32) 011 (dest EBX)
 +run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is EBX
 +run: subop or
@@ -202,8 +210,9 @@ case 0x35: {  // xor imm32 with EAX
 :(scenario xor_imm32_with_mem_at_r32)
 % Reg[3].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0xd0c0b0a0);
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  33                          0a 0b 0c 0d  # xor 0x0d0c0b0a with *EBX
+# ModR/M in binary: 00 (indirect mode) 110 (xor imm32) 011 (dest EBX)
 +run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is mem at address 0x60 (EBX)
 +run: subop xor
@@ -218,8 +227,9 @@ case 6: {
 
 :(scenario xor_imm32_with_r32)
 % Reg[3].i = 0xd0c0b0a0;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  f3                          0a 0b 0c 0d  # xor 0x0d0c0b0a with EBX
+# ModR/M in binary: 11 (direct mode) 110 (xor imm32) 011 (dest EBX)
 +run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is EBX
 +run: subop xor
@@ -229,7 +239,7 @@ case 6: {
 
 :(scenario compare_imm32_with_eax_greater)
 % Reg[0].i = 0x0d0c0b0a;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   3d                              07 0b 0c 0d  # compare 0x0d0c0b07 with EAX
 +run: compare EAX and imm32 0x0d0c0b07
 +run: SF=0; ZF=0; OF=0
@@ -250,14 +260,14 @@ case 0x3d: {  // subtract imm32 from EAX
 
 :(scenario compare_imm32_with_eax_lesser)
 % Reg[0].i = 0x0d0c0b07;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   3d                              0a 0b 0c 0d  # compare 0x0d0c0b0a with EAX
 +run: compare EAX and imm32 0x0d0c0b0a
 +run: SF=1; ZF=0; OF=0
 
 :(scenario compare_imm32_with_eax_equal)
 % Reg[0].i = 0x0d0c0b0a;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   3d                              0a 0b 0c 0d  # compare 0x0d0c0b0a with EAX
 +run: compare EAX and imm32 0x0d0c0b0a
 +run: SF=0; ZF=1; OF=0
@@ -266,8 +276,9 @@ case 0x3d: {  // subtract imm32 from EAX
 
 :(scenario compare_imm32_with_r32_greater)
 % Reg[3].i = 0x0d0c0b0a;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  fb                          07 0b 0c 0d  # compare 0x0d0c0b07 with EBX
+# ModR/M in binary: 11 (direct mode) 111 (compare imm32) 011 (dest EBX)
 +run: combine imm32 0x0d0c0b07 with effective address
 +run: effective address is EBX
 +run: SF=0; ZF=0; OF=0
@@ -286,16 +297,20 @@ case 7: {
 
 :(scenario compare_imm32_with_r32_lesser)
 % Reg[3].i = 0x0d0c0b07;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  fb                          0a 0b 0c 0d  # compare 0x0d0c0b0a with EBX
+# ModR/M in binary: 11 (direct mode) 111 (compare imm32) 011 (dest EBX)
++run: combine imm32 0x0d0c0b07 with effective address
 +run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is EBX
 +run: SF=1; ZF=0; OF=0
 
 :(scenario compare_imm32_with_r32_equal)
 % Reg[3].i = 0x0d0c0b0a;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  fb                          0a 0b 0c 0d  # compare 0x0d0c0b0a with EBX
+# ModR/M in binary: 11 (direct mode) 111 (compare imm32) 011 (dest EBX)
++run: combine imm32 0x0d0c0b07 with effective address
 +run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is EBX
 +run: SF=0; ZF=1; OF=0
@@ -303,8 +318,10 @@ case 7: {
 :(scenario compare_imm32_with_mem_at_r32_greater)
 % Reg[3].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x0d0c0b0a);
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  3b                          07 0b 0c 0d  # compare 0x0d0c0b07 with *EBX
+# ModR/M in binary: 00 (indirect mode) 111 (compare imm32) 011 (dest EBX)
++run: combine imm32 0x0d0c0b07 with effective address
 +run: combine imm32 0x0d0c0b07 with effective address
 +run: effective address is mem at address 0x60 (EBX)
 +run: SF=0; ZF=0; OF=0
@@ -312,8 +329,9 @@ case 7: {
 :(scenario compare_imm32_with_mem_at_r32_lesser)
 % Reg[3].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x0d0c0b07);
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  3b                          0a 0b 0c 0d  # compare 0x0d0c0b0a with *EBX
+# ModR/M in binary: 00 (indirect mode) 111 (compare imm32) 011 (dest EBX)
 +run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is mem at address 0x60 (EBX)
 +run: SF=1; ZF=0; OF=0
@@ -322,8 +340,9 @@ case 7: {
 % Reg[3].i = 0x0d0c0b0a;
 % Reg[3].i = 0x60;
 % SET_WORD_IN_MEM(0x60, 0x0d0c0b0a);
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   81  3b                          0a 0b 0c 0d  # compare 0x0d0c0b0a with *EBX
+# ModR/M in binary: 00 (indirect mode) 111 (compare imm32) 011 (dest EBX)
 +run: combine imm32 0x0d0c0b0a with effective address
 +run: effective address is mem at address 0x60 (EBX)
 +run: SF=0; ZF=1; OF=0
@@ -331,7 +350,7 @@ case 7: {
 //:: copy (mov)
 
 :(scenario copy_imm32_to_r32)
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   bb                              0a 0b 0c 0d  # copy 0x0d0c0b0a to EBX
 +run: copy imm32 0x0d0c0b0a to EBX
 
@@ -355,8 +374,9 @@ case 0xbf: {  // copy imm32 to r32
 
 :(scenario copy_imm32_to_mem_at_r32)
 % Reg[3].i = 0x60;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   c7  03                          0a 0b 0c 0d  # copy 0x0d0c0b0a to *EBX
+# ModR/M in binary: 00 (indirect mode) 000 (unused) 011 (dest EBX)
 +run: copy imm32 0x0d0c0b0a to effective address
 +run: effective address is mem at address 0x60 (EBX)
 
@@ -374,7 +394,7 @@ case 0xc7: {  // copy imm32 to r32
 
 :(scenario push_imm32)
 % Reg[ESP].u = 0x14;
-# op  ModRM   SIB   displacement  immediate
+# op  ModR/M  SIB   displacement  immediate
   68                              af 00 00 00  # push *EAX to stack
 +run: push imm32 0x000000af
 +run: ESP is now 0x00000010