Ассемблер способ адресации База+(индекс * множитель)+смещение.

Тема в разделе "WASM.BEGINNERS", создана пользователем not1, 18 окт 2009.

  1. not1

    not1 Member

    Публикаций:
    0
    Регистрация:
    6 окт 2009
    Сообщения:
    137
    Привет всем!
    ...Для адресации элементов в двух.массивах данных, когда нужно получить доступ к словам, двойным словам, или учетверенным.
    ...
    a1 DD 45, -87, 23, - 11, 83, -442, 56 , -340
    a2 DD 92, -31, 9 , -598 , 361 , 406, -172, 7
    a3 DD 234, 8 , -177, 921, 380, -12 , 0, -51
    iarray label dword
    DD a1
    DD a2
    DD a3
    ...
    mov EBX, iarray+8
    mov ESI, 4
    mov EAX, [EBX][ESI*2][8]
    --------------------------
    Здесь определенны 3 массива состоящие из чисел (а1..а3) предположим что требуеться помистить в регистр EAX число 380. Для этого воспользуемься схемой.
    поместим адресс масива, в котором находиться искомое число
    в регистр ESI который будет выступать в качестве индексново.
    =======
    вообщем вопрос почему mov EBX, iarray+8 а не +6 не +2 как он вообще узнал что это адресс?
    аж отпало желании дальше читать(((
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    В ebx находится адрес начала массива a3. esi == 4. Результирующий (эффективный) адрес: 'ebx + 4 * 2 + 8' == 'ebx + 16'. Т.к. смещение в инструкции указывается в байтах, а размер элемента массива равен четырем, то для получения элемента массива нужно смещение разделить на четыре. Получается четвертый элемент массива. Считая от нуля, получаем 380.

    А вообще, пример, судя по всему, сугубо учебный, т.к. намного проще сделать так:
    mov esi, 0x4
    mov eax, [ebx + esi * 4]

    P.S. Вопрос сформулирован так, что аж отпадает желаение отвечать.
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Тьфу, не дописал же. 'mov EBX, iarray+8' строится по тому же принципу, что описан выше. iarray -- массив двойных слов (dword). Размер dword'а четрые байта. Следовательно, чтобы адресоваться к третьему элементу массива, надо к iarray прибавить '(3 - 1) * 4' (т.к. адресация ведется от нуля). Получается восемь.
     
  4. not1

    not1 Member

    Публикаций:
    0
    Регистрация:
    6 окт 2009
    Сообщения:
    137
    оки спс, просто в книге которую я читаю автор предпологает что читатель наверно сам должен дадуматься что надо к iarray прибавить '(3 - 1) * 4 , 1 ые главе про адресацию нормально , а про эту адресацию думай сам...