Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3507.doc
Скачиваний:
4
Добавлен:
13.11.2022
Размер:
333.31 Кб
Скачать

Оператор asm

Зарезервированное слово asm открывает доступ к средствам встроенного ассемблера Турбо Паскаля. Этот оператор может располагаться только внутри исполняемой части программы (подпрограммы). Область действия оператора asm ограничивается ближайшим по тексту зарезервированным словом end:

Asm

<Одна или несколько команд встроенного ассемблера>

End;

С точки зрения Турбо Паскаля пара asm…end является операторными скобками, ограничивающими единственный оператор Паскаля. Тело ассемблерного оператора asm…end может быть пустым или содержать несколько ассемблерных команд. Каждая ассемблерная команда должна располагаться на отдельной строке или отделяться от следующей за ней команды символом «;». В конце строки, содержащей единственную ассемблерную команду, или между двумя командами, располагающимися на одной строке, разрешается вставлять комментарий, который должен оформляться по обычным правилам Турбо Паскаля, т.е. ограничиваться символами «{», «}».

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

Рассмотрим две команды пересылки данных mov и xchg.

  1. Команда 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.

  1. Команда 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. Команды сложения.

При выполнении операции сложения двух чисел возможно переполнение, например, если складывать два числа размером в 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 фиксируется, был ли перенос:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]