|
|
| Посл.отвђт | Сообщен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' |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.058 |