Введення в мову асемблера, assembler, статті, програмування - програмування c, delphi, c #

Що таке Асемблер

Асемблер - низькорівневий мову програмування. Для кожного процесора існує свій асемблер. Програмуючи на асемблері ви безпосередньо працюєте з апаратурою комп'ютера. Оригінальний текст на мові асемблера складається з команд (мнемонік), які після компіляції перетворюються в коди команд процесора.

Розробка програм на асемблері - дуже важка штука. Натомість витраченого часу ви отримуєте ефективну програму. Програми на асемблері пишуть, коли важливий кожен такт процесора. На асемблері ви даєте конкретні команди процесора і ніякого зайвого сміття. Цим і досягається висока швидкість виконання вашої програми.

Щоб грамотно використовувати асемблер необхідно знати програмну модель мікропроцесорної системи. З точки зору програміста мікропроцесорна система складається з:

  1. мікропроцесора
  2. пам'яті
  3. Пристроїв введення / виводу.

Програмна модель добре описана в літературі [1].

синтаксис Ассемблера

Загальний формат рядка програми на асемблері

Поле мітки. Мітка може складатися з символів і знаків підкреслення. Мітки використовуються в операціях умовного і безумовного переходу.

Поле оператора. У цьому полі міститься мнемоніка команди. Наприклад мнемоніка mov

Поле операндів. Операнди можуть бути присутніми тільки якщо присутній Оператор (поле оператора). Операндів може не бути, а може бути кілька. Операндами можуть бути дані, над якими необхідно виконати якісь дії (переслати, скласти і т.д.).

Перша програма на мові Асемблера

У цій статті буде використовуватися асемблер для i80x86 процесора і використовуватися такі програми та

Якщо бути конкретним, то Tasm 2.0.

За традицією наша перша програма буде виводити рядок "Hello world!" на екран.

Як ви могли помітити, що програма розділена на сегменти: сегмент даних, сегмент коду і є ще стековий сегмент.

Розглянемо все по порядку.

Директива .model small задає модель пам'яті. Модель small - це 1 сегмент для коду, 1 сегмент для даних і стека тобто дані і стек знаходяться в одному сегменті. Бувають і інші моделі пам'яті, наприклад: tiny, medium, compact. Залежно від обраної вами моделі пам'яті сегменти вашої програми можуть перекриватися або можуть мати окремі сегменти в пам'яті.

Директива .stack 100h задає розмір стека. Стек необхідний для збереження деякою інформацією з подальшим її відновленням. Зокрема стек використовується при переривання. У цьому випадку вміст регістра прапорів FLAGS, регістра CS і регістра IP зберігаються в стеці. Далі йде виконання перериває програми, а потім йде відновлення значень цих регістрів.

Більш докладний опис виходить за рамки простої статті.

Директива .data визначає початок сегмента даних вашої програми. У сегменті даних визначаються "змінні" тобто йде резервування пам'яті під необхідні дані. Після .data йде рядок
HelloMsg DB "Hello World!", 13,10, "$"

Директива .code визначає початок сегмента коду (CS - Code Segment) програми. Далі йдуть рядки програми містять мнемоніки команд.

Розповім про команду mov.

mov <приёмник>, <источник>

Команда mov - команда пересилання. Вона пересилає вміст джерела в приймач. Пересилання можуть бути регістр-регістр, регістр-пам'ять, пам'ять-регістр, а ось пересилання пам'ять-пам'ять немає тобто все проходить через регістри процесора.

а потім пересилаємо вміст регістра AX в регістр DS.

mov ah, 09h
mov dx, offset HelloMsg
int 21h

Тут ми в регістр AH записуємо число 09h - номер функції 21-го переривання, яка виводить рядок на екран.

У вас напевно виникне питання: А чому ми записуємо номер функції 09h в регістр AH. І чому зміщення до рядка записуємо в регістр DX?
Відповідь проста: для кожної функції визначені конкретні регістри, які містять вхідні дані для цієї функції. Подивитися які регістри потрібні конкретних функцій ви можете в Help'е.

mov ax, 4C00h
int 21h

mov ax, 4C00h - пересилаємо номер функції в регістр AX. Функція 4C00h - вихід з програми.

int 21h - виконуємо переривання (власне виходимо)

end - кінець програми.

Після директиви end компілятор все ігнорує, тому можете там писати все, що завгодно :)

Якщо ви дочитали до кінця, то ви герой!

рекомендована література