![]() |
Модераторы: Poseidon |
![]() ![]() ![]() |
|
Kirill89 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 17.10.2006 Где: Питер Репутация: нет Всего: 4 |
Я почти не знаком с ассемблером, как сделать?:
Заранее спасибо! |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Kirill89,
Пояснение: в ASM нельзя напрямую работать с командами, в которых левый и правый операнды расположены в памяти (т.е. пересылка, арифметические команды и т.д.), что связано с кодированием команд в архитектуре процессора INTEL. Поэтому вместо временной переменной используем регистр eax (для 32-битных приложений), или ax (для 16-битных) далее складываем в регистре и заносим регистр в результат. Регистр - это ячейка памяти непосредственно в процессоре -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 16 Всего: 128 |
Kuvaldis, конечно, может, это лишнее в данном случае, но я тут в DRKB прочитал, что рекомендуется не делать ассемблерных вставок внутри процедур/функций, т.к. это снижает быстродействие. Мож, я и не прав, но имхо лучше было бы так:
|
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
mr.Anderson,
В общем, если функция вызывается где-нибудь в цикле, то лучше ее реализовать как ассемблерную вставку без вызова функции (типа inline). При вызове функции в программный стек заносится много лишней инфы, необходимой для выхода из функции (стековый фрейм): там и адрес возврата, и параметры, и локальные переменные. Это ЯВНО тормозит выполнение. Но, с другой стороны, увеличивается структурированность. ТАк что здесь нужно автору смотреть, что он хочет сделать. ![]() Это сообщение отредактировал(а) Kuvaldis - 2.7.2007, 10:38 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
Kirill89 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 17.10.2006 Где: Питер Репутация: нет Всего: 4 |
mr.Anderson,
Kuvaldis, Спасибо! + вам ![]() |
|||
|
||||
Kirill89 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 17.10.2006 Где: Питер Репутация: нет Всего: 4 |
оказалось это не всё :(
Как на ассемблере сделать цикл loop? |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 16 Всего: 128 |
Пример:
Не проверял, но работать должно. |
|||
|
||||
Kirill89 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 17.10.2006 Где: Питер Репутация: нет Всего: 4 |
сразу говорю, что не работает... Как сделать вложенный цикл? как получить текущее значение циклической переменной? Это cx? я правильно понял? |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 16 Всего: 128 |
Ффух... вот что значит в асме ни бум-бум... Еле написал. Процедура циклически прибавляет к 10 единицу. В итоге получаем 15. Переделай под себя.
|
|||
|
||||
Kirill89 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 17.10.2006 Где: Питер Репутация: нет Всего: 4 |
mr.Anderson, ага, совсем не бум-бум...
почти ничего не понял из твоего... творчества ![]()
Это надо сделать вставкой... Выручай, сделаешь это- будет ещё "+"... извини, что напрягаю... Это сообщение отредактировал(а) Kirill89 - 3.7.2007, 00:26 |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 16 Всего: 128 |
Да не бум-бум не вы, а я.
![]()
Это сообщение отредактировал(а) mr.Anderson - 3.7.2007, 09:34 |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Объясняю принцип построения циклов на ассемблере.
Есть встроенная команда loop, веденная в архитектуру INTEL еще с процессоров 8086, предназначенная для обработки циклов. Принцип работы: 1. Из регистра ecx вычитается 1 2. Если ecx != 0, то происходит переход по метке Прошу заметить, что ручками ничего вычитать не надо. Это делается на аппаратном уровне Далее: организация вложенных циклов Понятно, что для этого нам нужно где-то сохранять регистр-счетчик ecx внешнего цикла, пока работает внутренний. Для этого помещаем данный регистр в стек и перед 2-м лупом восстанавливаем. Смотри код Еще один момент: передача параметров. Написано var, т.е. идут адреса переменных. Значит, заполняем "адресные" регистры (для косвенной регистровой адресации) при помощи команды mov В общем, смотри, что тебе непонятно. Будем пробовать разбираться Код рабочий
-------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 16 Всего: 128 |
Kuvaldis, а мне можно вопросы задать?
Во-первых, почему используем именно edi в строчке 37. Во-вторых, нигде не видно, чтобы по коду edi увеличивался. Как же мы тогда получаем новых элемент массива? В-третьих, почему в строке 40 esi в квадратных скобках. Это означает, что помещаем не в регистр, а в то, что в нем находится? |
|||
|
||||
Kuvaldis |
|
||||||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
mr.Anderson,
Это от старого кода осталось ![]()
Получаем новый элемент массива путем добавления к адресу начала, который в ebx размера эл-та массива (это 4 байта). Лучше использовать конечно что-либо типа TYPE, но во встроенный асм Delphi эта директива не включена
esi - регистр, который используется как указатель в прогах на асме. Т.е. запись mov [esi], 10 значит то же самое, что и *esi = 10 (разыменование указателя в С++) Вот подлизанный вариант кода (брал лишнее из выше выложенного, который тоже рабочий ![]()
Это сообщение отредактировал(а) Kuvaldis - 3.7.2007, 14:00 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||||||
|
|||||||||
Kirill89 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 17.10.2006 Где: Питер Репутация: нет Всего: 4 |
Kuvaldis,
mr.Anderson, вам обоим большое спасибо и по "+". Очень помогли. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Центр помощи" | |
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Центр помощи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |