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

Подякували: Monolith, leofun012

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 файл

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

4

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

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

Подякували: reverse2500, Betterthanyou, ostap34PHP, leofun014

5

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

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

Подякували: Betterthanyou, ostap34PHP, leofun013

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\, Chemist-i4

7

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

Чи є який безкоштовний компілятор для арм 64?
Як вважаєте, де більше прикладної математики, у низькорівневому програмуванні чи у високорівневому?

8 Востаннє редагувалося reverse2500 (14.05.2021 20:07:45)

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

htoznasho написав:

Чи є який безкоштовний компілятор для арм 64?

GCC + binutils наше все

htoznasho написав:

Як вважаєте, де більше прикладної математики, у низькорівневому програмуванні чи у високорівневому?

так, там елементарні операції , вищу математику вже треба коли криптографія, і обов'язково розібратись з алгоритмами іноді там теж важливо думати логічно, тактично чи стратегічно і можуть вирішувати все формули

Подякували: ch0r_t, htoznasho, leofun013

9

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

Якщо є код на фортрані, який виконує обчислення за декілька годин, то наскільки швидше він буде працювати, якщо його переписати мовою асемблера?
Чи є в мові асемблера вже готові математичні функції?

10

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

reverse2500 написав:
htoznasho написав:

Чи є який безкоштовний компілятор для арм 64?

GCC + binutils

а для віндовс щось є?

11

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

htoznasho написав:
reverse2500 написав:
htoznasho написав:

Чи є який безкоштовний компілятор для арм 64?

GCC + binutils

а для віндовс щось є?

Та хоч під 32-бітний, хоч під 64-бітний, з генерацією хоч для embedded (Coretx-M/R/A), хоч для лінукс (Cortex-A)
Для забанених у пошуковиках:
https://developer.arm.com/tools-and-sof … -toolchain

Подякували: htoznasho, leofun012

12

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

htoznasho написав:

Якщо є код на фортрані, який виконує обчислення за декілька годин, то наскільки швидше він буде працювати, якщо його переписати мовою асемблера?
Чи є в мові асемблера вже готові математичні функції?

— час написання та відлагодження відсуне запуск програми так далеко, що час її виконання вже не буде важливим
— нема
Бонус-відповідь на незадане запитання:
— дуже ймовірно, що переписування на C чи C++ лише уповільнить роботу. LAPAK он що до C чи C++, що до python підключать фортранівську бібліотеку.

Подякували: ch0r_t, leofun012

13 Востаннє редагувалося ch0r_t (15.05.2021 22:25:11)

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

Fortran не на стільки вже повільніший за C. https://benchmarksgame-team.pages.debia … rtran.html
    І хто сказав що просто переписавши(навіть не враховуючи той час який це забере) щось на Ассемблер воно буде гарантовано швидше, - для того потрібен досвід щоб описати на нім все як слід. На асм. теж можна нагородити равликів з гидкими слимаками. Не думайте що ви (чи я, чи інший випадковий чоловік) розумніші за всіх тих людей що створювали компілятори для C\C++\Fortran - скоріше за все компілятор згенерує куди оптимальніший код за малодосвідченого програміста на Асм.

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

14

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

С це милиці з 40 річною витримкою. Я сам пишу здебільшого на С, але ця мова програє асемблерові в найпростіших речах. Візьмемо складання доданків з переповненням.

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

15

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

0xDADA11C7 написав:

С це милиці з 40 річною витримкою.

50

Втім, це непогано припасовані милиці, які виграють у багатьох інвалідних колясок :-)

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

16

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

стандарти С є 11 року, вони і розвиваються зараз

17

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

Як саме працює монітор пк або смартфона? Можливо, обчислюється як матриця? Піксель як елемент матриці. Але це ж гігінтська матриця, але обчислюється так швидко, що й не помічаєш. Якщо це так, то алгоритм обчислення реалізується на якій мові? Невже  задача обчислення стану динамічної системи складніша ніж миттєве обчислення матриці 2000*1000?

18

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

то все математика

19

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

навіщо взагалі вивчати асемблер?

20

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

треба, той хто пишу ігри
Розробник бібліотек, навіть деякі компоненти ядра пишуться на ассемблері, особливо самий низький рівень. Це вважається завжди оплачуваною роботою

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