38
Ассемблер

Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

  • Upload
    others

  • View
    11

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Ассемблер

Page 2: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Ассемблер – язык программирования

Ассемблер – компилятор

Page 3: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Язык Ассемблера

Символическое представление машинного языка

Язык ассемблера для каждого типа компьютера свой

Page 4: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Литература

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

Page 5: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Пример программы (TASM)

db ‘Hello!$’

Page 6: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Подготовка программы к выполнению

Page 7: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Пример программы (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

Page 8: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Подготовка программы к выполнению

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

Page 9: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Определение типа 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)

Page 10: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Компиляция и линковка

1) nasm -f elf hello.asm # Создание объектного файла

2) ld -o hello hello.o # Создание исполняемого файла

Page 11: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Структура команды Ассемблера

метка: инструкция/директива

операнды ; комментарий

_start: mov eax, 4 ; Системный вызов ‘write’

begin: mov AX, data

mov ebx, 1

msg db "Hello,

world!",

0xA

Page 12: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Директивы Ассемблера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)

Объявление неинициализированного пространства для хранения данных

Page 13: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Примеры (TASM)

Page 14: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Примеры (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

Page 15: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Функциональная структура ЭВМ

Page 16: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Регистры процессора

Page 17: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Регистры общего назначения

Page 18: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Регистры общего назначения

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, он хранит промежуточные данные. В некоторых командах его использование обязательно; для некоторых команд это происходит неявно.

Page 19: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Предназначены для хранения индексов при работе с массивами

esi/si (Source Index register) — индекс источника

edi/di (Destination Index register) — индекс приемника (получателя)

Индексные регистры

Page 20: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Регистры-указатели

esp/sp (Stack Pointer register) указывает на вершину стека

ebp/bp (Base Pointer register) — регистр указателя базы кадра стека

31 16 15 0

Page 21: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Сегментные регистры

CS (Code Segment) – регистр сегмента кода, содержит начальный адрес сегмента кода

DS (Data Segment) – регистр сегмента данных, содержит его начальный адрес

SS (Stack Segment) – регистр сегмента стека, содержит начальный адрес в сегменте стека

ES (Extra Segment) – регистр сегмента расширения

Page 22: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Регистр флагов (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 устанавливается, если целочисленный результат слишком длинный для размещения в целевом операнде

Page 23: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Регистр флагов (EFLAGS/FLAGS)Управляющий флаг

DF управляет строковыми инструкциями

Системные флаги

IF обнуление этого флага запрещает отвечать на маскируемые запросы на прерывание

TF установка этого флага разрешает пошаговый режим отладки

IOPL показывает уровень приоритета ввода-вывода

NT устанавливается, когда текущая задача «вложена» в другую, прерванную задачу

RF флаг маскирования ошибок отладки

VM установка этого флага в защищённом режиме вызывает переключение в режим 8086

AC включение контроля выравнивания операндов при обращениях к памяти

VIF виртуальная копия флага IF

VIP устанавливается для указания наличия отложенного прерывания

ID поддержка инструкции CPUID

Page 24: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Указатель команд (EIP/IP)

Содержит смещение следующей подлежащей выполнению команды относительно содержимого

сегментного регистра CS в текущем сегменте команд

Page 25: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Основные команды Ассемблера

Пересылки данных Арифметические Логические

Передачиуправления

Обработкицепочек

Управленияработой ЦП

Page 26: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Команды пересылки данных

Общего назначения

Работы с адресами

Работы со стеком

Преобразования данных

MOV LEA PUSH XLAT

XCHG LSS POP

LDS PUSHA

LES POPA

LFS PUSHF

LGS POPF

Page 27: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Команды пересылки данных 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

Page 28: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Команды пересылки данных

LDS op1, op2

LES op1, op2

Загрузка сегментного регистра ds/es указателем из памяти

CLD - сброс в ноль флага направления df

REP - указание условного и безусловного повторения следующей за данной командой цепочечной операции

REPE

REPZ

REPNE

REPNZ

Page 29: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Арифметические и логические команды

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

Page 30: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Команды передачи управления

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

Page 31: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Команды сравнения

CMP op1, op2 len equ 10

...

cmp ax, len

jne m1 ;переход если

;(ax)<>len

jmp m2 ;переход если

;(ax)=len

...

Page 32: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Преобразование узлов дерева вывода в код на языке ассемблера для арифметических операций

Page 33: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Действие Код для 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

Генерация кода для арифметических операций

Page 34: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Действие Код для 8086

Бинарная операция: сложениеpop axadd bx,ax

Ссылка по адресу mov bx,[bx]

Ссылка на структуру mov bx,[bx+offset field]

Тернарная условная операция

test bx,bxpop bxpop axjz exit1xchg ax,bxexit1: ...

Загрузка значения по адресу mov bx, [bx]

Генерация кода для арифметических операций

Page 35: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Генерация кода для условного оператора IF, вложенногооператора IF языка ПАСКАЛЬ

if (условие)then

test bx,bxjne метка_ХХХ

Генерируем код с уникальным именем метки, имя этой метки вместе с ярлыком _IF_ ложим на стек

... else ...jmp метка_YYYметка_XXX:

Здесь мы достаём из стека ярлык _IF_ вместе с сгенерированным ранее именем метки, вставляем эту метку в ассемблеровский листинг, затем ложим на стек новую уникальную метку YYY с ярлыком _ELSE_

... ; метка_YYY:Достаём из стека ярлык _ELSE_ с меткой,

которую вставляем в листинг

Page 36: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Генерация кода для оператора цикла 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 - индексная переменная

Page 37: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

... ;

inc|dec dxjmp loop_XXXloop_exit_XXX:pop dx

Вынимаем из стека управляющих операторов ярлык _FOR_, генерируем инкремент или декремент индексной переменной, генерируем переход к началу цикла, метку окончания цикла и восстанавливаем регистр, содержащий индексную переменную

Генерация кода для оператора цикла FOR, вложенного оператора FOR языка ПАСКАЛЬ

Page 38: Ассемблер - csc.sibsutis.ru1).pdfДирективы Ассемблера TASM/MASM NASM Назначение SEGMENT SECTION Указывает, в какую секцию

Генерация кода для операторов цикла WHILE языка ПАСКАЛЬ

WHILE (условие)DO

w_loop_XXX:...;код вычисления...;условияtest bx,bxjz w_loop_exit_XXX

Здесь мы генерируем уникальную метку (реально только уникальный суффикс), которую мы кладем в стек вместе с ярлыком _WHILE_, заметим, что между метками располагается не показанный здесь код вычисления условия, который возвращает булево значение на вершине стека

... ;jmp w_loop_XXX

w_loop_exit_XXX:

Вынимаем из стека управляющих операторов ярлык _WHILE_, генерируем переход к началу цикла и метку окончания цикла