Может кто-нибудь объяснить мне, как работает этот код Flat Assembler? - PullRequest
1 голос
/ 19 января 2020

Я пытаюсь научить меня делать GUI программы на ассемблере. Я скачал Flat Assembler и начал читать примеры программ. Там я нашел этот код. Это 64-битный код в сборке (fasm) для Windows. Это делает пустое окно. Но в нем было очень мало комментариев, поэтому мне трудно понять, что происходит. Я прокомментировал здесь, какие части я не понимаю.

format PE64 GUI 5.0
entry start

include 'win64a.inc'

section '.idata' import data readable writeable

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

  include 'api\kernel32.inc'
  include 'api\user32.inc'

section '.data' data readable writeable

  _title TCHAR 'Win64 program template',0
  _class TCHAR 'FASMWIN64',0
  _error TCHAR 'Startup failed.',0

  wc WNDCLASSEX sizeof.WNDCLASSEX,0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class,NULL

  msg MSG

section '.text' code readable executable

  start:
        sub     rsp,8           ; Make stack dqword aligned

        invoke  GetModuleHandle,0 ;GetModuleHandle,0?
        mov     [wc.hInstance],rax ;wc.hInstance?
        invoke  LoadIcon,0,IDI_APPLICATION ;LoadIcon,0,IDI_APPLICATION?
        mov     [wc.hIcon],rax ;wc.hIcon?
        mov     [wc.hIconSm],rax ;ec.hIconSm?
        invoke  LoadCursor,0,IDC_ARROW ;LoadCursor,0,IDC_ARROW?
        mov     [wc.hCursor],rax ;wc.hCursor?
        invoke  RegisterClassEx,wc ;RegisterClassEx,wc?
        test    rax,rax ;test?
        jz      error

        invoke  CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,NULL,NULL,[wc.hInstance],NULL
        test    rax,rax
        jz      error

  msg_loop: ;What does this function?
        invoke  GetMessage,msg,NULL,0,0
        cmp     eax,1
        jb      end_loop
        jne     msg_loop
        invoke  TranslateMessage,msg
        invoke  DispatchMessage,msg
        jmp     msg_loop

  error:
        invoke  MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK

  end_loop:
        invoke  ExitProcess,[msg.wParam]

proc WindowProc uses rbx rsi rdi, hwnd,wmsg,wparam,lparam ;?

; Note that first four parameters are passed in registers,
; while names given in the declaration of procedure refer to the stack
; space reserved for them - you may store them there to be later accessible
; if the contents of registers gets destroyed. This may look like:
;       mov     [hwnd],rcx
;       mov     [wmsg],edx
;       mov     [wparam],r8
;       mov     [lparam],r9

        cmp     edx,WM_DESTROY
        je      .wmdestroy
  .defwndproc: ;What does this?
        invoke  DefWindowProc,rcx,rdx,r8,r9
        jmp     .finish
  .wmdestroy:
        invoke  PostQuitMessage,0
        xor     eax,eax
  .finish:
        ret

endp
...