Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2010, 21:04   #1
Lamo
Пользователь
 
Регистрация: 15.12.2009
Сообщений: 49
Радость Команда леа

Всем доброго времени суток. Имеется код программы под Fasm, в котором я не понимаю как работает: lea eax,[_otvets-IDYES*5+eax+eax*4]. Изучать начал недавно, поэтому пинать не надо.

Вот код:

Код:
format PE GUI 4.0
entry start ;Точка входа в программу
INCLUDE 'win32ax.inc'
INCLUDE 'encoding\win1251.inc'
INCLUDE 'api\user32.inc'
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
section '.data' data readable writable
_da     db 'Да?',0
_otvets db 'Нет!',0
        db 'Да!',0
_name   db 'Обманщик v.2.0',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
section '.code' code readable executable
start:
        invoke  MessageBox,0,_da,_name,MB_YESNOCANCEL
        cmp     eax,IDCANCEL
        jz      CANCEL_PRESSED
        lea     eax,[_otvets-IDYES*5+eax+eax*4] ; а ну-ка, шевельните извилиной
        invoke  MessageBox,0,eax,_name,MB_OK
        jmp     start
CANCEL_PRESSED:
        invoke  ExitProcess,0
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
include 'API\KERNEL32.INC'
Заранее всем спасибо.
Lamo вне форума Ответить с цитированием
Старый 09.03.2010, 21:17   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

совмещение двух обработчиков в одном.(для IDNO и IDYES)
если в eax IDYES то мы получим адрес сообщения "Нет!"
иначе сообщения "Да!"(IDNO-IDYES=1 что при умножении на 5 и выдаст смещение к букве Д относительно _otvets)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.03.2010, 00:44   #3
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

Как я понял, тебе нужно объяснить смысл команды lea.

В данном случае эта команда просто выполняет арифметические действия: умножает eax на пять (eax+eax*4) и прибавляет значение (_otvets-IDYES*5) (которое вычисляется ещё на стадии ассемблирования). Результат этих действий помещается в регистр EAX

Для того, чтобы понять вообще,что делает lea нужно вникнуть в такую штуку, как косвенная адресация (и различные её разновидности).
В кратце:
Прямая адресация - это когда мы напрямую указываем адрес, с которого нужно взять данные. Пример:
Код:
mov ax, variable
Косвенная адресация - это когда адрес, с которого нам нужно получить данные, записан в регистре. Пример:
Код:
mov ax, [bx]
Существуют сложные методы косвенной адресации, например:
по базе со сдвигом:
Код:
mov ax, [bx+2]
Или по базе с индексированием:
Код:
mov ax, [bx+si+2]
В этих случаях ассемблер перед пересылкой будет сам вычислять адрес, складывая (и умножая) регистры.

Команда lea позволяет вычислить адрес, указанный таким способом и сохранить вычисленное значение в регистре. Иногда lea используют для быстрых арифметических вычислений - эта команда занимает мало байт, быстро работает и в отличии от ADD не изменяет флаги процессора.

Все способы косвенной адресации и условия их применения описаны, к примеру, в книге Зубкова "Ассемблер для DOS, Windows и Unix". Там буквально несколько страничек прочесть нужно.

Если у тебя нет этой книги - пиши в личку,я пришлю её тебе в электронном виде. Впрочем, найти её не проблема - CHM версия лежит в интернете буквально на каждом шагу
kogemrka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Linux (1 команда) werser Помощь студентам 2 02.12.2009 19:51
Команда AutoLispa ИВэТэшка Помощь студентам 7 23.04.2009 20:54
команда MOV, проблемы fermat_c Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 18.04.2008 19:19