· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› Баг в Fasm 1.51

Посл.отвђт Сообщен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