From 0cb988d0aed78773fe2c5eec3bc923794f629363 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Wed, 24 Jan 2018 12:59:14 -0800 Subject: 4185 --- subx/012indirect_addressing.cc | 65 ++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 22 deletions(-) (limited to 'subx/012indirect_addressing.cc') 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(&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 -- cgit 1.4.1-2-gfad0