Board.KolibriOS.org

Official KolibriOS board
It is currently Tue Jan 26, 2021 9:10 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 427 posts ]  Go to page Previous 13 4 5 6 729 Next
Author Message
 Post subject: Re: Вопрос
PostPosted: Thu Nov 26, 2015 7:01 pm 
Offline

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


Top
   
 Post subject: Re: Вопрос
PostPosted: Thu Nov 26, 2015 7:04 pm 
Offline

Joined: Tue Apr 12, 2011 11:19 pm
Posts: 1176
возможно PUSHA, POPA.


Top
   
 Post subject: Re: Вопрос
PostPosted: Thu Nov 26, 2015 7:05 pm 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 299
Похоже до меня дошло! :-)
....
@esp_: rd 1
.....


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

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


Top
   
 Post subject: Re: Вопрос
PostPosted: Thu Nov 26, 2015 7:08 pm 
Offline
User avatar

Joined: Wed Apr 15, 2015 11:13 pm
Posts: 263
Через add esp,..
попробуй


Top
   
 Post subject: Re: Вопрос
PostPosted: Thu Nov 26, 2015 7:10 pm 
Offline
User avatar

Joined: Wed Apr 15, 2015 11:13 pm
Posts: 263
много лишних команд, например
mov [@esp_], esp
mov esp,[@esp_]


Top
   
 Post subject: Re: Вопрос
PostPosted: Thu Nov 26, 2015 7:12 pm 
Offline
User avatar

Joined: Wed Apr 15, 2015 11:13 pm
Posts: 263
и еще, ты перед вызовом ф-ции пишешь pusha? А то я не понял почему закоментирован


Top
   
 Post subject: Re: Вопрос
PostPosted: Thu Nov 26, 2015 7:12 pm 
Offline
User avatar

Joined: Wed Apr 15, 2015 11:13 pm
Posts: 263
А все понял)


Top
   
 Post subject: Re: Вопрос
PostPosted: Thu Nov 26, 2015 8:09 pm 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 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 "один к одному"?


Top
   
 Post subject: Re: Вопрос
PostPosted: Thu Nov 26, 2015 8:19 pm 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 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 ) ? Или всё таки арифметичекские действия с "половинками" и "четвертинками будут происходить быстрее ?


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Nov 27, 2015 1:03 am 
Offline
User avatar

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

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


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Nov 27, 2015 1:31 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1275
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 могут не сохраняться или использоваться для возврата результата.


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Nov 27, 2015 3:44 pm 
Offline

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

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


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Nov 27, 2015 3:45 pm 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 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 ) часть когда (!!ЧАСТЬ!! буквально несколько команд! ) работает не верно!
Прошу помощи.


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Nov 27, 2015 4:58 pm 
Offline
Mentor/Kernel Developer
User avatar

Joined: Thu Mar 26, 2015 5:16 pm
Posts: 1275
Тогда скажи сразу, какие команды не работают.


Top
   
 Post subject: Re: Вопрос
PostPosted: Fri Nov 27, 2015 5:40 pm 
Offline

Joined: Sat Nov 14, 2015 11:15 am
Posts: 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 могут быть глюки или ошибки ?


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 427 posts ]  Go to page Previous 13 4 5 6 729 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited