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