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

 WASM Phorum —› WASM.ZEN —› MASM -> FASM вопрос по переносу исходника

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Янв 8, 2004 19:24:14

Переписываю исходник с MASM32v8 на FASM 1.50? возникла следующая ситуация, в исходниках:
MASM:
Main proc
local wc:WNDCLASSEX
...
invoke RegisterClassEx, ADDR wc

FASM:
proc Main
wc WNDCLASSEX
enter
...
invoke RegisterClassEx, ADDR wc

после компиляции
MASM:
lea eax, [ebp+var_50]
push eax ; const WNDCLASSEXA *
call RegisterClassExA

FASM:
lea edx, [ebp+var_30]
push edx ; const WNDCLASSEXA *
call ds:RegisterClassExA

с чего вдруг автор FASM решил использовать регистр edx?
или я чтото упустил?


Дата: Янв 8, 2004 19:32:13

А собсно какая разница? Когда делается invoke, ты уже попрощался с содержимым eax,ecx,edx


Дата: Янв 8, 2004 19:39:04

С Fasm не работал, но есть док файл на русском, если надо кричи


Дата: Янв 8, 2004 19:42:17

а почему я должен попрощатся с edx? и с какими еще регистрами мне попрощаться?


Дата: Янв 8, 2004 19:50:04
Правка

proc Main
wc WNDCLASSEX
enter
...
invoke RegisterClassEx, ADDR wc


Приехали…
Грубо говоря:
В FASM'e, как и в TASM'e (под Идеал) если хочешь получить смещение, то используй просто имя переменной;
хочешь её значение — будь добр, пиши через [wc].

Т.е.
FASM: 
proc Main 
.wc WNDCLASSEX 
enter 
... 
invoke RegisterClassEx,wc


Кажется, так?
Кстати, в исходниках мне встречались конструкции, похожие на С, в смысле объявление
ТИП переменная.
Это стандарт или макрос?


Дата: Янв 8, 2004 19:51:27

[ Dr.Golova: Когда делается invoke, ты уже попрощался с содержимым eax,ecx,edx]

Это почему же? Ну допустим если есть ADDR то задействуется eax, но все остальные регистры в полном порядке, но и здесь можно выкрутиться используя OFFSET.


Дата: Янв 8, 2004 19:52:25 · Поправил: pas

r97
Я пробовал откомпилировать подобную конструкцию, но FASM выдал ошибку, каким компилятором Вы пользуетесь (win, console, DOS версия)?


Дата: Янв 8, 2004 19:53:02 · Поправил: IceStudent
Правка

r97
а почему я должен попрощатся с edx? и с какими еще регистрами мне попрощаться?
Если кодишь под Win32, то "прощайся" со всеми регистрами,
кроме ebx,esi,edi :)
Почитай про STDCALL convention…

Asterix
если есть ADDR то задействуется eax
Не факт (!), т.к. если нет локальной переменной, то eax не тронут.

Pas
Ох-хо-хо, всё-таки мне надо было запостить переведённые главы из «Руководства программистов»…
А то ведь весь форум скоро будет состоять из обсуждений кодинга на FASM'e…


Дата: Янв 8, 2004 20:00:20

Asterix
Это почему же? Ну допустим если есть ADDR то задействуется eax, но все остальные регистры в полном порядке, но и здесь можно выкрутиться используя OFFSET.
Вызываемая функция (RegisterClassEx) всё равно перепишет EAX. С другой стороны, под LEA лучше использовать аккумулятор с точки зрения оптимизации, но это уже другой вопрос. И вообще, если ADDR в фасме тоже макрос, то его можно переопределить.


Дата: Янв 8, 2004 20:05:48

Разговор был про invoke, а про функцию само-собой понятно.


Дата: Янв 8, 2004 20:11:30

ух ты, сколько тут народу то высказалось!
спасибо Dr.Golova IceStudent
взглюкнул я малость - конечно все регистры кроме ebx,esi,edi могут поменять значение, проблема была в другом, спасибо за поддержку.

IceStudent
мне нужен был адрес wc а не значение, так как переменная была локальная (в стеке, locals) то я знаю только один способ получить ее адрес - через lea


Дата: Янв 8, 2004 20:16:03
Правка

Разговор был про invoke, а про функцию само-собой понятно.
Если было действительно так…
Часто бывает, что вызовёшь какую-нибудь API, глянешь в регистры — а в них куча полезной информации, которую в других случаях пришлось бы получать, вызывая другие API.

pas
Там куча ошибок :)
А компилятор один и тот же, независимо от подсистемы.

Посмотри примеры, что идут с компилятором, сразу (почти) поймёшь, что к чему…


Дата: Янв 8, 2004 20:16:25

программа заработала, однако читаемость исходника весьма снизилась, возможно я не очень хорошо знаю возможности fasma но чтобы получить код аналогичный masmовскому:
.if eax>h_w
mov esi,offset row_r
.repeat
inc ecx
mov ebx,[esi]
add esi,4
.until eax<ebx || ebx==0
.endif

на fasme у меня получилось нечто страшное:
.if eax,nbe,[h_w]
mov esi,row_r
rpt1:
inc ecx
mov ebx,[esi]
add esi,4
cmp eax, ebx
jb erpt1
or ebx, ebx
jnz rpt1
erpt1:
.endif

может есть возможность записать код более красиво?


Дата: Янв 8, 2004 20:23:01 · Поправил: Black_mirror

По моему это самый короткий вариант регистрации окна:
xor ebx,ebx
invoke GetStosckObject,WHITE_BRUSH ,IDM_MAINMENU,"MyWndClass"
invoke LoadCursor,ebx,IDC_ARROW ,eax
invoke LoadIcon,ebx,IDI_APPLICATION ,eax
invoke GetModuleHandle,ebx ,eax
invoke RegisterClass,esp ,CS_HREDRAW+CS_VREDRAW,WndProc,ebx,ebx
add esp,40


Дата: Янв 8, 2004 20:31:30

IceStudent
А вот с момента Там куча ошибок
хотелось бы поподробней, разве вот этот код компилируется с ошибками?
include '%fasminc%\win32ax.inc'
entry Main
section '.code' code readable executable
proc Main
wc WNDCLASSEX
enter
;...
invoke RegisterClassEx, ADDR wc
return
section '.idata' import data readable writeable
library user32,'user32.DLL'
include '%fasminc%/apia/user32.inc'

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.058