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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2010, 18:43   #1
Vitek-pm
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 56
По умолчанию Запись в регистр

Только начал разбираться в ассемблере, вопрос следующий.
Если написать
Код:
mov eax, [esi+4*edi]
то будет посчитан адрес esi+4*edi и ЗНАЧЕНИЕ, лежащее по этому адресу будет записано в регистр.
А если мне надо поместить именно само значение esi+4*edi в регистр? Такой код работает:
Код:
lea eax, [esi+4*edi]
но, мне кажется, это не оптимальный вариант: мы сначала считаем адрес, потом берем операнд, лежащий по этому адресу и берем у этого операнда адрес...

Код
Код:
mov eax, esi+4*edi
не работает
Vitek-pm вне форума Ответить с цитированием
Старый 15.02.2010, 19:40   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
мы сначала считаем адрес, потом берем операнд, лежащий по этому адресу и берем у этого операнда адрес...
Вообще-то никакие аддреса тут не высчитываются. Считаются только esi+4*edi и результат заносится в eax.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 15.02.2010, 19:59   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
если мне надо поместить именно само значение esi+4*edi в регистр?
а переставить операнды пробывали?(в вашем же mov)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.02.2010, 20:17   #4
Vitek-pm
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 56
По умолчанию

Цитата:
Вообще-то никакие аддреса тут не высчитываются. Считаются только esi+4*edi и результат заносится в eax.
Код такой:
Код:
arr2 = new int[20];

...

__asm{

...

mov esi, arr2
mov edi, 3

mov eax, [esi+4*edi]

...

}
В итоге в eax будет занесен третий (если считать с нуля) элемент массива. А мне нужно занести адрес этого третьего элемента.

Про переставление операндов вообще не понял: все правильно, сначала приемник, потом источник...
Vitek-pm вне форума Ответить с цитированием
Старый 15.02.2010, 20:43   #5
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
В итоге в eax будет занесен третий (если считать с нуля) элемент массива. А мне нужно занести адрес этого третьего элемента.
Ну так..
Код:
lea eax, [esi+4*edi]
как вы и написали
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 15.02.2010, 20:45   #6
Vitek-pm
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 56
По умолчанию

И это будет, так скажем, самый оптимальный вариант?...
Vitek-pm вне форума Ответить с цитированием
Старый 15.02.2010, 21:16   #7
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

три действия за одну команду.... Куда еще оптимальнее.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 16.02.2010, 04:04   #8
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Vitek-pm
Офигиваю от постановки вопроса
Цитата:
Только начал разбираться в ассемблере... но, мне кажется, это не оптимальный вариант
другими словами, "только-только сдал на права, не подскажите мне, как выиграть формулу 1"
эквивалент команды lea eax, [esi+4*edi] это последовательное выполнение следующих команд
mov eax,edi / shl eax,2 / add eax,esi / lea eax,[eax]

Последний раз редактировалось Mikl___; 16.02.2010 в 06:22.
Mikl___ вне форума Ответить с цитированием
Старый 16.02.2010, 14:58   #9
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Lea - одна из самых быстрых команд. Выполняется за тоже время, что и команды пересылки регистр-регистр, но может заменять сразу несколько простейших команд. Благодаря этому многие компиляторы оптимизируют свой код при помощи этой команды.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 16.02.2010, 16:30   #10
Vitek-pm
Пользователь
 
Регистрация: 17.02.2009
Сообщений: 56
По умолчанию

Цитата:
Vitek-pm
Офигиваю от постановки вопроса
Цитата:
Только начал разбираться в ассемблере... но, мне кажется, это не оптимальный вариант
другими словами, "только-только сдал на права, не подскажите мне, как выиграть формулу 1"
Не согласен с Вашим сравнением, не вижу ничего плохого в том, чтобы в начале изучения разобраться в некоторых тонкостях. Правильнее бы было сказать: "только начал учиться на права, не подскажите, как ездить, чтобы уменьшить расход топлива" :-)
Vitek-pm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как изменить регистр Windows? Влад_М Общие вопросы Delphi 12 12.05.2009 21:41
Регистр в таблицах БД Alexij БД в Delphi 3 17.04.2008 13:38
Регистр символов Никки Общие вопросы Delphi 1 22.12.2007 20:14
регистр vitalik007 Общие вопросы Delphi 2 15.09.2007 02:41