diff options
Diffstat (limited to 'subx/013immediate_addressing.cc')
-rw-r--r-- | subx/013immediate_addressing.cc | 90 |
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 |