Синтаксис ассемблера intel
.pdfПроцессор.
Что такое процессор? Процессор - это «мозг» компьютера. Процессором называется устройство, способное превращать входную информацию (входное слово) в выходную (выходное слово) согласно алгоритму, записанному в программном коде.
Конструктивно процессоры могут выполниться как в виде одной большой монокристальной интегральной микросхемы — чипа, так и в виде нескольких микросхем, блоков электронных плат и устройств.
Персональный компьютер содержит в своем составе довольно много различных процессоров.
Однако архитектуру и конструктивное исполнение персонального компьютера определяет процессор или процессоры, контролирующие и обслуживающие системную шину, и оперативную память, а также, что более важно, выполняющие объектный код программ. Такие процессоры принято называть центральными или главными процессорами (Central Point Unit — CPU). На основе архитектуры центральных процессоров строится архитектура материнских плат и проектируется архитектура и конструкция компьютера.
Язык процессора.
Родной язык процессора – машинные команды. Способ представления программы "понятный" процессору ЭВМ называется языком машинных команд. Машинная команда должна содержать в себе ответы на следующие вопросы:
•какую операцию выполнить?
•где находятся операнды?
•куда поместить результат операции?
Операндами называют данные, с которыми производится операция. В арифметических операциях это слагаемые, сомножители, уменьшаемое и вычитаемое, делимое и делитель.
Машинная команда – это описание элементарной операции, которую должен выполнить компьютер. Команды хранятся в ячейках памяти в двоичном коде.
Каждая модель процессора, в принципе, имеет свой набор команд и соответствующий ему язык (или диалект) ассемблера.
Assembler — язык программирования.
Assembler — язык программирования низкого уровня, представляющий собой формат записи машинных команд, удобный для восприятия человеком.
Команды языка ассемблера один в один соответствуют командам процессора и, фактически, представляют собой удобную символьную форму записи (мнемокод) команд и их аргументов.
Достоинства языка ассемблера:
Максимально оптимальное использование средств процессора, использование меньшего количества команд и обращений в память, и как следствие — большая скорость и меньший размер программы. Максимальная «подгонка» для нужной платформы.
Недостатки:
Большие объемы текста кода, большое число дополнительных мелких задач. Трудоёмкость чтения и поиска ошибок (хотя здесь многое зависит от комментариев и стиля программирования).
Синтаксис ассемблера intel.
Общепринятого стандарта для синтаксиса языков ассемблера не существует. Однако, существуют стандарты де-факто — традиционные подходы, которых придерживаются большинство разработчиков языков ассемблера. Основными такими стандартами являются Intel-синтаксис и AT&T-синтаксис. Общий формат записи инструкций (команд) одинаков для обоих стандартов.
Intel-синтаксис — один из форматов записи мнемоники инструкций процессора, который используется в документации Intel в ассемблерах для MS-DOS и Windows (MASM, TASM, встроенный ассемблер Visual Studio, и т.д.).
Особенности Intel-синтаксиса:
1. В команде приёмник находится слева от источника (например: mov eax,ebx, где mov-это команда, а eax и ebx операнды этой команды, один из них eax-приемник, ebx-источник).
2. Название регистров зарезервировано (нельзя использовать метки с именами eax, ebx и т. д.) Например, код mov eax, ebx пересылает в регистр eax значение, содержащееся в ebx, что функционально эквивалентно следующему коду:
push ebx ; положить в стек значение ebx
pop eax ; записать значение из стека в eax
Каждая инструкция записывается в отдельной строке. [метка:] мнемокод [операнды] [;комментарий]
Мнемокод (или опкод –операции код), непосредственно мнемоника инструкции процессора. К ней могут быть добавлены префиксы (повторения, изменения типа адресации и пр.). В качестве операндов могут выступать константы, названия регистров, адреса в оперативной памяти и пр..
Мнемоника - (совокупность специальных приёмов и способов, облегчающих запоминание нужной информации, в данном случае двоичный код инструкции заменяется символьным обозначением, например двоичный код инструкции сложения значений находящихся в регистрах eax и ebx - 0000000111011000 (01D8 в шестнадцатеричном виде), а мнемокод - add eax,ebx).
Полный формат каждой строки инструкций следующий: label: code ; comment
где label - название метки; code - собственно, инструкция языка ассемблера; comment - комментарий,
например: summa: add eax,ebx ; сумма значений регистров (summa –метка; add eax,ebx -
инструкция; сумма значений регистров - комментарий).
При этом один или два компонента строки могут отсутствовать, то есть строка может состоять, к примеру, только из комментария, или содержать только метку или инструкцию.
Объекты, над которыми производятся действия, это регистры процессора и участки оперативной памяти. Обозначения для них также являются частью синтаксиса.
Ассемблерная инструкция, состоит из мнемоники команды и списка аргументов через запятую (один, два или три в зависимости от инструкции).
Мнемоникой команды служит трёхили четырёхбуквенными сокращениями их аналогов, обычно на английском языке, например:
jmp — продолжать выполнение с нового адреса памяти (от англ. jump - прыжок) mov — переместить данные (от англ. move - передвинуть)
sub — получить разность двух значений (от англ. subtract - вычесть)
xchg — обменять значения в регистрах/ячейках памяти (от англ. exchange - обмен)
Текст программ может быть дополнен директивами ассемблера (параметры, влияющие на процесс
ассемблирования и свойства выходного файла).
Для упрощения и ускорения написания программ на языке ассемблера служат макросы.
Допустимыми символами при написании текста программ являются:
1.все латинские буквы: A—Z, a—z. При этом заглавные и строчные буквы считаются эквивалентными;
2.цифры от 0 до 9;
3.знаки ?, @, $, _, &;
4.разделители , . [ ] ( ) < > { } + / * % ! ' " ? \ = # ^.
Лексемы.
Предложения ассемблера формируются из лексем, представляющих собой синтаксически неразделимые последовательности допустимых символов языка, имеющие смысл для транслятора.
Лексемами являются:
-идентификаторы — последовательности допустимых символов, использующиеся для обозначения таких объектов программы, как коды операций, имена переменных и названия меток. Правило записи идентификаторов заключается в следующем: идентификатор может состоять из одного или нескольких символов. В качестве символов можно использовать буквы латинского алфавита, цифры и некоторые специальные знаки — _, ?, $, @. Идентификатор не может начинаться символом цифры. Длина идентификатора может быть до 255 символов, хотя транслятор воспринимает лишь первые 32, а остальные игнорирует.
-цепочки символов — последовательности символов, заключенные в одинарные или двойные кавычки;
-целые числа в одной из следующих систем счисления: двоичной, десятичной, шестнадцатеричной.
Отождествление чисел при записи их в программах на ассемблере производится по
определенным правилам:
Десятичные числа не требуют для своего отождествления указания каких-либо дополнительных символов, например 25 или 139.
Для отождествления в исходном тексте программы двоичных чисел необходимо после записи нулей и единиц, входящих в их состав, поставить латинское “b”, например 10010101b.
Шестнадцатеричные числа состоят из цифр 0...9, строчных и прописных букв латинского алфавита a, b, c, d, e, f или A, B, C, D, E, F, Если шестнадцатеричное число начинается с буквы, то перед ним записывается ведущий ноль, а в конце числа латинское ‘h’, например: 0ef15h.
Операнды.
Практически каждое предложение (т.е. инструкция представляющая строку кода программы) содержит описание объекта, над которым или при помощи которого выполняется некоторое действие. Эти объекты называются операндами. В качестве операндов могут выступать числа, регистры, ячейки памяти, символьные идентификаторы.
Операторы ассемблера и синтаксические правила формирования выражений ассемблера.
Возможные типы операторов ассемблера:
• Арифметические операторы o унарные “+” и “–”;
o бинарные “+” и “–”; o умножения “*”;
o целочисленного деления “/”;
oполучения остатка от деления “mod”.
•Операторы сдвига
•Операторы сравнения
•Логические операторы
•Индексный оператор
•Оператор переопределения типа
•Оператор именования типа структуры
•Оператор получения смещения выражения
Директивы.
Директивы в ассемблере позволяют правильно оформить последовательность команд, чтобы транслятор мог их обработать, а микропроцессор — выполнить.
Команды Ассемблера.
aaa , aad , aam, aas , adc, add, and, bound, bsf, bsr, bswap, bt, btc, btr, bts, call, cbw, cwde, clc, cld, cli, cmc, cmp, cmps/cmpsb/cmpsw/cmpsd, cmpxchg, cwd, cdq, daa, das, dec, div, enter, hlt, idiv, imul, in, inc, ins/insb/insw/insd, int, into, iret/iretd, jcc, jcxz, jecxz, jmp, lahf, lds, les, lfs, lgs, lss, lea, leave, lgdt, lidt, lods/lodsb/lodsw/lodsd, loop loope, loopz, loopne, loopnz, mov, movs/movsb/movsw/movsd, movsx, movzx, mul, neg, nop, not, or, out, outs, pop, popa, popad, popf, popfd, push, pusha, pushad, pushf, pushfd, rcl, rcr, rep/repe/repz/repne/repnz, ret/retf, rol, ror, sahf, sal, sar, sbb, scas/scasb/scasw/scasd, setcc, sgdt, sidt, shl, shld, shr, shrd, stc, std, sti, stos/stosb/stosw/stosd, sub, test, xadd, xchg, xlat/xlatb , xor…
Типы данных.
Байт, слово (2 байта), двойное слово (4 байта), учетверенное слово (8 байт).
Директивы резервирования и инициализации данных: db, dw, dd, dq, dt.
Подготовка программы на MASM32. Упражнение 1
1.Запустите программу MASM32.
2.Напечатайте в окне текст вашей программы
3.Сохраните текст программы с именем additive_reg.asm
4.Ассемблируйте программу через меню Projekt-Console link OBJ File нажмите Enter
5.Линкуйте программу через меню Projekt-Assemble & Link нажмите Enter
6.Запустите программу через меню Projekt-Run Program нажмите Enter
7.Если выводятся сообщения об ошибках исправляйте, сохраняйте исправленный файл
через меню File Save и повторяйте с шага 4
TITLE Шаблон программ на MASM32 ;заголовок - необязательная строка
;Программа выводит консольное окно - это комментарий к программе, вводится после знака ';' comment * длинный ккомментарий, им можно закомментировать
всю или часть программы *
.386 |
; 32-битный режим, можно 486, 586, 686 |
;.model flat, stdcall |
; модель памяти сплошная с вызовом функций API |
option casemap :none |
; не различение прописных и строчных символов |
; подключение библиотек, необходимых для программы include с:\masm32\include\masm32rt.inc
; раздел, где объявляются все константы
.const
;раздел, где объявляются переменные, уже имеющие какое-то значение
.data
; раздел, где объявляются переменные, еще не имеющие значения
.data?
; раздел кода программы
.code
start: |
; с этого слова (метки) начинается код программы |
invoke ExitProcess,0 |
|
end start |
; с этого слова заканчивается код программы |
;Пример с использованием Debug Window MASM32
Упражнение 2. Арифметические команды
.386
;.model flat, stdcall option casemap :none
include <\masm32\include\masm32rt.inc> include <\masm32\include\debug.inc> includelib <\masm32\lib\debug.lib>
.data
.code
start:
;сообщение в консоли ассемблирования:
;текстовое сообщение и разделительная черта:
PrintText "Арифметические операци на языке ассемблер"
PrintLine
mov eax, 123 ;помещаем в регистр EAX десятичное чмсло 123 mov ebx, 321 ; в EBX 321
PrintDec eax,"Начальное значение" ;выводим значение регистра EAX add eax,ebx ;складываем EAX=EAX+EBX
PrintDec eax,"Сумма EAX=EAX+EBX" ;выводим значение регистра EAX PrintDec ebx, "Начальное значение" ;выводим значение регистра EBX
invoke crt_exit
end start
Упражнение 3.
1)Поместите в EAX двоичное число 101b, в EBX 111b. Посмотрите результат.
2)В EAX 123h, в EBX 987h. Посмотрите результат.
3)В EAX 123d, в EBX 321d. Посмотрите результат
4)В EAX 123o, в EBX 754o. Посмотрите результат
Упражнение 4.
Выполните операции sub eax,ebx; mul ebx; div ebx