scaled_indexed_addressing_modes.jpg


from : google books ( http://books.google.com > "Scaled-Indexed Addressing Modes" )


#define ITEM_COUNT 100

 

void main()

{

  char    var8 [ITEM_COUNT];

  short   var16[ITEM_COUNT];

  int     var32[ITEM_COUNT];

  __int64 var64[ITEM_COUNT];

 

  for (int i = 0; i < ITEM_COUNT; i++)

    var8 [i] = 0; // mov byte ptr  [ebp+eax-6Ch],0

 

  for (int i = 0; i < ITEM_COUNT; i++)

    var16[i] = 0; // mov word ptr  [ebp+eax*2-13Ch],0

 

  for (int i = 0; i < ITEM_COUNT; i++)

    var32[i] = 0; // mov dword ptr [ebp+eax*4-2D4h],0

 

  for (int i = 0; i < ITEM_COUNT; i++)

    var64[i] = 0; // mov dword ptr [ebp+eax*8-5FCh],0

                  // mov dword ptr [ebp+eax*8-5F8h],0

}

 

void scale_test()

{

  _asm {

    // mov dword ptr [ebp+eax*1-1234h],0  // ok

    // mov dword ptr [ebp+eax*2-1234h],0  // ok

    // mov dword ptr [ebp+eax*3-1234h],0  // error C2423: '3' : illegal scale

    // mov dword ptr [ebp+eax*4-1234h],0  // ok

    // mov dword ptr [ebp+eax*8-1234h],0  // ok

    // mov dword ptr [ebp+eax*16-1234h],0 // error C2423: '16' : illegal scale

  }

}




[Conclusion]


1. Index variable(i) is increased one by one(not by multiple of 2).


2. It uses Scaled-Indexed Addressing Modes to initialize array.


3. Scaled factor is one of 1, 2, 4, and 8 in 80386 CPU.


4. Compiled in Microsoft Visual Studio 2005(Debug Mode).



[Download]


scaled_indexed_addressing_modes_test.zip