|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Апр 2, 2004 11:02:39 Или это у меня в башке баг? proc aaa, bbb:DWORD enter mov eax,[bbb] return ассемблируется в push ebp mov ebp,esp mov eax,[ebp+C] Но если завести второй параметр, то та же строчка ассемблируется правильно - mov eax,[ebp+8] |
|
|
Дата: Апр 2, 2004 12:25:40 · Поправил: S_T_A_S_ hGoblin Там enter как макрос переопределен, см \fasm\INCLUDE\MACRO\STDCALL.INC Кстати, в 1.52 эти макросы переделаны сильно Новые инклуды есть на форуме Privalov'а, скоро будет оф. релиз |
|
|
Дата: Апр 2, 2004 12:46:01 Я не об enter говорю, а о стековых переменных. Если в функцию передается один параметр, то fasm считает его [ebp+C], что есть неправильно. |
|
|
Дата: Апр 2, 2004 13:36:05 Ага.. Это я не понял сразу про что :( А если написать просто bbb (без :DWORD)? |
|
|
Дата: Апр 2, 2004 13:51:30 Я имею ввиду вот что Получается баг должен быть тут:
macro proc name,[arg] ; define procedure
{ common
name:
virtual at ebp+8
if ~ arg eq
forward
local ..arg
..arg dd ?
arg equ ..arg ;; вот это: bbb:DWORD equ [ebp+XX]
common
end if
..ret = $ - (ebp+8)
Я не пользую стандартные макросы, но у меня и с EBP и ESP делается подобным образом и проблем нет. Щас проверил Или я опять чего-то не понял :-? |
|
|
Дата: Апр 2, 2004 15:20:20 · Поправил: S_T_A_S_ Да, вот что еще. Важный момент IMHO: arg equ ..arg В стандартных макросах 1.51 НЕ используется restore для восстановления пердудущего значения bbb, что может привести к различным глюкам, если есть несколько PROC с одноименными параметрами. А если еще где-то используется такое имя? 8-() Я как-то медитировал некоторое время, когда у меня НОРМАЛЬНО откомпилировался такой код: proc aaa ;, bbb mov eax,[bbb] Можете попробовать мои макросы (есть некоторое описание) 864558535__Fasm.zip
Или вот новый макрос Privalov'a (из 1.52) там проблема решена (но формат изменен): _1803321648__STDCALL.INC |
|
|
Дата: Апр 3, 2004 06:36:58 S_T_A_S Получается баг должен быть тут ... virtual at ebp+8... Ан получается не тут.. Насколько я понимаю fasmовые макросы, здесь проверка на наличие параметров как таковых, и находятся они по адресу ebp+8, так что ничего плохого не вижу. От имени ничего не зависит. Ладно, будем обращаться к единственному параметру по ebp, хотя, может макросы помогут. thanks |
|
|
Дата: Апр 3, 2004 14:01:42 · Поправил: S_T_A_S_ hGoblin Вот как я понимаю все работает:
virtual at ebp+8 ;; вся адресация далее будет происходить по ebp+8
if ~ arg eq ;; проверяет есть ли аргумент
forward
local ..arg ;; создает локальное имя
..arg dd ? ;; делает метку dd "по адресу" ebp+8+(номер arg-1)*4
arg equ ..arg ;; то имя, которе указано параметром (bbb) делается эквивалентным выражению ebp+8+NN
т.е. далее при обращении [bbb], будет подставляться [ebp+8+0]
А у вас написано вот так: bbb:DWORD
У меня без DWORD - все ОК Т.е. bbb EQU ebp+8, как и должно быть. |
|
|
Дата: Апр 3, 2004 18:08:30 Точно. Баг в башке :( Privalov сказал то же самое |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.055 |