Лабораторная работа 1
438.73K
Категория: ПрограммированиеПрограммирование

Лабораторная работа 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
English     Русский Правила