home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.asm.x86      Ahh, the lost art of x86 assembly      4,675 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 4,258 of 4,675   
   Kerr-Mudd,John to Dick Wesseling   
   Re: Memory adress in register, how to ac   
   30 Dec 20 09:41:43   
   
   From: notsaying@nospicedham.127.0.0.1   
      
   On Wed, 30 Dec 2020 02:20:29 GMT,   
   free@nospicedham.securityaudit.val.newsbank.net (Dick Wesseling) wrote:   
      
   > In article <78bd42c1-3bcb-4c91-b357-b3e5060cd327n@googlegroups.com>,   
   >      Nathan Dean  writes:   
   >> I'm pretty new to assembly and I'm writing my homework. I can't find a   
   >> solution to my problem, so I thought I'd ask here:   
   >   
   > This is a good place to ask. However, since this is homework, I won't   
   > give the full solution, just a few hints.   
   >   
   >> I have a memory adress in one of my registers (ecx in this case), and   
   >> that memory adress points to an array. I would like to acces that   
   array   
   >> by using something like this:   
   >>   
   >> MOV [ecx + 4*8], eax   
   >   
   >> but in this case, the program takes the memory adress of the ecx, and   
   >> adds to that. How could I solve this?   
   >   
   > You probably dont't want to "access the arrray". My guess is that you   
   > want to access *an element of* the array. And that is exactly what your   
   > code does.   
   > The only problem with your code code is that it always access the same   
   > element of the array, see below.   
   >   
   > Your code suggests that the stride of the array is either 4 or 8   
   (stride   
   > is the difference between two consecutive array element addresses).   
   > Assuming a stride of 4, one can store into the elements of the array as   
   > follows:   
   >   
   >         lea ecx,array...   
   >         mov eax,somevalue   
   >   
   >         mov [ecx + 4*0], eax            ; array[0]   
   >         mov [ecx + 4*1], eax            ; array[1]   
   >         mov [ecx + 4*2], eax            ; array[2]   
   >         ....   
   >         mov [ecx + 4*8], eax            ; array[8] (your code)   
   >   
   > The problem with the code above is that it uses hard-wired constants as   
   > array indices. A more general solution would use registers for both   
   > the array (here ecx) and the index. This is where the following   
   > base plus scaled index addressing modes come in handy:   
   >   
   >      [ reg32 + eax*n ]   
   >      [ reg32 + ebx*n ]   
   >      [ reg32 + ecx*n ]   
   >      [ reg32 + edx*n ]   
   >      [ reg32 + ebp*n ]   
   >      [ reg32 + esi*n ]   
   >      [ reg32 + edi*n ]   
   >   
   > Here reg32 contains the array address (ecx in your code) and the other   
   > register contains the array index.   
   > n is the stride, it can be one of 1, 2, 4 or 8.   
   >   
   >   
      
   As a retro guy, I'd use SI for the arraybase & BX for the offset   
      
   --   
   Bah, and indeed, Humbug.   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca