Компилирую программу на fasm'е:
include 'E:\fasm\INCLUDE\win32ax.inc'
.code
start:
invoke MessageBox,1,"Test","Window!", MB_OK
invoke ExitProcess, 0
.end start
Все прекрасно, меняй invoke на call (вызов функции) , компилятор выдает ошибку, почему так? Это же обычный вызов WinAPI функции
include 'E:\fasm\INCLUDE\win32ax.inc'
.code
start:
call MessageBox,1,"Test","Window!", MB_OK
call ExitProcess, 0
.end start
Другие языки программирования и технологии
Fasm, вызов WinAPI функций
Ошибка в том что если уж хочешь через call вызывать, то будь добр, ручками поместить в стек все параметры функции и вызвать ее по адресу, а не по имени.
Короче, скачай PureBasic http://rutracker.org/forum/viewtopic.php?t=3232116
И смотри как он из высокоуровневого кода, строит асм код.
К прмиеру, строка
MessageBox_(0,"Test","Window!", #MB_OK)
Превратится в такой асм. код.
PUSH dword 0
PUSH dword _S1
PUSH dword _S2
PUSH dword 0
CALL _MessageBoxA@16
Весь асм листинг трансляции бейсик-кода в FASM.
format MS COFF
;
;
extrn _ExitProcess@4
extrn _GetModuleHandleA@4
extrn _HeapCreate@12
extrn _HeapDestroy@4
extrn _MessageBoxA@16
extrn _memset
extrn PB_StringBase
extrn _SYS_InitString@0
extrn _SYS_FreeStrings@0
;
extrn _PB_StringBasePosition
public _PB_Instance
public _PB_ExecutableType
public _PB_OpenGLSubsystem
public _PB_MemoryBase
public PB_Instance
public PB_MemoryBase
public _PB_EndFunctions
macro pb_public symbol
{
public _#symbol
public symbol
_#symbol:
symbol:
}
macro pb_align value { rb (value-1) - ($-_PB_DataSection + value-1) mod value }
macro pb_bssalign value { rb (value-1) - ($-_PB_BSSSection + value-1) mod value }
public PureBasicStart
;
section '.code' code readable executable align 8
;
;
PureBasicStart:
;
PUSH dword I_BSSEnd-I_BSSStart
PUSH dword 0
PUSH dword I_BSSStart
CALL _memset
ADD esp,12
PUSH dword 0
CALL _GetModuleHandleA@4
MOV [_PB_Instance],eax
PUSH dword 0
PUSH dword 4096
PUSH dword 0
CALL _HeapCreate@12
MOV [PB_MemoryBase],eax
CALL _SYS_InitString@0
;
; MessageBox_(0,"Test","Window!", #MB_OK)
PUSH dword 0
PUSH dword _S1
PUSH dword _S2
PUSH dword 0
CALL _MessageBoxA@16
_PB_EOP_NoValue:
PUSH dword 0
_PB_EOP:
CALL _PB_EndFunctions
CALL _SYS_FreeStrings@0
PUSH dword [PB_MemoryBase]
CALL _HeapDestroy@4
CALL _ExitProcess@4
_PB_EndFunctions:
RET
;
;
section '.data' data readable writeable
;
_PB_DataSection:
_PB_OpenGLSubsystem: db 0
pb_public PB_DEBUGGER_LineNumber
dd -1
pb_public PB_DEBUGGER_IncludedFiles
dd 0
pb_public PB_DEBUGGER_FileName
db 0
_PB_ExecutableType: dd 0
public _SYS_StaticStringStart
_SYS_StaticStringStart:
_S1: db "Window!",0
_S2: db "Test",0
pb_public PB_NullString
db 0
public _SYS_StaticStringEnd
_SYS_StaticStringEnd:
align 4
align 4
s_s:
dd 0
dd -1
align 4
;
section '.bss' readable writeable
_PB_BSSSection:
align 4
;
I_BSSStart:
_PB_MemoryBase:
PB_MemoryBase: rd 1
_PB_Instance:
PB_Instance: rd 1
;
align 4
PB_DataPointer rd 1
align 4
align 4
align 4
align 4
I_BSSEnd:
section '.data' data readable writeable
SYS_EndDataSection:
Короче, скачай PureBasic http://rutracker.org/forum/viewtopic.php?t=3232116
И смотри как он из высокоуровневого кода, строит асм код.
К прмиеру, строка
MessageBox_(0,"Test","Window!", #MB_OK)
Превратится в такой асм. код.
PUSH dword 0
PUSH dword _S1
PUSH dword _S2
PUSH dword 0
CALL _MessageBoxA@16
Весь асм листинг трансляции бейсик-кода в FASM.
format MS COFF
;
;
extrn _ExitProcess@4
extrn _GetModuleHandleA@4
extrn _HeapCreate@12
extrn _HeapDestroy@4
extrn _MessageBoxA@16
extrn _memset
extrn PB_StringBase
extrn _SYS_InitString@0
extrn _SYS_FreeStrings@0
;
extrn _PB_StringBasePosition
public _PB_Instance
public _PB_ExecutableType
public _PB_OpenGLSubsystem
public _PB_MemoryBase
public PB_Instance
public PB_MemoryBase
public _PB_EndFunctions
macro pb_public symbol
{
public _#symbol
public symbol
_#symbol:
symbol:
}
macro pb_align value { rb (value-1) - ($-_PB_DataSection + value-1) mod value }
macro pb_bssalign value { rb (value-1) - ($-_PB_BSSSection + value-1) mod value }
public PureBasicStart
;
section '.code' code readable executable align 8
;
;
PureBasicStart:
;
PUSH dword I_BSSEnd-I_BSSStart
PUSH dword 0
PUSH dword I_BSSStart
CALL _memset
ADD esp,12
PUSH dword 0
CALL _GetModuleHandleA@4
MOV [_PB_Instance],eax
PUSH dword 0
PUSH dword 4096
PUSH dword 0
CALL _HeapCreate@12
MOV [PB_MemoryBase],eax
CALL _SYS_InitString@0
;
; MessageBox_(0,"Test","Window!", #MB_OK)
PUSH dword 0
PUSH dword _S1
PUSH dword _S2
PUSH dword 0
CALL _MessageBoxA@16
_PB_EOP_NoValue:
PUSH dword 0
_PB_EOP:
CALL _PB_EndFunctions
CALL _SYS_FreeStrings@0
PUSH dword [PB_MemoryBase]
CALL _HeapDestroy@4
CALL _ExitProcess@4
_PB_EndFunctions:
RET
;
;
section '.data' data readable writeable
;
_PB_DataSection:
_PB_OpenGLSubsystem: db 0
pb_public PB_DEBUGGER_LineNumber
dd -1
pb_public PB_DEBUGGER_IncludedFiles
dd 0
pb_public PB_DEBUGGER_FileName
db 0
_PB_ExecutableType: dd 0
public _SYS_StaticStringStart
_SYS_StaticStringStart:
_S1: db "Window!",0
_S2: db "Test",0
pb_public PB_NullString
db 0
public _SYS_StaticStringEnd
_SYS_StaticStringEnd:
align 4
align 4
s_s:
dd 0
dd -1
align 4
;
section '.bss' readable writeable
_PB_BSSSection:
align 4
;
I_BSSStart:
_PB_MemoryBase:
PB_MemoryBase: rd 1
_PB_Instance:
PB_Instance: rd 1
;
align 4
PB_DataPointer rd 1
align 4
align 4
align 4
align 4
I_BSSEnd:
section '.data' data readable writeable
SYS_EndDataSection:
Похожие вопросы
- какой winapi функцией можно полусить размеры экрана в миллиметрах либо количество пикселей на миллиметр?
- Вызов API-функции из ассемблерного кода.
- Оконное приложение на WinAPI, вопрос про параметры функции WndProc. Язык программирования Си.
- Простая задача на FASM (ассемблер) помогите 3 дня мучаюсь!!!
- Почему в этой программе переменная объявлена дважды? (C++, WinAPI)
- WINAPI и C++ в целом
- WinAPI
- Пишут ли еще программы на голом winapi и c++? Или сейчас все пишут при помощи библиотека, таких как Qt?
- В чём разница между WinAPI и DirectX?
- WinAPI используют преимущественно в C++?
Но почему ты даже сейчас не смог не упомянуть свой фетишь?