Тема: З чого почати вчити assembler
Я маю книги:
1) "Програмування мовою асемблер" ЛНУ імені І.Ф. 2002
2) знайшов https://www.tutorialspoint.com/assembly … /index.htm такий сайт
3) і "ассемблер для windows 4 е издание" - тут більш детальніше розповідається про MASM, як зробити (викликати) консоль, GDI і інше
Я вже прочитав про "визначення даних" і "пересилання даних, стек" (регістри, команди MOV, XCHG) і хочу зробити завдання до підручника першого (там їх аж 24 я поки що і з першим не можу впоратися)
Завдання
Значення регістру DX переписати у два інших регістра.
Я зробив це так
mov ax, dx
mov bx, dx
Хоча сам не дуже розумію що я зробив, регістр DX відноситься до регістрів загального призначення тому, я так зрозумів, він не може бути записаний в якийсь інший тип регістру (наприклад в сегментний регістр), отож я його записав ax і bx
Я спробував зробити програму (шаблон взяв з вікіпедії) на MASM32
.code
main:
mov ax, dx
mov bx, dx
exit
end main
і в мене там ціла "дюжина" помилок А2013, А2043 (3 помилки) та інші.
Я також не розумію як відлагоджувати (подивитися чи дійсно dx переписався), в мене є x32dbg і OLLYDBG, я спробував відлагодити таку програму (звичайно я її не робив, бо ще не знаю як)
.386
.MODEL FLAT, STDCALL
WM_DESTROY equ 2
WM_CREATE equ 1
WM_LBUTTONDOWN equ 201h
WM_RBUTTONDOWN equ 204h
CS_VREDRAW equ 1h
CS_HREDRAW equ 2h
CS_GLOBALCLASS equ 4000h
WS_OVERLAPPEDWINDOW equ 000CF0000h
style equ CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
IDI_APPLICATION equ 32512
IDC_CROSS equ 32515
SW_SHOWNORMAL equ 1
EXTERN MessageBoxA@16:NEAR
EXTERN CreateWindowExA@48:NEAR
EXTERN DefWindowProcA@16:NEAR
EXTERN DispatchMessageA@4:NEAR
EXTERN ExitProcess@4:NEAR
EXTERN GetMessageA@16:NEAR
EXTERN GetModuleHandleA@4:NEAR
EXTERN LoadCursorA@8:NEAR
EXTERN LoadIconA@8:NEAR
EXTERN PostQuitMessage@4:NEAR
EXTERN RegisterClassA@4:NEAR
EXTERN ShowWindow@8:NEAR
EXTERN TranslateMessage@4:NEAR
EXTERN UpdateWindow@4:NEAR
includelib a:\masm32\lib\user32.lib
includelib a:\masm32\lib\kernel32.lib
MSGSTRUCT STRUC
MSHWND DD ?
MSMESSAGE DD ?
MSWPARAM DD ?
MSLPARAM DD ?
MSTIME DD ?
MSPT DD ?
MSGSTRUCT ENDS
WNDCLASS STRUC
CLSSTYLE DD ?
CLWNDPROC DD ?
CLSCEXTRA DD ?
CLWNDEXTRA DD ?
CLSHINSTANCE DD ?
CLSHICON DD ?
CLSHCURSOR DD ?
CLBKGROUND DD ?
CLMENUNAME DD ?
CLNAME DD ?
WNDCLASS ENDS
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
NEWHWND DD 0
MSG MSGSTRUCT <?>
WC WNDCLASS <?>
HINST DD 0
TITLENAME DB 'Simple Application', 0
CLASSNAME DB 'CLASS', 0
CAP DB 'Message', 0
MES1 DB 'Your push left button', 0
MES2 DB 'Exit', 0
MES3 DB 'E111xit', 0
_DATA ENDS
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START:
PUSH 0
CALL GetModuleHandleA@4
MOV [HINST], EAX
REG_CLASS:
MOV [WC.CLSSTYLE], style
MOV [WC.CLWNDPROC], OFFSET WNDPROC
MOV [WC.CLSCEXTRA], 0
MOV [WC.CLWNDEXTRA], 0
MOV EAX, [HINST]
MOV [WC.CLSHINSTANCE], EAX
PUSH IDI_APPLICATION
PUSH 0
CALL LoadIconA@8
MOV [WC.CLSHICON], EAX
PUSH IDC_CROSS
PUSH 0
CALL LoadCursorA@8
MOV [WC.CLSHCURSOR], EAX
MOV [WC.CLBKGROUND], 17
MOV DWORD PTR [WC.CLMENUNAME], 0
MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
PUSH OFFSET WC
CALL RegisterClassA@4
PUSH 0
PUSH 0
PUSH 400
PUSH 400
PUSH 100
PUSH 100
PUSH WS_OVERLAPPEDWINDOW
PUSH OFFSET TITLENAME
PUSH OFFSET CLASSNAME
PUSH 0
CALL CreateWindowExA@48
CMP EAX, 0
JZ _ERR
MOV [NEWHWND], EAX
PUSH SW_SHOWNORMAL
PUSH [NEWHWND]
CALL ShowWindow@8
PUSH [NEWHWND]
CALL UpdateWindow@4
MSG_LOOP:
PUSH 0
PUSH 0
PUSH 0
PUSH OFFSET MSG
CALL GetMessageA@16
CMP EAX, 0
JE END_LOOP
PUSH OFFSET MSG
CALL TranslateMessage@4
PUSH OFFSET MSG
CALL DispatchMessageA@4
JMP MSG_LOOP
END_LOOP:
PUSH [MSG.MSWPARAM]
CALL ExitProcess@4
_ERR:
JMP END_LOOP
WNDPROC PROC
PUSH EBP
MOV EBP, ESP
PUSH EBX
PUSH ESI
PUSH EDI
CMP DWORD PTR[EBP+0CH], WM_DESTROY
JE WMDESTROY
CMP DWORD PTR[EBP+0CH], WM_CREATE
JE WMCREATE
CMP DWORD PTR[EBP+0CH], WM_RBUTTONDOWN
JE LBUTTON
CMP DWORD PTR[EBP+0CH], WM_LBUTTONDOWN
JE RBUTTON
JMP DEFWNDPROC
RBUTTON:
JMP WMDESTROY
LBUTTON:
PUSH 0
PUSH OFFSET CAP
PUSH OFFSET MES3
CALL MessageBoxA@16;<-
PUSH 0
PUSH OFFSET CAP
PUSH OFFSET MES1
PUSH DWORD PTR [EBP+08h]
CALL MessageBoxA@16
MOV EAX, 0
JMP FINISH
WMCREATE:
MOV EAX, 0
JMP FINISH
DEFWNDPROC:
PUSH DWORD PTR[EBP+14H]
PUSH DWORD PTR[EBP+10H]
PUSH DWORD PTR[EBP+0CH]
PUSH DWORD PTR[EBP+08H]
CALL DefWindowProcA@16
JMP FINISH
WMDESTROY:
PUSH 0
PUSH OFFSET CAP
PUSH OFFSET MES2
PUSH DWORD PTR[EBP+08H]
CALL MessageBoxA@16
PUSH 0
CALL PostQuitMessage@4
MOV EAX, 0
FINISH:
POP EDI
POP ESI
POP EBX
POP EBP
RET 16
WNDPROC ENDP
_TEXT ENDS
END START
ну і побачив зовсім іншу картину в x32dbg, я так розумію що MASM це high-level assembler, а те що в x32dbg це звичайній асемблер, чи ні ?
Я не знаю з чого почати, якщо я не знаю дизасемблера (x32dbg) - то я не можу бачити що робить моя програма, якщо я не знаю синтаксису - я взагалі не можу писати програми, так з чого ж почати вивчення ?