Similar presentations:
LK2_КомандыАссемблера
1.
Intel 8086Команды ассемблера
2.
План:01
02
03
04
Переменные
Команды пересылки данных
Способы адресации
Циклы
Условные и безусловные переходы
Понятие буфера
Команды работы со строками
05
Макросы
06
Прерывания
3.
ПРЕДИСЛОВИЕСинтаксис языка ассемблер поддерживает цифры,
строчные и прописные буквы латинского алфавита, а
также следующие символы:
? @ _ $ : . [ ] ( ) < > { } + / * & % ! ' ~ | \ = # ^ ; , ` "
Компилятор не отличает верхний и нижний регистр
mov = MOV = mOV = …
4. ПЕРЕМЕННЫЕ
Переменная – уникальная именованная ячейка памяти,содержащая в себе определенное значение, представленное в
виде последовательности 0 и 1.
В ассемблере intel8086 поддерживаются разные типы
данных при создании переменных:
DB – байт,
DW – слово (2 байта),
DD – двойное слово (4 байта),
DF – 6 байт (для представления адреса (FAR указатель)),
DQ – 8 байт,
DT – 10 байт (80-битные данные для FPU(Float-processing Unit)).
5.
ПЕРЕМЕННЫЕДля того чтобы объявить переменную применяется конструкция
следующего вида:
имя_переменной
директива данных(тип) значение
Значение может быть как определенным(13h,2,’h’), так и содержать
мусор поначалу, если значение будет определено позже (var_name db ?)
Также поддерживаются константы, которые можно расположить в любом
месте программы:
И массивы:
имя equ значение
имя_переменной длина dup (?/значение/значения)
6.
КОМАНДЫ ПЕРЕСЫЛКИ ДАННЫХMOV - основная команда пересылки данных, которая
пересылает один байт/слово.
Доступные комбинации операндов
Комбинации для сегментных регистров
С помощью MOV НЕЛЬЗЯ менять содержимое CS и IP в виду того, что они в связке
хранят непосредственно адрес текущей выполняемой команды. Изменение приведет к
ошибке выполнения, ну а вообще к UB(undefined behaviour).
7.
КОМАНДА ОБМЕНА ДАННЫХ XCHGКоманда XCHG позволяет менять местами содержание двух
операндов. Порядок не имеет значения. Доступные комбинации:
Обмен значениями между двумя
регистрами
MOV AX, 0AAAAh
MOV BX, 0BBBBh
XCHG AX, BX
; Теперь в AX находится BBBBh
; Теперь в BX находится AAAAh
Обмен значениями между регистром и
памятью
var db 10
…
MOV AL, 50
XCHG AL, var
; В регистр AL загрузилось старое значение 10
; В память по адресу var записалось значение 50
Команда XCHG не может менять местами содержимое двух ячеек памяти напрямую
(Memory-Memory). Один из операндов обязательно должен быть регистром.
8.
СПОСОБЫ АДРЕСАЦИИ9.
ЦИКЛЫДля реализации цикла в ассемблере используется следующая конструкция:
1. В СX заносится число итераций (например, mov CX,7);
2. Создается метка с ‘:’ на конце (например,
conversion_to_num:);
3. В конце цикла выполняется команда loop метка, при переходе на которую СХ
сначала декрементируется, а затем сравнивается с 0. В случае равенства, цикл
заканчивается и выполняется следующая за ним инструкция.
Существуют модификации перехода loop (loopne, loopz…), которые
выполняются, если выполнены соответствующие условия для флагов и пока CХ !=0.
mov cx, 10 ; планируем пройтись по циклу 10 раз
loop_print: ; метка с названием цикла
call print_hello ; тело цикла
loop loop_print ; декрементируем CX, пока он не станет 0
10.
УСЛОВНЫЕ И БЕЗУСЛОВНЫЕ ПЕРЕХОДЫКоманды условного перехода – команды, которые позволяют
перейти к выполнению какой-то инструкции в коде при
выполнении определенных условий. Обычно используются после
команды сравнения CMP.
Безусловные переходы реализуются при помощи команды JMP
метка и не требуют дополнительных условий.
Подробнее про переходы:
https://andreagennaioli.github.io/emu8086-documentation/asm_tutorial_07.html
11.
УСЛОВНЫЕ И БЕЗУСЛОВНЫЕ ПЕРЕХОДЫ; напишем код для нахождения ввода
Enter в массиве
lea si, arr_str
mov cx, len_str
jcxz invalid_str ; если длина строки =
0, переходим к метке
loop_str:
cmp [si], 0dh ; сравниваем с
Enter
je find_end ; если это он,
переходим к другой метке
inc si
loop loop_str
invalid_str: ; выходим из программы,
если длина строки = 0 или нет символа
Enter
mov ah, 4ch
int 21h ; выход из программы
find_end:
…
12.
ПОНЯТИЕ БУФЕРАБуфер – всего-навсего последовательность байт,
используемая для удобного хранения строки при вводе.
Компоненты буфера:
1 байт больше,
резервируемая длина (желательно количество байт указывать на 1
чем планируется для ввода, тк. ввод заканчивается символом
Enter (0dh), что займет 1 байт);
2 байт -
реальная длина(установится после ввода автоматически);
3 байт - массив байтов (резервируем то количество байт, что мы указали в
1 байте).
str_buf db 101, ?, 101 dup (?) – пример корректной инициализации
буфера с резервируемой длиной 100.
13.
ПОНЯТИЕ БУФЕРАДля ввода строки нужно в DX поместить адрес буфера, в
AH – 0ah и вызвать прерывание int 21h:
lea dx, str_buf ; lea – загрузка эффективного адреса начала буфера с
учетом смещения
mov ah, 0ah
int 21h
; после ввода начиная с 3 байта, то есть в [str_buf+2] будет лежать
строка
…
;data
str_buf 101, ?, 101 dup (?)
14.
КОМАНДЫ РАБОТЫ СО СТРОКАМИСтроки можно вводить и выводить с помощью соответствующих
прерываний. При выводе, как правило, в конце строки ставится
символ ‘$’ (по умолчанию символ ‘$’ при вводе строки в буфер через
прерывание int21h 0ah не ставится в конце, так что для вывода
нужно мануально его записать).
Также существует ряд команд (MOVS,STOS,SCANS…), которые в
связке с флагом D и командами loop,loopz… позволяют производить
операции с 2-мя строками, где адрес строки-источника помещается
предварительно в SI, адрес строки-приемника – в DI, кол-во
итераций заносится в СХ.
15.
МАКРОСЫПо своей сути макросы – это аналог инлайн функций, потому что они
буквально подставляют код функции в то место, где они вызываются.
Макрос начинается именем и директивой MACRO, а заканчивается
директивой ENDM (смотрите ниже). После директивы MACRO могут быть
перечислены через запятую идентификаторы параметров, используемых в
макросе, что делает макрос гибким средством оформления кода.
print_msg macro msg
mov ah,09h
lea dx, msg
int 21h
endm
print_msg newline
print_msg msg_hello
print_msg msg_input
print_msg newline
…
newline db 0dh, 0ah, ‘$’
msg_hello db “Hello, user!”, 0dh, 0ah, ‘$’
msg_input db “Press any button to continue…”,
0dh, 0ah, ‘$’
16.
ПРЕРЫВАНИЯПрерывания – сигнал программе, после которого она временно или
навсегда перестает выполнять текущие инструкции и выполняет определенный
набор команд, определенный типом прерывания. Например, ввод строки
int 21h (ah = 0ah), вывод строки int21h (ah = 9), и т.п.
Пример использования прерывания в коде:
; пример использования прерывания 10h для очистки экрана терминала
; Функция 06h – Прокрутка окна вверх (используется для очистки)
mov ah, 06h
mov al, 0 ; 0 = очистить весь экран
mov bh, 07h ; Атрибут (цвет): 07h = серый текст на черном фоне
mov cx, 0000h ; Координаты нового верхнего левого угла (строка 0, колонка 0)
mov dx, 184Fh ; Координаты нового нижнего правого угла (строка 24, колонка 79)
int 10h
Полный список прерываний:
https://andreagennaioli.github.io/emu8086-documentation/8086_bios_and_dos_interrupts.html
programming