Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Перевод с TASM на FASM

Вопрос:
Переведите текст проги с синтаксиса масма на синтакис фасма.
.386
.model flat,stdcall
option casemap:none

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
ClassName		db "SimpleWinClass",0
AppName			db "Our First Window",0
MenuName		db "FirstMenu",0
ButtonClassName	db "button",0
ButtonText		db "My First Button",0
EditClassName		db "edit",0
TestString		db "Wow! I'm in an edit box now",0

.data?
hInstance	HINSTANCE ?
CommandLine	LPSTR ?
hwndButton	HWND ?
hwndEdit	HWND ?
buffer		db 512 dup(?)		; buffer to store the text
						; retrieved from the edit box

.const
ButtonID	equ 1			; The control ID of the button control
EditID		equ 2			; The control ID of the edit control
IDM_HELLO	equ 1
IDM_CLEAR	equ 2
IDM_GETTEXT	equ 3
IDM_EXIT	equ 4

.code
start:
	invoke GetModuleHandle, NULL
	mov hInstance,eax
	invoke GetCommandLine
	mov CommandLine,eax
	invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
	invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND

	mov wc.cbSize,SIZEOF WNDCLASSEX
	mov wc.style, CS_HREDRAW or CS_VREDRAW
	mov wc.lpfnWndProc, OFFSET WndProc
	mov wc.cbClsExtra,NULL
	mov wc.cbWndExtra,NULL
	push hInst
	pop wc.hInstance
	mov wc.hbrBackground,COLOR_BTNFACE+1
	mov wc.lpszMenuName,OFFSET MenuName
	mov wc.lpszClassName,OFFSET ClassName
	invoke LoadIcon,NULL,IDI_APPLICATION
	mov wc.hIcon,eax
	mov wc.hIconSm,eax
	invoke LoadCursor,NULL,IDC_ARROW
	mov wc.hCursor,eax
	invoke RegisterClassEx, addr wc
	invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName, \
		ADDR AppName, WS_OVERLAPPEDWINDOW,\
		CW_USEDEFAULT, CW_USEDEFAULT,\
		300,200,NULL,NULL, hInst,NULL
	mov hwnd,eax
	invoke ShowWindow, hwnd,SW_SHOWNORMAL
	invoke UpdateWindow, hwnd
	.WHILE TRUE
		invoke GetMessage, ADDR msg,NULL,0,0
		.BREAK .IF (!eax)
		invoke TranslateMessage, ADDR msg
		invoke DispatchMessage, ADDR msg
	.ENDW
	mov eax,msg.wParam
	ret

WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

	.IF uMsg==WM_DESTROY
		invoke PostQuitMessage,NULL
	.ELSEIF uMsg==WM_CREATE
		invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,\
			WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
			ES_AUTOHSCROLL,\
			50,35,200,25,hWnd,8,hInstance,NULL
		mov hwndEdit,eax
		invoke SetFocus, hwndEdit
		invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,\
			WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
			75,70,140,25,hWnd,ButtonID,hInstance,NULL
		mov  hwndButton,eax
	.ELSEIF uMsg==WM_COMMAND
		mov eax,wParam
	.IF lParam==0
		.IF ax==IDM_HELLO
			invoke SetWindowText,hwndEdit,ADDR TestString
		.ELSEIF ax==IDM_CLEAR
			invoke SetWindowText,hwndEdit,NULL
		.ELSEIF  ax==IDM_GETTEXT
			invoke GetWindowText,hwndEdit,ADDR buffer,512
			invoke MessageBox,NULL,ADDR buffer,ADDR AppName,MB_OK
		.ELSE
			invoke DestroyWindow,hWnd
		.ENDIF
	.ELSE
		.IF ax==ButtonID
			shr eax,16
			.IF ax==BN_CLICKED
				invoke SendMessage,hWnd,WM_COMMAND,IDM_GETTEXT,0
			.ENDIF
		.ENDIF
	.ENDIF
.ELSE
	invoke DefWindowProc,hWnd,uMsg,wParam,lParam
	ret
.ENDIF
	xor    eax,eax
	ret
	
WndProc endp
end start

Ответ:
Кстати, совершенно нет необходимости избавляться от условных операторов... :)
format PE GUI 4.0
entry start

include 'win32a.inc'
include 'macro\if.inc'

ButtonID        = 1                     ; The control ID of the button control
EditID          = 2                     ; The control ID of the edit control
IDM_HELLO       = 1
IDM_CLEAR       = 2
IDM_GETTEXT     = 3
IDM_EXIT        = 4

section '.data' data readable writeable

ClassName       TCHAR "SimpleWinClass",0
AppName         TCHAR "Our First Window",0
MenuName        TCHAR "FirstMenu",0
ButtonClassName TCHAR "button",0
ButtonText      TCHAR "My First Button",0
EditClassName   TCHAR "edit",0
TestString      TCHAR "Wow! I'm in an edit box now",0

section '.bss' readable writeable

hInstance       dd      ?
CommandLine     dd      ?
hwndButton      dd      ?
hwndEdit        dd      ?
buffer          db      512 dup(?)      ; buffer to store the text

section '.code' code readable executable
start:
        invoke  GetModuleHandle,0
        mov     [hInstance],eax
        invoke  GetCommandLine
        mov     [CommandLine],eax
        stdcall WinMain,[hInstance],NULL,[CommandLine],SW_SHOWDEFAULT
        invoke  ExitProcess,eax

proc WinMain hInst,hPrevInst,CmdLine,CmdShow
local wc:WNDCLASSEX,msg:MSG,hwnd:DWORD

        mov     [wc.cbSize],sizeof.WNDCLASSEX
        mov     [wc.style],CS_HREDRAW or CS_VREDRAW
        mov     [wc.lpfnWndProc],WndProc
        mov     [wc.cbClsExtra],NULL
        mov     [wc.cbWndExtra],NULL
        push    [hInst]
        pop     [wc.hInstance]
        mov     [wc.hbrBackground],COLOR_BTNFACE+1
        mov     [wc.lpszMenuName],MenuName
        mov     [wc.lpszClassName],ClassName
        invoke  LoadIcon,NULL,IDI_APPLICATION
        mov     [wc.hIcon],eax
        mov     [wc.hIconSm],eax
        invoke  LoadCursor,NULL,IDC_ARROW
        mov     [wc.hCursor],eax
        lea     eax,[wc]
        invoke  RegisterClassEx,eax
        invoke  CreateWindowEx,WS_EX_CLIENTEDGE,ClassName,\
                AppName,WS_OVERLAPPEDWINDOW,\
                CW_USEDEFAULT,CW_USEDEFAULT,\
                300,200,NULL,NULL,[hInst],NULL
        mov     [hwnd],eax
        invoke  ShowWindow,[hwnd],SW_SHOWNORMAL
        invoke  UpdateWindow,[hwnd]

        mov     eax,TRUE
        lea     ebx, [msg]
        .while  eax
                invoke TranslateMessage,ebx
                invoke DispatchMessage,ebx
                invoke GetMessage,ebx,NULL,0,0
        .endw
        mov eax,[msg.wParam]
        ret
endp

proc WndProc hWnd,uMsg,wParam,lParam

        .if [uMsg]=WM_DESTROY
                invoke PostQuitMessage,NULL
        .elseif [uMsg]=WM_CREATE
                invoke CreateWindowEx,WS_EX_CLIENTEDGE,EditClassName,NULL,\
                        WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
                        ES_AUTOHSCROLL,\
                        50,35,200,25,[hWnd],8,[hInstance],NULL
                mov [hwndEdit],eax
                invoke SetFocus,[hwndEdit]
                invoke CreateWindowEx,NULL,ButtonClassName,ButtonText,\
                        WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
                        75,70,140,25,[hWnd],ButtonID,[hInstance],NULL
                mov  [hwndButton],eax
        .elseif [uMsg]=WM_COMMAND
                mov eax,[wParam]
        .if [lParam]=0
                .if ax=IDM_HELLO
                        invoke SetWindowText,[hwndEdit],TestString
                .elseif ax=IDM_CLEAR
                        invoke SetWindowText,[hwndEdit],NULL
                .elseif  ax=IDM_GETTEXT
                        invoke GetWindowText,[hwndEdit],buffer,512
                        invoke MessageBox,NULL,buffer,AppName,MB_OK
                .else
                        invoke DestroyWindow,[hWnd]
                .endif
        .else
                .if ax=ButtonID
                        shr eax,16
                        .if ax=BN_CLICKED
                                invoke SendMessage,[hWnd],WM_COMMAND,IDM_GETTEXT,0
                        .endif
                .endif
        .endif
.else
        invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
        ret
.endif
        xor    eax,eax
        ret
        
endp

section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
          user32,'USER32.DLL'

  include 'API\kernel32.inc'
  include 'API\user32.inc'


   Вперёд
   Содержание
стекло кварцевое смотровое цена, основные требования к стеклам кварцевым смотровым | Производство стационарных офисных перегородок в Москве