diff options
author | Kartik Agaram <vc@akkartik.com> | 2018-10-01 11:09:07 -0700 |
---|---|---|
committer | Kartik Agaram <vc@akkartik.com> | 2018-10-01 11:09:07 -0700 |
commit | ca00f6b97c52262b39c28cccb76b52e059553f13 (patch) | |
tree | 3c6e1ea3e36c849a344eac03a468b3e853241bb3 /subx/016index_addressing.cc | |
parent | 75e30d2faa3480ae8810856d6527089ba88346a5 (diff) | |
download | mu-ca00f6b97c52262b39c28cccb76b52e059553f13.tar.gz |
4634
Diffstat (limited to 'subx/016index_addressing.cc')
-rw-r--r-- | subx/016index_addressing.cc | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/subx/016index_addressing.cc b/subx/016index_addressing.cc index 58169083..f98d4c0d 100644 --- a/subx/016index_addressing.cc +++ b/subx/016index_addressing.cc @@ -2,17 +2,17 @@ :(scenario add_r32_to_mem_at_r32_with_sib) % Reg[EBX].i = 0x10; -% Reg[EAX].i = 0x60; +% Reg[EAX].i = 0x2000; == 0x1 # code segment # op ModR/M SIB displacement immediate 01 1c 20 # add EBX to *EAX # ModR/M in binary: 00 (indirect mode) 011 (src EBX) 100 (dest in SIB) # SIB in binary: 00 (scale 1) 100 (no index) 000 (base EAX) -== 0x60 # data segment +== 0x2000 # data segment 01 00 00 00 # 1 +run: add EBX to r/m32 -+run: effective address is initially 0x60 (EAX) -+run: effective address is 0x60 ++run: effective address is initially 0x2000 (EAX) ++run: effective address is 0x2000 +run: storing 0x00000011 :(before "End Mod 0 Special-cases(addr)") @@ -48,51 +48,51 @@ uint32_t effective_address_from_sib(uint8_t mod) { :(scenario add_r32_to_mem_at_base_r32_index_r32) % Reg[EBX].i = 0x10; // source -% Reg[EAX].i = 0x5e; // dest base +% Reg[EAX].i = 0x1ffe; // dest base % Reg[ECX].i = 0x2; // dest index == 0x1 # code segment # op ModR/M SIB displacement immediate 01 1c 08 # add EBX to *(EAX+ECX) # ModR/M in binary: 00 (indirect mode) 011 (src EBX) 100 (dest in SIB) # SIB in binary: 00 (scale 1) 001 (index ECX) 000 (base EAX) -== 0x60 # data segment +== 0x2000 # data segment 01 00 00 00 # 1 +run: add EBX to r/m32 -+run: effective address is initially 0x5e (EAX) -+run: effective address is 0x60 (after adding ECX*1) ++run: effective address is initially 0x1ffe (EAX) ++run: effective address is 0x2000 (after adding ECX*1) +run: storing 0x00000011 :(scenario add_r32_to_mem_at_displacement_using_sib) % Reg[EBX].i = 0x10; // source == 0x1 # code segment # op ModR/M SIB displacement immediate - 01 1c 25 60 00 00 00 # add EBX to *0x60 + 01 1c 25 00 20 00 00 # add EBX to *0x2000 # ModR/M in binary: 00 (indirect mode) 011 (src EBX) 100 (dest in SIB) # SIB in binary: 00 (scale 1) 100 (no index) 101 (not EBP but disp32) -== 0x60 # data segment +== 0x2000 # data segment 01 00 00 00 # 1 +run: add EBX to r/m32 -+run: effective address is initially 0x60 (disp32) -+run: effective address is 0x60 ++run: effective address is initially 0x2000 (disp32) ++run: effective address is 0x2000 +run: storing 0x00000011 //: :(scenario add_r32_to_mem_at_base_r32_index_r32_plus_disp8) % Reg[EBX].i = 0x10; // source -% Reg[EAX].i = 0x59; // dest base +% Reg[EAX].i = 0x1ff9; // dest base % Reg[ECX].i = 0x5; // dest index == 0x1 # code segment # op ModR/M SIB displacement immediate 01 5c 08 02 # add EBX to *(EAX+ECX+2) # ModR/M in binary: 01 (indirect+disp8 mode) 011 (src EBX) 100 (dest in SIB) # SIB in binary: 00 (scale 1) 001 (index ECX) 000 (base EAX) -== 0x60 # data segment +== 0x2000 # data segment 01 00 00 00 # 1 +run: add EBX to r/m32 -+run: effective address is initially 0x59 (EAX) -+run: effective address is 0x5e (after adding ECX*1) -+run: effective address is 0x60 (after adding disp8) ++run: effective address is initially 0x1ff9 (EAX) ++run: effective address is 0x1ffe (after adding ECX*1) ++run: effective address is 0x2000 (after adding disp8) +run: storing 0x00000011 :(before "End Mod 1 Special-cases(addr)") @@ -104,19 +104,19 @@ case 4: // exception: mod 0b01 rm 0b100 => incoming SIB (scale-index-base) byte :(scenario add_r32_to_mem_at_base_r32_index_r32_plus_disp32) % Reg[EBX].i = 0x10; // source -% Reg[EAX].i = 0x59; // dest base +% Reg[EAX].i = 0x1ff9; // dest base % Reg[ECX].i = 0x5; // dest index == 0x1 # code segment # op ModR/M SIB displacement immediate 01 9c 08 02 00 00 00 # add EBX to *(EAX+ECX+2) # ModR/M in binary: 10 (indirect+disp32 mode) 011 (src EBX) 100 (dest in SIB) # SIB in binary: 00 (scale 1) 001 (index ECX) 000 (base EAX) -== 0x60 # data segment +== 0x2000 # data segment 01 00 00 00 # 1 +run: add EBX to r/m32 -+run: effective address is initially 0x59 (EAX) -+run: effective address is 0x5e (after adding ECX*1) -+run: effective address is 0x60 (after adding disp32) ++run: effective address is initially 0x1ff9 (EAX) ++run: effective address is 0x1ffe (after adding ECX*1) ++run: effective address is 0x2000 (after adding disp32) +run: storing 0x00000011 :(before "End Mod 2 Special-cases(addr)") |