Квадратные скобки и секция данных

Тема в разделе "WASM.BEGINNERS", создана пользователем firewex, 20 июл 2018.

  1. firewex

    firewex New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2018
    Сообщения:
    1
    Всем привет! Подскажите пожалуйста что означает данная конструкция:
    Код (ASM):
    1. movzx   eax, ds:ИмяКотороеСгенерилДизАСМ[edx*2]
    В секции данных это выглядит так:
    Код (ASM):
    1. .rdata:10029678 ; __int16 ИМЯ[]
    2. .rdata:10029678 ИМЯ          dw 0                    ; DATA XREF: адрес_вызова+46r
    3. .rdata:1002967A              db  89h ; Й
    Целый день ищу инфу, но ни одного похожего примера не встретил, везде где разговор за квадратные скобки, говорят что это обращение к адресу а не к значению. Но что-то я понять не могу, что за обращение ds:имя[регистр * 2]? т.е. я понимаю что по идее в регистре лежит адрес, но как это соотносится с именем в секции данных - понять не могу...
    Извиняюсь за сумбурное объяснение.
    Заранее Спасибо!
     
  2. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Это смещение от "Имя", только адресуемое через edx*2, не? То есть к смещению "Имя" будет добавлено содержимое Edx, умноженное на 2, и с этого адреса будет взято значение, которое окажется в Eax, по правилам Movzx.

    ( гугл "косвенная адресация", напр. http://www.cyberforum.ru/assembler/thread151374.html )

    На "Имя" - массив двухбайтовых значений, а Edx выступает в роли счетчика номера элемента? ( http://www.club155.ru/x86cmd/MOVZX )
     
    Последнее редактирование: 20 июл 2018
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    firewex,
    ИмяКотороеСгенерилДизАСМ ― это адрес начала массива. Через [edx*2] задается индекс в этом массиве, так как в edx может содержатся 4 байта, то понятно, что элементы массива 8 байтовые.
     
  4. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    Но для чего тогда Movzx, кроме как не для чтения двухбайтового элемента массива и укладки его в Еах с дополнением нулями?

    Edx=1, Edx*2=2
    Edx=100, Edx*2=200, 100 элементов по 2 байта каждый
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.615
    Адрес:
    Russia
    не по существу, написали бы уж псевдокод
    movzx eax, ds:ИмяКотороеСгенерилДизАСМ[edx*2]
    тоже что
    mov ax, ds:ИмяКотороеСгенерилДизАСМ[edx*2]
    mov highword(EAX),0 ; and eax 0000FFFFh

    раньше подобную магию делали второй командой - xor или cbw
     
    _edge нравится это.
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    _edge,
    да, я действительно сморозил ерунду, должно быть так:
    ИмяКотороеСгенерилДизАСМ ― это адрес начала массива. Через [edx*2] задается индекс в этом массиве, так как в edx содержится 4 байта, то максимальное число элементов в массиве, к которым можно таким образом обратиться = 232, так как [edx*2] ― элементы массива 2 байтовые
     
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Mikl___,

    Это SIB адресация: effective_addr = index_reg(3bit) * 2^scale(2bit) + base_reg(3bit).

    firewex,

    > что за обращение ds:имя[регистр * 2]?

    -> IA v3A, Logical Address to Linear Address Translation
    -> IA v1, Specifying an Offset

     
    Последнее редактирование: 21 июл 2018
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    > movzx

    IA v2, Instruction Set Reference

    MOVZX—Move with Zero-Extend

    ENCODE: 0F B6 /r MOVZX r16, r/m8