Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Ср окт 24, 2018 8:23 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 365 сообщений ]  На страницу Пред. 13 4 5 6 725 След.
Автор Сообщение
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Чт ноя 26, 2015 7:01 pm 
Не в сети

Зарегистрирован: Сб ноя 14, 2015 11:15 am
Сообщения: 299
В коде @DrawXLineA (сообщение выше)
идёт вызов процедуры Call Draw
которая работает нормально когда она "сама-по-себе", (т.е не внутри какой либо процедуры)
скорее всего, она не очень корректна по "пуш" и "поп"
подскажите, как не ковыряя процедуры, до её начала сохранить указатель стека и всех регистров, а после её выполнения вернуть состояние регистров и стека, учитывая то, что "пушей" и "попов" может быть разное количество (надеюсь "пушей" там больше :-).


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Чт ноя 26, 2015 7:04 pm 
Не в сети

Зарегистрирован: Вт апр 12, 2011 11:19 pm
Сообщения: 1132
возможно PUSHA, POPA.


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Чт ноя 26, 2015 7:05 pm 
Не в сети

Зарегистрирован: Сб ноя 14, 2015 11:15 am
Сообщения: 299
Похоже до меня дошло! :-)
....
@esp_: rd 1
.....


Pusha;
mov [@esp_], esp
Call Draw
mov esp,[@esp_]
popa

УРА ! ЗАРАБОТАЛО!
ИЛИ МОЖНА КАК-ТО ПОУМНЕЕ ?


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Чт ноя 26, 2015 7:08 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Ср апр 15, 2015 11:13 pm
Сообщения: 241
Через add esp,..
попробуй


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Чт ноя 26, 2015 7:10 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Ср апр 15, 2015 11:13 pm
Сообщения: 241
много лишних команд, например
mov [@esp_], esp
mov esp,[@esp_]


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Чт ноя 26, 2015 7:12 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Ср апр 15, 2015 11:13 pm
Сообщения: 241
и еще, ты перед вызовом ф-ции пишешь pusha? А то я не понял почему закоментирован


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Чт ноя 26, 2015 7:12 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Ср апр 15, 2015 11:13 pm
Сообщения: 241
А все понял)


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Чт ноя 26, 2015 8:09 pm 
Не в сети

Зарегистрирован: Сб ноя 14, 2015 11:15 am
Сообщения: 299
[quote="pavelyakov"]Через add esp,..
попробуй[/quote]
ну add esp поменяет сам указатель!... а регистры то восстановить надо!.... до вызова процедуры Draw (из процедуры DrawXLineA1) вызывающая процедура ведь расчитывала на их?! Это же не "ручная лепка" :-) это скомпилированный код дельфи в который надо вставлять вызовы процедур, т.е.
DrawXLineA1; - представляет из себя, скомпилированный дельфи-асм-код, в который делается "врезка", для вызова другой процедуры Draw, ну и параметры должны передаваться для Draw, (о возврате параметров из Draw, вопрос пока не стоит, я всё таки еще пока новичёк :-) ) Вот поэтому, я хочу до выполнения процедуры Draw сохранить всё так как было и после выполнения Draw вернуть как ни в чём не бывало. :-)
ВОТ ПОКА ТАК!

Вот еще вопрос возник... Передача регистров видимо будет осуществляться через аналоги зарезервированных регистров, т.е.
.............
@ECX_ rd 1
.............

SetECX_:
Mov [@ECX_],EAX
ret
.................
call SetECX_ ;
.................
как SetECX_ сделать макросом т.е. SetECX_ в коде должно заменять Mov [@ECX_],EAX "один к одному"?


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Чт ноя 26, 2015 8:19 pm 
Не в сети

Зарегистрирован: Сб ноя 14, 2015 11:15 am
Сообщения: 299
ВО ЕЩЕ: В дедьфи в помощи (о Cardinal 0..4294967295 unsigned 32-bit )написано следующее:
An integer type represents a subset of the whole numbers. The generic integer types are Integer and Cardinal; use these whenever possible, since they result in the best performance for the underlying CPU and operating system. The table below gives their ranges and storage formats for the current 32-bit Delphi compiler.

Тупой перевод:
Тип целого представляет подмножество целых чисел. Типы общего целого - Целое и Кардинал; используйте их там, где возможно, поскольку они заканчиваются наилучшим показателем для основной CPU и операционной системы. Таблица ниже дает их области и память форматируется для текущего 32-битового компилятора Delphi.

Т.е. другими словами в асме можно (и даже так лучше) использовать ГДЕ ЭТО ВОЗМНОЖНО регистры "целиком" (eax), а не их "половинки" (AX) или "четвертинки (AH, AL ) ? Или всё таки арифметичекские действия с "половинками" и "четвертинками будут происходить быстрее ?


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Пт ноя 27, 2015 1:03 am 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 778
ALEXS1983 писал(а):
> в асме можно (и даже так лучше) использовать ГДЕ ЭТО ВОЗМНОЖНО регистры "целиком"
> (eax), а не их "половинки" (AX) или "четвертинки (AH, AL ) ? Или всё таки арифметичекские
> действия с "половинками" и "четвертинками будут происходить быстрее ?

Лучше использовать целые регистры eax, по идее должно работать быстрее. Дробные регистры (AX, AH, AL, ...) вроде-бы остались среди команд ассемблера для совместимости со старыми программами.


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Пт ноя 27, 2015 1:31 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1243
ALEXS1983
Просто замечательная среда для изучения ассемблера. Оптимизирует так, чтоб ты ничего не понял.
Если подпрограмма принимает три параметра, то выглядит так:
push ebp
mov ebp, esp
параметры адресуются через [ebp+8+?], можно пользоваться стеком
mov esp, ebp
pop ebp
ret 12 ; три рор после возврата

Выделить место под две локальные переменные можно вручную:
sub esp, 8
...
тут адресуются через [esp+?]
push eax
тут адресуются через [esp+4+?]
pop eax
...
add esp, 8
ret

Если и то и то:
sub esp, 8
push ebp
mov ebp, esp
параметры адресуются через [ebp+16+?]
локальные переменные через [ebp+4+?]
mov esp, ebp
pop ebp
add esp, 8
ret 12

По конвенции stdcall подпрограмма обязана сохранять содержимое регистров bx, si, di, bp. Регисты ax, dx, cx могут не сохраняться или использоваться для возврата результата.


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Пт ноя 27, 2015 3:44 pm 
Не в сети

Зарегистрирован: Сб ноя 14, 2015 11:15 am
Сообщения: 299
[quote="Pathoswithin"]Просто замечательная среда для изучения ассемблера. Оптимизирует так, чтоб ты ничего не понял.[/quote]
Да нормально! :-) Разберёмся! :-) Спасибо за разъяснение!
[quote="Pathoswithin"]По конвенции stdcall подпрограмма обязана сохранять содержимое регистров bx, si, di, bp. Регисты ax, dx, cx могут не сохраняться или использоваться для возврата результата.[/quote]
О! А это интересно! Думаю пригодится в будущем! Спасибо!

Тут еще одна хрень "нарисовалась" см. следующее сообщение


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Пт ноя 27, 2015 3:45 pm 
Не в сети

Зарегистрирован: Сб ноя 14, 2015 11:15 am
Сообщения: 299
Создавал пошаговый урок для своего форума. И тут натолкнулся на облом который я врядле самостоятельно решу. Прошу помощи у спецов.
В в архиве https://cloud.mail.ru/public/6yYg/579fb7Sx8 пошагово урок, папки Part00, Part01, Part02
Part03, который постепенно преобразовывает одну процедуру писанную на дельфи на асм....
Ближе к делу, см. KOS05\Part03\EL_indicator.dpr процедура DrawXLine верно работает написанная на дельфи, также верно работает эта же процедура на асме в асм-вставках дельфи DrawXLineA (процедура находится тоже в файле, KOS05\Part03\EL_indicator.dpr ) и вот после того как я “перебазировал” процедуру DrawXLineA в FASM, (файл KOS05\Part03\ Lesson.prt ) часть когда (!!ЧАСТЬ!! буквально несколько команд! ) работает не верно!
Прошу помощи.


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Пт ноя 27, 2015 4:58 pm 
Не в сети
Mentor/Kernel Developer
Аватара пользователя

Зарегистрирован: Чт мар 26, 2015 5:16 pm
Сообщения: 1243
Тогда скажи сразу, какие команды не работают.


Вернуться к началу
 Заголовок сообщения: Re: Вопрос
СообщениеДобавлено: Пт ноя 27, 2015 5:40 pm 
Не в сети

Зарегистрирован: Сб ноя 14, 2015 11:15 am
Сообщения: 299
ну если бы я сам знал, то не спрашивал бы :-)
в общем почему-то не работает ветка
.............
case drawType of
0:begin posy:=posy-1;x1:=x1-1;posx:=posx+1; end;
.....................

на асме она

..........................
;//EL_indicator.dpr.25: 0:begin posy:=posy-1;x1:=x1-1;posx:=posx+1; end;
@STR25: dec esi
dec dword [ebp-$08]
inc dword [ebp-$04]
jmp @STR31;// jmp +$0d
........................
Но самое интересное, что в других ветках "case drawType of" ведь тоже "posy:=posy-1;", "x1:=x1-1;", "posx:=posx+1;" там они нормально работают. Да и в дельфи в асм вставках работаю нормально.
Можно бы было сказать что мои "врезки" в процедуру некоректные, но они в конце процедуры. Да и процедура вызывается 4 раза (по всем веткам case drawType of ) ведь нормально работают.
Вот подумал.... я то проверял в KlbrInWin, а не в самой системе. А в KlbrInWin могут быть глюки или ошибки ?


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 365 сообщений ]  На страницу Пред. 13 4 5 6 725 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB