Upload
others
View
11
Download
1
Embed Size (px)
Citation preview
Ассемблер
Ассемблер – язык программирования
Ассемблер – компилятор
Язык Ассемблера
Символическое представление машинного языка
Язык ассемблера для каждого типа компьютера свой
Литература
1. Рудаков П.И., Финогенов К.Г. Язык ассемблера: уроки программирования. – М.: ДИАЛОГ-МИФИ, 2001. – 640 с.
2. Голубь Н.Г. Искусство программирования на Ассемблере. Лекции и упражнения. – СПб.: ДиаСофтЮП, 2002. – 656 с.
3. The Netwide Assembler: NASM http://www.nasm.us/doc/nasmdoc0.html
4. NASM — Netwide Assembler http://acm.mipt.ru/twiki/bin/view/Asm/NasmIntro
5. Sample NASM programshttp://www.csee.umbc.edu/portal/help/nasm/sample.shtml
Пример программы (TASM)
db ‘Hello!$’
Подготовка программы к выполнению
Пример программы (NASM)
SECTION .text
global _start ; Точка входа программы
_start: mov eax, 4 ; Системный вызов ‘write’
mov ebx, 1 ; Дескриптор 1 (stdout)
mov ecx, msg ; Данные
mov edx, len ; Размер данных
int 0x80 ; Обращение к ядру
mov eax, 1 ; Системный вызов ‘_exit’
mov ebx, 0 ; Код завершения 0 (success)
int 0x80 ; Обращение к ядру
SECTION .data
msg db "Hello!",0xA ; Строка
len equ $ - msg ; Размер строки
SECTION .bss ; Сегмент стека
mem resb 256
Подготовка программы к выполнению
nasm -f <format> <filename> [-o <output>]
Примеры:
nasm -f elf myfile.asm
nasm -f bin myfile.asm -o myfile.com
Получение справки по команде nasm:
nasm –h
Определение типа системы Linux:
file nasm
Определение типа Linux
nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1
ELF (-f elf)
nasm: Linux/i386 demand-paged executable (QMAGIC)
a.out (-f aout)
Компиляция и линковка
1) nasm -f elf hello.asm # Создание объектного файла
2) ld -o hello hello.o # Создание исполняемого файла
Структура команды Ассемблера
метка: инструкция/директива
операнды ; комментарий
_start: mov eax, 4 ; Системный вызов ‘write’
begin: mov AX, data
mov ebx, 1
msg db "Hello,
world!",
0xA
Директивы АссемблераTASM/MASM NASM Назначение
SEGMENT SECTION Указывает, в какую секцию выходного файла будет ассемблирован код
GLOBAL Экспорт символов в другие модули
DB DB Define Byte (8 бит)
DW DW Define Word (16 бит)
DD DD Define Double Word (32 бита)
DQ DQ Define Quarter Word (64 бита)
DT DT Define Ten Bytes (80 бит)
ASSUME Установка сегментных регистров
EQU EQU Определение констант
DUP TIMES Повторение инструкций или данных
RESB(RESW, RESD, RESQ, REST)
Объявление неинициализированного пространства для хранения данных
Примеры (TASM)
Примеры (NASM)
char char1 = 'a';
char str1[] = “string“;
int int1 = 1234567;
int hex1 = 0x6789ABCD;
float flt1 = 5.327e-30;
double flt2 = -123.4e300;
char1: db 'a'
str1: db "string",0
int1: dd 1234567
hex1: dd 0x6789ABCD
flt1: dd 5.327e-30
flt2: dq -123.4e300
Функциональная структура ЭВМ
Регистры процессора
Регистры общего назначения
Регистры общего назначения
eax/ax/ah/al (Accumulator register) — аккумулятор. Применяется для хранения промежуточных данных. В некоторых командах использование этого регистра обязательно;
ebx/bx/bh/bl (Base register) — базовый регистр. Применяется для хранения базового адреса некоторого объекта в памяти;
ecx/cx/ch/cl (Count register) — регистр-счетчик. Применяется в командах, производящих некоторые повторяющиеся действия. Его использование зачастую неявно и скрыто в алгоритме работы соответствующей команды.
edx/dx/dh/dl (Data register) — регистр данных. Так же, как и регистр eax/ax/ah/al, он хранит промежуточные данные. В некоторых командах его использование обязательно; для некоторых команд это происходит неявно.
Предназначены для хранения индексов при работе с массивами
esi/si (Source Index register) — индекс источника
edi/di (Destination Index register) — индекс приемника (получателя)
Индексные регистры
Регистры-указатели
esp/sp (Stack Pointer register) указывает на вершину стека
ebp/bp (Base Pointer register) — регистр указателя базы кадра стека
31 16 15 0
Сегментные регистры
CS (Code Segment) – регистр сегмента кода, содержит начальный адрес сегмента кода
DS (Data Segment) – регистр сегмента данных, содержит его начальный адрес
SS (Stack Segment) – регистр сегмента стека, содержит начальный адрес в сегменте стека
ES (Extra Segment) – регистр сегмента расширения
Регистр флагов (EFLAGS/FLAGS)0 NT IOPL OF DF IF TF SF ZF 0 AF 0 PF 1 CF
15 13 12 0
Зарезервированы ID VIP VIF AC VM RF
31 22 16
Флаги состояния
CF устанавливается при переносе из/заёме в (при вычитании) старший значащий бит результата и показывает наличие переполнения в беззнаковой целочисленной арифметике
PF устанавливается, если младший значащий байт результата содержит чётное число ненулевых битов
AF устанавливается при переносе из/заёме из бита 3 результата
ZF устанавливается, если результат равен нулю
SF равен значению старшего значащего бита результата, который является знаковым битом в знаковой арифметике
OF устанавливается, если целочисленный результат слишком длинный для размещения в целевом операнде
Регистр флагов (EFLAGS/FLAGS)Управляющий флаг
DF управляет строковыми инструкциями
Системные флаги
IF обнуление этого флага запрещает отвечать на маскируемые запросы на прерывание
TF установка этого флага разрешает пошаговый режим отладки
IOPL показывает уровень приоритета ввода-вывода
NT устанавливается, когда текущая задача «вложена» в другую, прерванную задачу
RF флаг маскирования ошибок отладки
VM установка этого флага в защищённом режиме вызывает переключение в режим 8086
AC включение контроля выравнивания операндов при обращениях к памяти
VIF виртуальная копия флага IF
VIP устанавливается для указания наличия отложенного прерывания
ID поддержка инструкции CPUID
Указатель команд (EIP/IP)
Содержит смещение следующей подлежащей выполнению команды относительно содержимого
сегментного регистра CS в текущем сегменте команд
Основные команды Ассемблера
Пересылки данных Арифметические Логические
Передачиуправления
Обработкицепочек
Управленияработой ЦП
Команды пересылки данных
Общего назначения
Работы с адресами
Работы со стеком
Преобразования данных
MOV LEA PUSH XLAT
XCHG LSS POP
LDS PUSHA
LES POPA
LFS PUSHF
LGS POPF
Команды пересылки данных MOV op1, op2 - пересылка данных между регистрами
или регистрами и памятью
mov al,5
mov bl,al
mov bx,ds
MOVS op1, op2
MOVSB op1, op2
MOVSW op1, op2
MOVSD op1, op2
str1 db 'str1 копируется в str2'
len_str1 equ $-str1
a_str1 dd str1
str2 db len_str1 dup (' ')
a_str2 dd str2
...
mov cx,len_str1
lds si,str1
les di,str2
cld
rep movsb
Команды пересылки данных
LDS op1, op2
LES op1, op2
Загрузка сегментного регистра ds/es указателем из памяти
CLD - сброс в ноль флага направления df
REP - указание условного и безусловного повторения следующей за данной командой цепочечной операции
REPE
REPZ
REPNE
REPNZ
Арифметические и логические команды
ADD op1, op2
SUB op1, op2
MUL op1, op2
IMUL op1, op2
DIV op1, op2
IDIV op1, op2
INC op1
DEC op1
NEG op1
AND op1, op2
OR op1, op2
XOR op1, op2
NOT op1
SHL op1, op2
SHR op1, op2
RCL op1, op2
RCR op1, op2
ROL op1, op2
ROR op1, op2
TEST
Команды передачи управления
JMP label
JE label
JNE label
JZ label
JNZ label
LOOP label
LOOPE label
LOOPNE label
LOOPZ label
LOOPNZ label
CALL label
RET nr
INT int_nr
IRET
Команды сравнения
CMP op1, op2 len equ 10
...
cmp ax, len
jne m1 ;переход если
;(ax)<>len
jmp m2 ;переход если
;(ax)=len
...
Преобразование узлов дерева вывода в код на языке ассемблера для арифметических операций
Действие Код для 8086
:=pop ax ; xchg ax,bxmov [bx],ax ;
Внесение левой части в стек (или любого адреса)
push bxmov bx, offset var
Внесение переменной в стекpush bxmov bx, var
Унарный минус neg bx
Бинарная операция: вычитаниеpop axxchg ax,bxsub bx,ax
Генерация кода для арифметических операций
Действие Код для 8086
Бинарная операция: сложениеpop axadd bx,ax
Ссылка по адресу mov bx,[bx]
Ссылка на структуру mov bx,[bx+offset field]
Тернарная условная операция
test bx,bxpop bxpop axjz exit1xchg ax,bxexit1: ...
Загрузка значения по адресу mov bx, [bx]
Генерация кода для арифметических операций
Генерация кода для условного оператора IF, вложенногооператора IF языка ПАСКАЛЬ
if (условие)then
test bx,bxjne метка_ХХХ
Генерируем код с уникальным именем метки, имя этой метки вместе с ярлыком _IF_ ложим на стек
... else ...jmp метка_YYYметка_XXX:
Здесь мы достаём из стека ярлык _IF_ вместе с сгенерированным ранее именем метки, вставляем эту метку в ассемблеровский листинг, затем ложим на стек новую уникальную метку YYY с ярлыком _ELSE_
... ; метка_YYY:Достаём из стека ярлык _ELSE_ с меткой,
которую вставляем в листинг
Генерация кода для оператора цикла FOR, вложенного оператора FOR языка ПАСКАЛЬ
FOR var:=Value1
push dxmov dx, Value1
Инициализируем индексную переменную - регистр dx, сохраняя прежнюю в стеке
TO|DOWNTO Value2
loop_XXX: cmp dx,Value2
ja|jb loop_exit_XXX
Здесь мы генерируем уникальную метку (на самом деле только суффикс XXX), которую мы ложим на стек вместе с ярлыком _FOR_ и пометкой, увеличивается или уменьшается в цикле индексная переменная
DO ... ... ;тело цикла в dx - индексная переменная
... ;
inc|dec dxjmp loop_XXXloop_exit_XXX:pop dx
Вынимаем из стека управляющих операторов ярлык _FOR_, генерируем инкремент или декремент индексной переменной, генерируем переход к началу цикла, метку окончания цикла и восстанавливаем регистр, содержащий индексную переменную
Генерация кода для оператора цикла FOR, вложенного оператора FOR языка ПАСКАЛЬ
Генерация кода для операторов цикла WHILE языка ПАСКАЛЬ
WHILE (условие)DO
w_loop_XXX:...;код вычисления...;условияtest bx,bxjz w_loop_exit_XXX
Здесь мы генерируем уникальную метку (реально только уникальный суффикс), которую мы кладем в стек вместе с ярлыком _WHILE_, заметим, что между метками располагается не показанный здесь код вычисления условия, который возвращает булево значение на вершине стека
... ;jmp w_loop_XXX
w_loop_exit_XXX:
Вынимаем из стека управляющих операторов ярлык _WHILE_, генерируем переход к началу цикла и метку окончания цикла