November 6, 2023

Мій перший досвід в Assembler

Уся сказана інформація в цьому пості суто моя особиста думка і знання, тому не варто писати злі коменти на кшталт "Ой фууу, ти нічого не знаєш". Дякую за розуміння!

Взагалі що це таке?

Мова Assembler - це така сама мова програмування як і інші (Python, C#, Java, C++ тощо), АЛЕ це низькорівнева мова. Це означає що коли ти пишеш код на Assembler, то ти напряму спілкуєшся з регістрами, стеком тощо. А ось наприклад на Python цього нема. Також Assembler це мова де нема нічого... Ні функцій, ні циклів, нічого і це повинен робити ТИ САМ.

Навіщо вона взагалі потрібна?

Взагалі зараз мало або майже ніхто на ній не пише і можна запитати, а навіщо вчити тоді? Ну взагалі є думка, що якщо ти знаєш Assembler, то ти знаєш як працює твій код на високорівневій мові та як взагалі працює твій ПК. Не зважаючи на те, що вона має різний код (в залежності від процесора), на цій мові можна і треба писати ті речі які на високорівневій мові будуть важко, наприклад: ядро ОС, драйвера, віруси. Також відомо, що Assembler-ий код найшвидший але при умові, що ти цей код написав як треба). В наші часи компілятори оптимізують код дуже добре але тут також якщо буде якась помилка при компіляції, то ти із знаннями Assembler-а це легко пофіксиш. Ще одна причина вчити Assembler, якщо ти хочеш займатися Дизасомбліацією. Це цікава справа але там зазвичай ти більше читаєш код Assembler, ніж пишеш його.


Мої враження при написанні перших строк коду на Assembler

Нууу... Якщо в двух словах, то це досить важко :). Якщо в Python для виведення Hello world в консоль, то треба написати просто:

python('Hello world')

А ось для MS-DOS з процесором 8088 потрібно було написати цей код:

        org     0x100
@@start:
        mov     bx, string
@@repeat:
	    mov     al, [bx]
        cmp     al, 0
        je	    @@end
        push    bx
        mov     ah, 0x0E
        mov     bx, 0x000F
        int     0x10
        pop     bx
        inc     bx
        jmp     @@repeat
@@end:
      	int     0x20
string:
       	db	"Hello world", 0        

Потім скачати Nasm (є інші, але я вибрав цей) для компіляції в файл для MS-DOS командою:

nasm -f bin file.asm -o file.com

"file" - це назва файлу, може бути різна. Потім запустити цей файл через MS-DOS. І після цього вже буде в консолі Hello world. Ось в чому різниця між Assembler та Python :)

Які в мене були проблеми та як я вирішив?

Я використовував для цих маніпуляцій ОС Linux Fedora 38. Для початку мені потрібно було завантажити Nasm через dnf та архівом щоб я міг цей архів закинути в Dosbox. Вся проблема в тому, що версій багато, а яку версію брати? Ніде я це не знайшов, тому брав навмання та перевіряв. Потім я через 100 і 1 спробу зміг скомпілювати код Assembler в .com для MS-DOS. Чому так багато? Тому що я незнав як і намагався розібратися. Потім треба було якось змонтувати диск з Nasm в Dosbox. Що я робив? Також просто брав і пробував... Я вирішував всі проблеми спробами і це те що я хотів передати в цьому абзаці). Якщо я б просто подивився в Ютубі як треба це робити, перекопіював і в мене не було б розуміння навіщо це зробив там і там (код я копіював тому, що я взагалі незнаю коду цієї мови). В мене було багато спроб які закінчувалися невдачами але що я зробив? Не здався і пробував ще і ще... І в мене все виходило, тому і у вас все вийде!!

Ті хто дочитав до кінця дякую велике дякую! Це досить важка тема для всіх особливо якщо не працював з кодом високорівневої мови але це тільки мій погляд та як я це робив все і може когось змотивував хочш трохи вивчити цю мову або дав нові знання :) Буду дуже радий підпискою та якимось фідбеком на каналі: https://t.me/turtle_hack