- •Введение
- •Оперативная память
- •Регистры
- •Оператор asm
- •Команды пересылки данных
- •Команда mov.
- •Команда xchg.
- •Xchg операнд 1, операнд 2.
- •Команды сложения.
- •Команда add.
- •Команда adc.
- •Команда inc.
- •Inc операнд
- •Команды вычитания.
- •Команда sub.
- •Команда sbb.
- •Команда dec.
- •Команда умножения.
- •Команда деления.
- •Целые числа без знака
- •Целые числа со знаком
- •Арифметические команды для знаковых чисел
- •Команда изменения знака.
- •Команды сложения и вычитания.
- •Команда умножения.
- •Imul операнд
- •Idiv операнд
- •Команды передачи управления
- •Команда условного перехода, проверяющая состояние регистра cx.
- •Изменение размеров числа
- •Косвенная ссылка
- •Оператор указания типа ptr
- •Массивы. Индексная адресация
- •Пузырьковая сортировка
- •Сортировка выбором
- •Сортировка включением
- •Понятие стека
- •Команды для работы со стеком
- •Команда записи слова в стек.
- •Команда чтения слова из стека.
- •Запись регистра флагов в стек.
- •Чтение регистра флагов из стека.
- •Прерывания
- •Int номер прерывания
- •Лабораторная работа №1-2 Вариант 1
- •Вариант 2
- •Вариант 10
- •Вариант 11
- •Лабораторная работа № 3-4 Вариант 1
- •Вариант 3
- •Вариант 11
- •Лабораторная работа № 5-6 Вариант 1
- •Вариант 10
- •Вариант 11
- •Темы рефератов
- •Библиографический список
- •Оглавление
- •600024, Г. Владимир, ул. Университетская, 2, тел. 33-87-40
Оператор asm
Зарезервированное слово asm открывает доступ к средствам встроенного ассемблера Турбо Паскаля. Этот оператор может располагаться только внутри исполняемой части программы (подпрограммы). Область действия оператора asm ограничивается ближайшим по тексту зарезервированным словом end:
Asm
<Одна или несколько команд встроенного ассемблера>
End;
С точки зрения Турбо Паскаля пара asm…end является операторными скобками, ограничивающими единственный оператор Паскаля. Тело ассемблерного оператора asm…end может быть пустым или содержать несколько ассемблерных команд. Каждая ассемблерная команда должна располагаться на отдельной строке или отделяться от следующей за ней команды символом «;». В конце строки, содержащей единственную ассемблерную команду, или между двумя командами, располагающимися на одной строке, разрешается вставлять комментарий, который должен оформляться по обычным правилам Турбо Паскаля, т.е. ограничиваться символами «{», «}».
Команды пересылки данных
Рассмотрим две команды пересылки данных mov и xchg.
Команда mov.
С помощью этой команды можно переслать байт или слово из регистра в регистр, из памяти в регистр или из регистра в память. Тип пересылаемых данных (байт или слово) определяется регистром, участвующим в пересылке.
Синтаксис данной команды:
mov приемник, источник.
Например,
Команда |
Результат |
mov AX,100 mov DS,AX mov BL,k |
AX=100 DS=100 BL=k, где k – переменная типа байт, значение которой ранее было определено в программе |
Задача: Ввести с клавиатуры некоторое число типа байт и поместить его в регистры AL и BH, переслать в регистр BL 15, скопировать в переменную k содержимое регистра BL, вывести на экран значение переменной k.
Решение:
Var k:byte;
Begin
Writeln(‘Введите число’); Readln(k);
asm
mov al,k; mov bh,k
mov bl,15; mov k, bl
end;
Writeln(‘k=’,k)
End.
Команда xchg.
С помощью этой команды можно менять местами значения размером в байт или слово двух регистров, регистра и ячейки памяти или ячейки памяти и регистра.
Синтаксис данной команды:
Xchg операнд 1, операнд 2.
Например,
Команда |
Результат |
mov AX,100 mov BX,123 xchg AX,BX |
AX=100 BX=123 AX=123, BX=100 |
Задача: Ввести с клавиатуры значения двух целочисленных переменных x и y. Написать ассемблерную вставку, состоящую из трех команды, меняющую местам значения указанных переменных. Вывести на экран значения переменных x и y.
Решение:
Var
x,y:integer;
Begin
Writeln('Введите значение x'); Readln(x);
Writeln('Введите значение y'); Readln(y);
asm
mov ax,x; xchg ax,y; mov x,ax
end;
Writeln('x=',x,' y=',y)
End.
Семинар 2: Арифметические команды для беззнаковых чисел
Данные команды работают с операндами размером как в байт, так и в слово. При этом важным является совпадение типов операндов.
Команды сложения.
При выполнении операции сложения двух чисел возможно переполнение, например, если складывать два числа размером в 1 байт: 250 и 10, то результатом сложения будет число 260, которое не помещается в ячейку размером в 1 байт. В этом случае не возникает ошибки переполнения, просто левая единица отбрасывается и в качестве ответа выдается искаженная сумма, а во флаг переноса CF записывают 1, что и является сигналом того, что получена неправильная сумма. В нашем случае мы получим:
26010=111110102 1010=10102
111110102+10102=1000001002
В ячейку размером в 1 байт может быть помещено только восьмиразрядное двоичное число, т.е. в нашем случае из двоичного результата сложения чисел 260 и 10 будет отброшена первая единица: 00000100 или 100 (260+10=4).
Такое суммирование в математике называется суммированием по модулю 2k (k – размер ячейки), при этом во флаге CF фиксируется, был ли перенос: