Программирование на Ассемблере. Обучающие уроки
http://life-prog.ru/view_cat.php?cat=3
Язык Ассемблер (Assembler) - это низкоуровневый язык программирования. Он хоть и сложный, но написанные на нем программы работают быстрее, чем на Паскале и на Си. Хотя Си старается оптимизировать скорость выполнения программ, но она никогда не обгонит ассемблер. Достоинства языка состоят в том, что программист может написать более высокоскоростную программу, чем на других языках высокого уровня. Также Ассемблер используется для написания прошивок на BIOS, а также возможет непосредственный доступ к регистрам процессора, и к портам компьютера. В данном обучающем курсе приведены написания программ, или другими словами ассемблер на примерах, а также ассемблер под windows.
Написанная информация была с использованием книги: Рисований О.М. Системне програмування: Підручник. – Х.: НТУ “ХПІ”, 2010. – 912 с.
Введение в Ассемблер
Для того, чтобы программировать на Assembler, необходимо:
Программа MASM_v9.0 или MASM_v10.0 Отладчик, например: OLLYDBG.EXE В установленном месте, где находится программа MASM, создаете файл: aaa.bat
Я выбрал такое название (aaa.bat) для того, чтобы она была в самом верху. И вы могли всегда его видеть. В этом aaa.bat вносите такую информацию:
ml /c /coff "work.asm" link /SUBSYSTEM:CONSOLE "work.obj"
work.asm - это имя программы, которую нужно компилировать. После ввода этой информации и сохранения можно приступать к программированию.
Ассемблер имеет:
- директиву определения типа микропроцессора, - метку начала программы, - тело программы, -метку окончания программы
В языке Ассемблер есть переменые разных типов: знаковые и беззнаковые форматы типов Shortlnt (signed char), Byte (unsigned char), Integer (int), Word (unsigned int) и т. д.
Напишем программу вычисления выражения: a – e/b – de, где:
a = 5; b = 27; c = 86; е = 1986; d = 1112;
и сохраним ее там же, где и aaa.bat: work.asm. Если мы хотил откомпилировать другую программу, то нужно в aaa.bat изменить имя файлов, т. е. вместо work заменить на ... имя. И сохранить его. Если программа не содержит синтаксические ошибки, то должен получиться файл с расширением exe.
Программа:
.686 ; директива определения типа микропроцессора .model flat,stdcall ; задание линейной модели памяти ; но соглашения ОС Windows
.data ; директива определения данных _a dw 5 ; запись в 16-разрядный амбарчик памяти с именем _а числа 5 _b dw 27 ; запись _b = 16h _c dw 86 ; запись _c = 56h _e dw 1986 ; запись _e = 7c2h _d dw 1112 ; запись _d = 458 res dw 0 ; резервирование памяти для сохранения переменной res
.code ; директива начала сегмента команд start: mov edx,0 ; очистка регистров mov ebx,0 mov ecx,0 mov ах,_e ; в регистр ах заносим число _e = 7c2h mul _d ; умножаем _e на _d SHL edx,16 ; делаем здвиг на 16 mov dx,ax push edx ; бросаем значение в стек mov edx,0 mov ах,_e mov cx,_b div cx ; делим ах на cx pop ecx ; достаем из стека значене sub ecx,eax ; отнимает mov ах,_a sub eax,ecx mov res, eax ret ; возвращение управления ОС end start ; окончание программы с именем _start
Результат работы программы:
как мы видим, комментарии ставятся после точки с запятой.
mov куда, откуда - это команда перевылки
mul _d - это команда умнжения регистра ax на _d. Результат попадает в ax
shl edx,16 - команда здвига на 16 разрядов
div cx - команда деления ах на cx. Результат попадает в ax
pop ecx - команда достает из стека значене
sub ecx,eax - команда отнимает значение ecx - eax. Результат попадает в ecx