Тема: З чого почати вчити 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) - то я не можу бачити що робить моя програма, якщо я не знаю синтаксису - я взагалі не можу писати програми, так з чого ж почати вивчення ?

Подякували: Monolith1

2

Re: З чого почати вчити assembler

Вивчая ассемблер не хапайся відразу за Window Application.
Пиши консольні програми, та трассуй їх.
Щодо дебагеру рекомендую Олю, сам на неї працюю довго.

Подякували: ostap34PHP, varkon, Betterthanyou3

3

Re: З чого почати вчити assembler

Любите ускладнювати собі життя? :)
Асемблер така штука, що ніби вчиш, знаєш, а тут хоба! і не знаєш що робиться. Вчив раніше асемблер, зараз забув трохи, так як ніде не використовую. Але для розминки мізків і кращого розуміння архітектури, структури комп'ютера, а також комп'ютерної логіки, можна трохи позайматися цим мазохізмом. Не великий спеціаліст асм (взагалі маленький), але мені здається ви вибрали трохи складну літературу. У свій час вчив по цих книгах, тому можу вам порекомендувати. На російській правда, у той час на англійській не міг читати, але якщо хочете, можете пошукати в неті англійські версії.Читається норм:
Peter Abel. Assembler and programming for the IBM PC.pdf
Rudolf Marek Assembler for Example.pdf
Писати програми можна за допомогою системи Turbo Assembler TASM.rar (скачати) і відлагоджувати Turbo Debug (TD.exe в архіві). (і якщо у вас Windows 10 то можуть виникнути проблеми з запуском)
Трохи інструкції:
• Для того, щоб скомпілювати програму виконайте наступні команди в cmd:

tasm fіlename.asm  <Enter>

• Результат - файл fіlename.obj. Необов'язкові параметри /l або /la призводять до додаткової генерації файлу fіlename.lst, що містить лістинг асемблювання програми.

tlіnk fіlename.obj  <Enter>

• Результат - файл fіlename.exe, що вже можна запускати.
• Відлагодження - покроково виконати в Turbo Debug створений вище .exe файл

Ну і краще читати поступово подані вище книги, спочатку Абеля, а потім Марека.

Because tomorrow may be gone.

4

Re: З чого почати вчити assembler

Починайте кодити в ДОС'і, розберіться з режимами роботи процесорів інтель, читайте довідники від інтеля, а "українців" не читайте. Ваш перший підручник пише про DOS в 16-бітному(реальному) режимі, тому у вас в голові мішанка і нічого не виходить.

Говорила баба діду: «Я поїду к Білодіду, Ізучу двомовну мову І вернусь обратно знову». А дід бабі: «Не *изди, К Білодіду нєт їзди, — Туди не ходять поїзди»
Подякували: reverse2500, Betterthanyou, ostap34PHP3

5

Re: З чого почати вчити assembler

для мене ассемблер розділений на декілька частин:
1. Архітектура, бо не просто пишеться .386 , .486 ...
2. ОС, кожен код і можливості завязані під ОС,
3. Сам компілятор ассемблер, NASM, YASM, FASM, MASM32 синтаксис і можливості свої

- Поганому трояну фаєрвол заважає
- Ніколи не програмуйте та не пийте пиво
Якщо ви з першого разу написали програму, в якій немає жодної помилки, повідомте про це системного програмісту: він виправить помилки в компіляторі
Подякували: Betterthanyou, ostap34PHP2

6

Re: З чого почати вчити assembler

Знайшов такий емулятор emu8086
він зразу з відладчиком, думаю для початку вивчення асемблера він мені підійде
http://d2.alternativeto.net/dist/s/8282e273-de31-e011-a433-0200d897d049_4_full.gif?format=jpg&amp;width=1600&amp;height=1600&amp;mode=min&amp;upscale=false

Подякували: 0xDADA11C7, ostap34PHP, /KIT\3