Всем привет! Подскажите пожалуйста что означает данная конструкция: Код (ASM): movzx eax, ds:ИмяКотороеСгенерилДизАСМ[edx*2] В секции данных это выглядит так: Код (ASM): .rdata:10029678 ; __int16 ИМЯ[] .rdata:10029678 ИМЯ dw 0 ; DATA XREF: адрес_вызова+46r .rdata:1002967A db 89h ; Й Целый день ищу инфу, но ни одного похожего примера не встретил, везде где разговор за квадратные скобки, говорят что это обращение к адресу а не к значению. Но что-то я понять не могу, что за обращение ds:имя[регистр * 2]? т.е. я понимаю что по идее в регистре лежит адрес, но как это соотносится с именем в секции данных - понять не могу... Извиняюсь за сумбурное объяснение. Заранее Спасибо!
Это смещение от "Имя", только адресуемое через edx*2, не? То есть к смещению "Имя" будет добавлено содержимое Edx, умноженное на 2, и с этого адреса будет взято значение, которое окажется в Eax, по правилам Movzx. ( гугл "косвенная адресация", напр. http://www.cyberforum.ru/assembler/thread151374.html ) На "Имя" - массив двухбайтовых значений, а Edx выступает в роли счетчика номера элемента? ( http://www.club155.ru/x86cmd/MOVZX )
firewex, ИмяКотороеСгенерилДизАСМ ― это адрес начала массива. Через [edx*2] задается индекс в этом массиве, так как в edx может содержатся 4 байта, то понятно, что элементы массива 8 байтовые.
Но для чего тогда Movzx, кроме как не для чтения двухбайтового элемента массива и укладки его в Еах с дополнением нулями? Edx=1, Edx*2=2 Edx=100, Edx*2=200, 100 элементов по 2 байта каждый
не по существу, написали бы уж псевдокод movzx eax, ds:ИмяКотороеСгенерилДизАСМ[edx*2] тоже что mov ax, ds:ИмяКотороеСгенерилДизАСМ[edx*2] mov highword(EAX),0 ; and eax 0000FFFFh раньше подобную магию делали второй командой - xor или cbw
_edge, да, я действительно сморозил ерунду, должно быть так: ИмяКотороеСгенерилДизАСМ ― это адрес начала массива. Через [edx*2] задается индекс в этом массиве, так как в edx содержится 4 байта, то максимальное число элементов в массиве, к которым можно таким образом обратиться = 232, так как [edx*2] ― элементы массива 2 байтовые
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
> movzx IA v2, Instruction Set Reference MOVZX—Move with Zero-Extend ENCODE: 0F B6 /r MOVZX r16, r/m8