Похожие презентации:
Лабораторная работа 1
1. Лабораторная работа 1
Ассемблерные вставки в Visual studioАрифметические команды
ассемблера
2.
Регистры 32-разрядного МП3.
Регистры 16-разрядного МПРегистры общего назначения
Ax – accumulator
Bx – base
Cx – count
Dx – data
Si – source index
Di – destination index
Bp – base pointer
Sp – stack pointer
Регистр указателя команд и регистр флагов
ip – instruction pointer
4.
В visual studio создать консольное приложение для windows в с++5.
Шаблон программы для лабораторной работы#include <stdio.h> ; /для использования printf
int main()
{
Char a;
a = ‘a’;
Int b;
_asm {
код на ассемблере
}
printf ( “%d“, a); /форматный вывод с++
}
6.
Эта программа должна заработать. Обратите внимание на х86, выделенное красным напанели инструментов вверху под главным меню. Для x64 (64-разрядной системы)
ассемблерные вставки запрещены.
7.
Ассемблерные вставки Visual C++• Можно
– Обращаться к регистрам
– Обращаться к меткам и переменным С++
– Обращаться к параметру функции по имени
– Использовать операторы PTR,LENGTH,SIZE,TYPE
– Загружать адрес командой LEA
• Нельзя
– определять данные директивами
– использовать операторы кроме разрешённых выше
• определять адрес директивой OFFSET
– использовать макроопределения
– обращаться к сегментам по имени
7
8.
формат команды ассемблераМетка:
код команды
приемник, источник ;комментарий
Команда пересылки
MOV получатель, источник
Примеры
Mov
аl,49
;al=49
Mov
al,00110011b
;al=00110011b двоичное число
Mov
аx,bx
;ax=bx Размерности должны совпадать!!!
Mov
Mov
аl,mem1
mem1, 12
;al=mem1 Размерности должны совпадать!!!
;mem1=12
9.
обмен значений двух операндовXCHG источник, приемник
Пример:
xchg ax,bx
; ax=bx, bx=ax
10.
Типы данных с++ и размерности переменныхChar - 8 бит
Short - 16 бит
Int - 32 бита
Long - 64 бита
Float - 32 бита
Double - 64 бита
11.
Сложение и вычитаниесложение/вычитание регистр-регистр
add ax,bx ;ax=ax+bx
sub ah,al ;ah=ah-al
Размерности регистров должны совпадать!!!
сложение/вычитание память-регистр
add ax, mem1 ;ax=ax+mem1, mem1 – имя переменной
Sub mem1,ax ;mem1=mem1-ax
сложение/вычитание регистр- непосредственное значение
add
Sub
ax,279 ;ax=ax+279
ch,3
;ch=ch-3
сложение/вычитание память - непосредственное значение
sub mem1,3
;mem1=mem1-3
add mem1,92 ;mem1=mem1+92
Прямой операции память-память не существует !!!
Используется промежуточная операция пересылка в регистр.
12.
Операция умножения для беззнаковых данныхвыполняется командой MUL, а для знаковых - IMUL.
Ответственность за выбор подходящей команды умножения
лежит на самом программисте.
13.
Существуют две основные операции умножения:"Байт на байт".
Множимое в AL,
Множитель в 8-битовом регистре.
Произведение находится в регистре AX.
Операция игнорирует и стиpает любые данные, которые
находились в регистре AH.
"Слово на слово".
Множимое в AX,
Множитель – в 16-битовом регистре.
После умножения произведение находится в двойном слове, для
которого требуется два регистра: старшая (левая) часть
произведения находится в регистре DX, а младшая (правая) часть в
регистре AX. Операция игнорирует и стирает любые данные,
которые находились в регистре DX. В большинстве современных
систем произведение помещается в EAX.
В единственном
операнде
команд
MUL и IMUL
указывается множитель
14.
Рассмотрим следующие команды:Mul cl ; множитель-байт: по умолчанию множимое в AL,
произведение в AX
Mul bx ; множитель - слово: по умолчанию множимое в AX,
произведение в DX:AX (вЕАХ)
15.
Примеры умножения2*10
Char n=10;
_asm{
mov al,2
mov bl,n
mul bl
;ax=2*10=20=0014h:
ah=00h al=14h
В отладчике числа в регистрах видны в
шестнадцатеричном коде
16.
Пример умножения со знакомmov ax,8
mov bx,-1
imul bx
;
; EBX = 010CFFFF
; EAX =-8=0000FFF8h
17.
Внутреннее представление данныхЦелые беззнаковые числа полностью используют соответствующее поле для
представления значения числа в двоичной системе счисления.
Для ячейки из k разрядов можно представить 2k различных комбинаций.
Поэтому в байте можно представить целые числа 0–255 (28 – 1),
в слове: 0–65535 (216 – 1),
в двойном слове: 0– 4 294 967 295 (232 – 1).
Знаковые целые числа представлены в дополнительном коде. Дополнительный
код целого числа a:
28-10=256-10=24610=F416=111101102
Сумма -10+10=11110110+00001010=0
18.
алгоритм перевода отрицательного числа в дополнительный код1. инвертируем значение отрицательного числа, записанного в
прямом коде (знаковый бит не трогаем)
2. к полученной инверсии прибавляем 1
Пример:
Дано десятичное число -10
Переводим в прямой код :
10 = 0000 1010 ----> -10 = 1000 1010
Инвертируем значение (получаем обратный код):
1000 1010 ----> 1111 0101
К полученной инверсии прибавляем 1:
1111 0101
1
1111 0110 - десятичное число -10 в дополнительном коде
19.
Алгоритм обратного преобразования дополнительного кода в числоАлгоритм идентичен
1. инвертируем дополнительный код числа
2. к полученной инверсии прибавляем 1
Пример:
Дополнительный код числа -10: 1111 0110
Инверсия: 00001001
+1 : 00001010
20.
Повышение эффективности умножения:При умножении на степень числа 2 (2,4,8 и т.д.) более
эффективным является сдвиг влево на требуемое число битов.
Сдвиг более чем на 1 требует загрузки величины сдвига в регистр
CL (в старых системах)
В следующих примерах предположим, что множимое находится в
регистре AL или AX:
Умножение на 2:
shl ax,1
Умножение на 8:
mov cl,3
Shl ax,cl
21.
Операция деления для беззнаковых данных выполняетсякомандой DIV, a для знаковых - IDIV. Ответственность за
подбор подходящей команды лежит на программисте.
22.
Существуют две основные операции деления:Деление "слова на байт".
Делимое - в AX,
делитель - в 8-битовом регистре.
Остаток я - в AH,
частное - AL.
Деление "двойного слова на слово".
Делимое - в регистровой паре DX:AX, а
делитель – в 16-битовом регистре.
Остаток – в DX,
частное в AX.
В единственном операнде команд DIV и IDIV указывается
делитель.
23.
Пример беззнакового деленияMov ax,100
Mov bh,2
Div bh
; 100 div 2=50,
ah=0
al=50
24.
Используя команды DIV и особенно IDIV, очень просто вызватьпеpеполнение.
В операциях деления предполагается, что частное значительно
меньше, чем делимое.
Деление на ноль всегда вызывает прерывание.
Но деление на 1 генерирует частное, которое равно делимому,
что может также легко вызвать прерывание.
25.
Преобразование знакаКоманда NEG обеспечивает преобразование знака
двоичных чисел из положительного в отрицательное и
наоборот.
Практически команда NEG устанавливает
противоположные значения битов и прибавляет 1.
Примеры:
Neg ax
Neg bl
Neg BINAMT ; (байт или слово в памяти)
26.
ПримерВычислить значение выражения
mov ax,12
add ax,3
mov bl,8
add bl,6
; ax=12+3
; bl=8+6
div bl
mov ah,0
mov bl,3
mul bl
; делим содержимое ax на содержимое bl
; остаток обнуляем
add ax,12
mov y,al
; к произведению прибавляем 12
; заносим в y
;результат (al) умножаем на 3
Программирование