Тюрин В.Н.
Вычислительные машины,
Системы и сети
Учебное пособие
для студентов заочной формы обучения.
Красноярск, 2006
Федеральное агентство по образованию
ГОУВПО
“ Сибирский государственный технологический университет”
Вычислительные машины,
Системы и сети
Учебное пособие
по выполнению контрольных работ
для студентов заочной формы обучения, специальности 210200 «Автоматизация технологических процессов и производств»
Красноярск, 2006
УДК 68132(075.8)
Т 985
Тюрин В.Н. Вычислительные машины, системы и сети: Учебное пособие по выполнению контрольных работ для студентов заочной формы обучения, специальности 210200 «Автоматизация технологических процессов и производств». Красноярск: СибГТУ, 2006. – 110с.
Рецензент: Научно-методический совет СибГТУ –
к.т.н., доцент Т.Г.Зингель
© В.Н. Тюрин
© Сибирский государственный технологический университет, 2006
Введение
Учебное пособие содержит всю необходимую информацию для разработки и написания полноценных программ на языке Ассемблера.
Первая глава содержит описание ЭВМ совместимых с IBM PC. Здесь приведены структура процессора, назначение основных регистров, система представления данных в ЭВМ.
Во второй главе описываются форматы команд, режимы адресации, псевдооператоры (директивы) языка, даны примеры использования директив.
Третья глава посвящена командам языка Ассемблера. Здесь приведены мнемокод, алгоритм выполнения команды и указано их воздействие на регистр флагов. Наиболее распространенные команды описаны подробно.
В четвертой главе описываются правила и приемы создания рабочей программы на языке Ассемблера и способы ее отладки.
В пятой главе приведены примеры программ на языке Ассемблера.
В шестой главе описаны некоторые характерные ошибки, встречающиеся в программах на Ассемблере и обнаруженные транслятором и компоновщиком при создании исполняемого файла.
Седьмая глава содержит описание команд интерактивных отладчиков Debug Borland и Code View Microsoft.
В целом пособие составлено таким образом, чтобы в краткой форме пояснить модель процессора, цикл его работы и описать состав, назначение и функционирование основных регистров. Для максимального облегчения составления программ студентами, имеющими начальные знания по языку Ассемблера, каждая команда приведена с примером её использования.
Регистры общего назначения
Особенностью всех этих регистров является то, что их можно использовать в любых арифметических, логических и других операциях, но в то же время каждый из этих регистров имеет определенную специализацию. Например команды деления и умножения требуют чтобы первый операнд непременно находился в регистре АL или AХ или регистрах DX:AX. Четыре 16–разрядных регистра AX, BX, CX, DX, образованны из двух 8-битовых регистров AL, AH, BL, BH, CL, CH, DL, DH. Буквы L и H означают младшие (low-order) и старшие (high-order) байты 16-битовых регистров. К каждому из этих байтовых регистров можно обратиться по определённой команде.
Регистры SI, DI, BP, SP не разделены пополам, поэтому к ним можно обращаться только как к 16-разрядным структурам.
Регистр АХ - основной регистр процессора, используется при всех арифметических и логических операциях над словами, в операциях ввода, вывода и сдвига. В операциях умножения в этом регистре хранится множимое, а в операциях деления - делимое.
Регистр ВХ – базовый регистр, используется при арифметических операциях, а так же для адресации данных в памяти.
Регистр СХ – счётчик, используется как счётчик числа повторений цикла, а также при арифметических операциях. Регистр СL - используется как счётчик при операциях сдвига и циклического сдвига на несколько битов.
Регистр DX - регистр данных, используется при умножении и делении слов, в операциях ввода–вывода для хранения адреса выводимого текста или самого текста.
Сегментные регистры
ЭВМ на базе микропроцессоров INTEL x86 используют в основном сегментированные модели памяти. В этом случае программы и данные хранятся в отдельных областях памяти – сегментах, размер которых колеблется от 16 байт до 64 Кбайт. Каждый сегмент имеет адрес расположения его в памяти. Этот адрес 16-битный и хранится в сегментном регистре. Поэтому для формирования адреса байта в памяти нужны два числа – адрес начала сегмента и смещение искомого байта относительно начала сегмента. Четыре сегментных регистра процессора хранят четыре начальных адреса различных сегментов.
Регистр сегмента CS – хранит адрес сегмента кода текущей исполняемой программы.
Регистр сегмента DS – хранит адрес текущего сегмента данных используемых в программе.
Регистр сегмента SS – хранит адрес сегмента стека.
Стек-это сегмент памяти, используемый как операционной системой для хранения характеристик программы, так и программистом для временного хранения данных, адресов, содержимого регистров МП. Особенностью стека является то, что в командах обращения к стэку адрес ячейки памяти сегмента явно не указывается, а процессор формирует адрес таким образом, что запись и чтение осуществляется только из вершины стека. Обращение к произвольной ячейке стека осуществляется специальным образом с использованием регистра ВР.
Регистр дополнительного сегмента ES – хранит адрес сегмента текущего дополнительного сегмента, который используется для работы над строками или хранения данных и программ.
Указатель команд IP
Регистр IP - в этом регистре находится относительный адрес той команды, которая должна быть выполнена процессором следующей за исполняемой. Содержимое IP изменяется после дешифрации очередной команды, на величину равную количеству байт, отведенных в памяти для хранения этой команды. Исполнительный (физический) адрес команды определяется с помощью регистров CS и IP следующим образом:
CS × 10Н + IP = АЕ.
Из формулы видно, что изменение содержимого регистра IP, приводит к переходу на другую команду, а изменение содержимого CS, означает переход в другую программу, или область памяти. Поэтому содержимое CS изменяется программистом или операционной системой только специальными командами.
Регистр флагов EF
Специальный шестнадцатибитовый регистр, (рисунок 1.4) у которого каждый бит это флаг, то есть указатель, принимающий значение 1 (флаг установлен), или значение 0 (флаг сброшен), в зависимости от результата операции.
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
X | X | X | X | OF | DF | IF | TF | SF | ZF | X | AF | X | PF | X | CF |
Рисунок 1.4 - Регистр флагов
Флаги отражают состояния регистров процессора. В процессоре 8086 используется 9 флагов из 16 бит регистра. Шесть из них называют флагами состояний и три флагами управления. Флаги состояния устанавливаются многими командами процессора и используются программами для определения последующих действий. Хотя флаги имеют общую функцию, точный смысл и значение каждого флага зависит от результата последней выполненной арифметической команды.
Флаги состояний
CF (Carry flag) – флаг переноса. Устанавливается в 1, если результат предыдущей операции не уместился в приемнике и произошел перенос из старшего разряда регистра или требуется заём (при вычитании), в противном случае – в 0.
PF (parity flag) – флаг четности. Устанавливается в 1, если младший байт результата предыдущей команды содержит четное число бит, равных 1, и в 0-ecли нечетное. Это не то же самое, что делимость на два. Число делится на два без остатка, если его младший бит равен нулю, и не делится, когда равен 1.
AF (Auxiliary carry flag) – флаг полупереноса или вспомогательного переноса. Устанавливается в 1, если в результате предыдущей операции произошел перенос (или заем) из третьего бита в четвертый. Этот флаг используется автоматически командами двоично-десятичной коррекции.
ZF (Zero flag) – флаг нуля. Устанавливается в 1, если результат предыдущей команды равен нулю.
SF (Sign flag) – флаг знака. Он всегда равен старшему биту результата.
ОF (overflow flag) – флаг переполнения. Он устанавливается в 1, если результат предыдущей арифметической операции превысит одно или двухбайтовый диапазон для чисел со знаком. Например, если при сложении двух положительных чисел получается число, у которого старший бит равен единице, то есть отрицательное, и наоборот.
Флаги управления
TF (Trap flag) – флаг ловушки. Он был предусмотрен для работы отладчиков, не использующих защищенный режим. Установка его в 1 приводит к тому, что после выполнения каждой программной команды, управление временно передается отладчику программ.
IF (Interrupt flag) – флаг прерывании. Сброс этого флага в 0 приводит к тому, что процессор перестает обрабатывать прерывания от внешних устройств (описание команды INT). Обычно его сбрасывают на короткое время для выполнения критических участков программ.
DF (Direction flag) – флаг направления. Контролирует поведение команд обработки строк. Когда он установлен в 1, индексные регистры, адресующие источник и приемник, после выполнения команды, уменьшаются на единицу. Это означает, что строки обрабатываются в сторону уменьшения адресов. Когда DF = 0 индексные регистры увеличиваются на единицу, и строки обрабатываются от старших адресов к младшим.
Представление данных в ЭВМ
Физически, команды, исходные данные, результаты и другая информация, перерабатываемая ЭВМ, обычно представляется в виде электрических сигналов (напряжений постоянного тока). Наличие электрического сигнала, с уровнем напряжения или тока не равным нулю, означает информационную единицу, отсутствие сигнала – информационный ноль. Это обусловило применить для отображения дискретной информации двоичную систему счисления. Систему, использующую для представления любого числа комбинацию из двух цифр – 1 и 0, то есть комбинацию из двоичных разрядов. Так как двоичная система счисления относится к позиционным система, то вес цифры в двоичном числе зависит от её положения в числе. Основание двоичной системы равно 2, поэтому и веса соседних цифр в числе будут разниться в два раза. Вес первой цифры в числе равен 1, второй -2, третьей -4, четвертой -8 и т.д.
Один двоичный разряд -0 либо 1, обычно называют битом, это минимальная единица информации. Набор из восьми бит – байтом. 10110101 – один байт. Два байта – слово. Четыре байта – двойное слово. Восемь байт – учетверённое слово.
Более компактную форму записи двоичных чисел обеспечивает шестнадцатиричная система счисления, в которой каждая цифра кодируется четырьмя двоичными битами. Для написания чисел, в шестнадцатиричной системе используют 10 цифр десятичной системы и шесть букв латинского алфавита-от A до F. Каждая щестнадцатиричная цифра имеет свой вес, кратный 16, значит вес любой цифры в числе в 16 раз больше соседней справа цифры. Таким образом, крайняя правая цира имеет вес 160, следущая 161 и т.д. В таблице 1.1 приведены цифры шестнадцатиричной системы счисления и их эквиваленты.
В двоичной тетраде, кодирующей одну шестнадцатиричную цифру, каждый бит имеет определенный вес. Например, в двоичной тетраде 1111, веса битов соответственно равны – 8421. Исходя из принятой системы кодирования, десятичное число 234 будет соответствовать шестнадцатиричному числу ЕАН и двоичному 1110 1010В. (Заметим, что буква Н в числе ЕА, означает шестнадцатиричное число, а буква В в двоичном числе-признак двоичной системы).
Отрицательные числа в компьютере представляются в дополнительном коде. В дополнительном коде запись положительных чисел совпадает с их обычной записью, а отрицательные числа представлены инверсным (обратным) кодом плюс 1.
Таблица 1.1- Представление цифр в различных системах счисления
Двоичное число | Десятичный эквивалент | 16–ричный эквивалент |
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | 10 | A |
1011 | 11 | B |
1100 | 12 | C |
1101 | 13 | D |
1110 | 14 | E |
1111 | 15 | F |
0011 0101 | 53 | 35 |
1101 0110 1001 | 3433 | 0D69 |
Например: десятичное число 4 его двоичный код 0000 0100
десятичное число -4 его инверсный код 1111 1011
+
плюс единица 0000 0001
дополнительный код 1111 1100
Представление данных в дополнительном коде, дает возможность заменить операции вычитания на более простые операции сложения, что значительно упрощает структуру процессора. Пример вычитания двух десятичных чисел:
(-56) – десятичное 11001000 – его эквивалент в дополнительном коде
+ +
(+105) – десятичное 01101001 – его эквивалент в дополнительном коде
(+ 49) сумма 00110001 – сумма в двоичном коде.
При задании отрицательных чисел в программе необходимо:
если число десятичное, то перед ним достаточно поставить знак минус (-32).
если число двоичное или шестнадцатиричное, то его надо вводить в дополнительном коде.
Например: 11100000В и 0Е0Н – формы записи десятичного числа (-32) в дополнительном коде.
Введение в язык ассемблера
Прямая адресация памяти
При прямой адресации доступ к ячейкам памяти обеспечивается взаимодействием операционного блока и блока преобразования адресов. Когда операционному блоку требуется прочитать или записать операнд, находящийся в памяти, он передает значение смещения адреса блоку преобразования адресов. Последний добавляет это смещение к содержимому регистра сегмента (предварительно умноженному на 10h, то есть дополненному четырьмя нулями) и тем самым получает 20-битовый физический адрес, который и используется для доступа к операнду.
Смещение, которое вычисляется операционным блоком для доступа к находящемуся в памяти операнду, называется исполнительным адресом операнда. Исполнительный адрес показывает, на каком расстоянии (в байтах) располагается операнд от начала того сегмента, в котором он находится. Будучи 16-битовым числом без знака, исполнительный адрес позволяет получить доступ к операндам, находящимся выше начала сегмента на расстоянии до 65536 (или 64К) байтов.
При прямой адресации исполнительный адрес является составной частью команды (так же, как значения при непосредственной адресации). Микропроцессор добавляет этот исполнительный адрес к сдвинутому, влево на четыре разряда, содержимому регистра сегмента данных DS и получает 20-битовый физический адрес операнда в сегменте данных. Обычно прямая адресация применяется, если операндом служит метка или идентификатор некоторых данных, которым ассемблер при трансляции присваивает 16–битовое двоичное значение. Например, команда MOV AX,TABL загружает содержимое ячейки памяти по имени TABL в регистр АХ. Здесь ассемблер сам заменяет метку TABL на соответствующий адрес. Если перед меткой не указан сегментный регистр, то процессор по умолчанию устанавливает сегментный регистр DS. В случае, когда данные находятся в других сегментах, необходимо явно указать имя требуемого сегмента. Например:
MOV AX,TABL; ячейка TABL находится в сегменте данных DS,
MOV AX,ES:TABL; ячейка TABL находится уже в дополнительном
сегменте ES.
Адресация по базе
При адресации по базе ассемблер вычисляет исполнительный адрес с помощью сложения значения сдвига с содержимым регистров ВХ, ВР, SI, DI.
Регистр ВХ удобно использовать при доступе к структурированным записям данных, расположенным в разных областях памяти. В этом случае базовый адрес записи помещается в базовый регистр ВХ и доступ к ее отдельным элементам осуществляется по их сдвигу относительно базы, а для доступа к разным записям одной и той же структуры, достаточно соответствующим образом изменить содержимое базового регистра.
Ассемблер позволяет указывать адресуемые по базе операнды различными способами:
MOV AX,[BX] + 4;
MOV AX,[BX + 4];
MOV AX,4 [BP] ;
Этим методом организовывается доступ к одномерным массивам. Смещение соответствует адресу начала массива байтов, а цифра – индексу элемента массива, который надо считать. Необходимо учитывать что, если в роли базового регистра используется ВР, то сегмент операнда берется по умолчанию из регистра SS.
Задание данных в операторах исходной программы
Ассемблер позволяет вводить данные в следующих формах:
1. Двоичной – последовательность из цифр 0 и 1 заканчивающаяся
буквой В; например 1010110011В.
2. Восьмеричной - последовательность из цифр от 0 до 7, которая
заканчивается буквой G; например 126g.
3. Десятичной - последовательность из цифр от 0 до 9,которая может
заканчиваться буквой D; например 129D или 129.
4. Шестнадцатеричной - последовательность из цифр от 0 до 9 и букв
от A до F, заканчивающаяся буквой H. Первым
символом числа должна быть цифра; например 0Е35Н.
В этом случае 0 информирует ассемблер о том, что
Е35Н – число, а не идентификатор.
5. Литералах – строка букв, цифр и других символов, заключённых в
кавычки или апострофы и заканчивающаяся знаком $.
6. Отрицательные числа представляются в дополнительном коде.
Запись отрицательных чисел:
▪ десятичные числа записываются обычным образом, просто число со знаком: -32, -19D;
▪ двоичные числа записываются только в дополнительном коде:
-32D → 1.100000В, -19D → 1.01101В;
▪ шестнадцатеричные числа записываются только в дополнительном коде: -32D записывается как 1.ЕОН, -119D записывается как 1.89Н.
В общем виде данные представляется беззнаковым числом равным
2к - |х|,
где к – количество разрядов в ячейке отведённой под число, а х модуль отрицательного числа. Например, в ячейке размером в один байт можно представить следующие знаковые числа в дополнительном коде:
десятичное двоичное шестнадцатиричное
в дополнительном коде (-1) = 256 – 1 = 255 = 11111111b = FFh
(-2) = 256 – 2 = 254 = 11111110b = FEh
(-3 ) = 256 – 3 = 253 = 11111101b = FDh
(-126) = 256 – 126 = 130 = 10000010b = 82h
(-127) = 256 – 127 = 129 = 10000001b = 81h
(-128) = 256 – 128 = 128 = 10000000b = 80h
(+ 126) = 126 = 01111110b = 7Eh
Пример использования директив и команд в программе
Имеются матрица байт Tabb (3´2) и константа С.
|
b21 + b22 + b23
Где: b11 = 26, b12 = 44, b13 = 02; Элементы матрицы
b21 = 08, b22 = 22, b 23 = 32; байт Tabb (2x3).
С = 6; константа.
Программа:
.MODEL SMALL; Задаём малую модель структуры программы.
.STACK 300H; Определяем размер сегмента стэка - 300Н (768 байт).
.DATA; Задаём начало и описываем сегмент данных.
Text DB ‘Это пример программы $‘; Этот текст выведем на экран.
C EQU 6; Зададим байтовую константу под именем C.
Tabb db 26,44,14; Создадим таблицу десятичных байт
Db 08,22,32; размером 2 х 3.
Y dw 3 dup (?); Сюда запишем итог вычислений.
.CODE; Задаём начало и описываем сегмент команд.
str: mov AX, @data; Загрузим адрес сегмента данных в АХ.
mov DS, AX; Перешлём его в регистр DS (инициализируем DS).
mov AH,09H; Функция DOS 09Н вывода текста на экран.
lea DX,text; Перешлём в DX адрес выводимого текста.
int 21H; Команда вызова DOS.
Mov al,tabb; Перешлём b11 = 26 в регистр AL.
Mul [tabb+1]; Умножим содержимое AL на b12, теперь в АХ 0478H.
Add аl, tabb +2 ]; Сложим произведение с b13, теперь в АХ 0486H.
Mov bl, [tabb +3]; Перешлём b21 = 08 в регистр bl.
Add bl, [tabb + 4]; Сложим b 21 с b22, теперь в bl 30 ( 1EH).
Add bl, [tabb + 5]; Сложим сумму с b 23, теперь в bl 62 ( 3EH).
Div bl; Разделим АХ на сумму. Частное в al=18(12H), остаток в ah.
Mul С; Умножим al на С = 6. Теперь в АХ 108 (6CH).
Mov Y,ax; Перешлём произведение в ячейку Y.
mov AH,4CH;Функция DOS завершения программы.
mov AL,00H; код (0 ) успешного завершения программы.
int 21H; Вызов DOS.
end str ; Конец программы с указанием точки входа.
При написании исходного текста программы, обратите внимание на то чтобы файл с текстом программы имел расширение .ASM, это расширение указывает транслятору что программа написана на языке ассемблера. Приведенная программа выполнена в ЕХЕ формате. Программы в этом формате могут иметь несколько сегментов. Обычно, при написании простых программ, используется малая модель структуры программ, которая подразумевает использование трех сегментов памяти. Один из сегментов отводится под стек, размер которого задается произвольно, но не меньше 128 байт. Если не задать размер стека, то операционная система определит его размер в 1024 байта. В приведенной программе стек определен в 300Н, то есть 768 байт. Необходимо обратить внимание, что программы в ЕХЕ формате должны начинаться с инструкций инициализации сегментного регистра DS, а заканчиваться тремя командами завершения программы и выхода в DOS. После написания и сохранения программы с ней необходимо провести операцию трансляции. Трансляцию программ удобно проводить с помощью менеджера программ FAR. Подробно последовательность действия при трансляции и запуске программ описана в главе 4.
Команды сложения - ADD, ADC
Команды ADD (add - сложить) и ADC (add with carry- сложить с переносом) могут складывать как 8, так и 16-битовые операнды.
Команда ADD складывает содержимое операнда-источника и операнда-приемника и помещает результат в операнд-приемник. Формат команды: ADD приемник,источник
В символической нотации ее действия можно описать следующим образом: приемник:= приемник + источник.
Команда ADC делает то же, что и команда ADD, но складывает не два, а три слагаемых. Приемник, источник и флаг переноса. Формат команды: ADC приемник,источник + CF
В символической нотации ее действия можно описать как:
приемник:= приемник + источник + перенос.
Перенос при сложении двоичных чисел аналогичен переносу при сложении десятичных чисел в столбик. Когда ЭВМ складывает двоичные числа и сумма не помещается в операнде-приемнике, то генерируется перенос. Как известно, 8-битовый регистр может содержать значения без знака в диапазоне от 0 до 255. Если мы, например, выполним двоичное сложение чисел 250 и 10, то получим следущее:
1111 1010; двоичное представление числа 250.
+ 0000 1010; двоичное представление числа 10.
1 0000 0100; ответ: десятичное значение 260.
Результат верен, но занимает 9 двоичных битов. Если при выполнении этой операции мы использовали 8-битовые регистры, то младшие 8 битов будут занесены в регистр-приемник, а девятый бит- во флаг переноса CF. Теперь нетрудно понять, почему микропроцессор 8086 имеет две разные команды сложения. Одна из них (ADD) может складывать значения, представляемые байтами или словами, а также младшие части значений повышенной точности. Другая команда (ADC) используется для сложения старших частей значений повышенной точности.
Например, команда ADD AX,CX;
складывает 16-битовые значения регистров АХ и СХ и возвращает результат в регистр АХ. Если операнды имеют длину более 16 битов, то можно воспользоваться командами которые складывают 32-битовое число, находящееся в регистрах СХ и DX, с 32-битовым числом, находящимся в регистрах АХ и ВХ в два приема. Например:
ADD АХ,СХ; Сначала сложить младшие 16 бит, а затем
ADC BX,DX; старшие 16 бит.
Складываемые операнды могут находиться в памяти, регистре или иметь непосредственное значение.
Например:
ADD АХ,MEM_WORD; Добавить содержимое ячейки памяти к регистру
ADD MEM_WORD,AX; или наоборот.
ADD AL, 10; Добавить константу к регистру
ADD MEM_BYTE,OFH; или к ячейке памяти.
Допускается большинство возможных комбинаций, но нельзя добавить значение одной ячейки памяти к другой или использовать в качестве приемника непосредственное значение.
Команды ADD и ADC могут воздействовать на следующие шесть флагов:
флаг переноса CF равен 1, если результат сложения не помещается в операнде-приемнике, в противном случае он равен 0;
флаг четности PF равен 1, если результат имеет четное число битов со значением 1, в противном случае он равен 0;
вспомогательный флаг переноса AF равен 1, если результат сложения десятичных чисел требует коррекции, в противном случае он равен 0;
флаг нуля ZF равен 1, если результат равен 0, в противном случае он равен 0;
флаг знака SF равен 1, если результат отрицателен (старший бит равен 1), в противном случае он равен 0
флаг переполнения OF равен 1, если слагаемое двух чисел одного знака превышает диапазон допустимых значений приемника в обратном коде, а сам приемник при этом меняет знак. Иначе флаг OF равен 0.
Флаги SF и OF имеют смысл только при сложении чисел со знаком, а флаг AF только при сложении десятичных чисел.
Таблица 3.6 Система команд процессоров Intel 8086 – Intel 80386
Команды пересылки данных
Пересылка данных без преобразования
Мнемокод
Описание команд
Флаги, пояснения, примеры.
DF
IF
TF
SF
ZF
AF
PF
MOV пр,ист
Пересылка операнда
Пр: = ист.
R / M, R / М / IM
--
--
--
--
--
--
--
Mov ax , bx; Копирует содержимое
ВХ в АХ.
Mov ax , tab; Копирует содержимое
ячейки Tab в АХ.
Mov в l ,78; Переслать const в регистр
MOVSB
MOVSW
MOVSD
Пересылка цепочки
байт, слов, двойных слов с автомодифи-кацией индексов.
Пр: = ист. ES:[(E)DI]:=DS:(E)SI]
--
--
--
--
--
--
--
--
Cld; Направление вперед.
Lds si , tab 1; Указали источник.
Les di , tab 2; Указали приемник.
Mov cx ,5; Счетчик повторения
Rep Movsw; Копирует 5 слов
PUSH ист.
Запись операнда в стек SS: [SP]: = ист.
Ист – M/ R/ IM
--
--
--
--
--
--
--
--
Push ax; Заносит содержимое АХ
в стек по адресу [ss:sp]
PUSHA
Запись в стек значений регистров
AX, CX, DX, BX,
SP, BP, SI, DI.
--
--
--
--
--
--
--
--
Pusha;Сохраняет в стеке по адресу SS:[SP] содержимое всех
16- разрядных РОН.
PUSHAD
Запись в стек значений регистров
EAX, ECX, EDX, EBX ESP, EBP, ESI, EDI.
--
--
--
--
--
--
--
Pushad; Сохраняет в стеке по
адресу SS: [SP] содержимое
32- разрядных регистров
общего назначения.
POP пр.
Восстановить операнд из стека
Пр:= SS: [SP];
M/ R: = SS: [SP]
--
--
--
--
--
--
--
--
Р op ax; Извлекает из вершины
стэка слово и записывает
его в регистр АХ
Pop mem; или ячейку памяти.
Продолжение таблицы 3.6
Мнемокод | Описание команд | Флаги, пояснения, примеры. | |||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||||||||
POPA | Восстановить из стека регистры DI, SI, BP, SP, BX, DX, CX, AX. | -- | -- | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||
Popa; Извлекает 8 слов из стека, помещает их в указанные регистры и увеличивает SP на 16. | |||||||||||||||||||||||||||||
POPAD | Загрузить из стека регистры EDI, ESI, EBP, ESP, EBX, EDX, ECX, EAX. | -- | -- | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||
Popad; Копирует 8 двойных слов из стека, в регистры и увеличивает регистр SP на 32. | |||||||||||||||||||||||||||||
XCHG пр, ист | Обмен Пр< = > ист. Приемник - регистр , источник- регистр или ячейка памяти. | -- | -- | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||
Xchg ax , bx; Взаимный обмен между регистрами Xchg ax , mem или памятью и регистром. | |||||||||||||||||||||||||||||
XLAT
| Преобразование кодов. AL:= DS: [BX + AL] | -- | -- | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||
Применяется для трансляции таблиц. Пример использования команды XLAT приведен в разделе 5.4. | |||||||||||||||||||||||||||||
Пересылка данных с преобразованием | |||||||||||||||||||||||||||||
MOVZX пр,ист. |
MOVSX пр,ист. |
Мнемокод |
Описание команд | Флаги, пояснения, примеры | |||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||||||||
OUT пр,ист |
Команды пересылки адреса | ||||||||||||||||||||||||||||
LEA пр,ист. |
Арифметические команды | ||||||||||||||||||||||||||||
Команды сложения | |||||||||||||||||||||||||||||
Мнемокод |
Описание команд | Флаги, пояснения, примеры | |||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||||||||
ADD пр,ист. |
Сложение операндов Пр:= пр + ист r/m/i,r/m/im. | * | -- | -- | -- | * | * | * | * | * | |||||||||||||||||||
Add ax , memw; Добавить содержи- мое ячейки памяти к регистру AX. Add memw , ax; или наоборот. Add al ,10; Добавить 10 к AL. Add ax , bx; Сложить два регистра. | |||||||||||||||||||||||||||||
ADC пр,ист. |
Команды вычитания | ||||||||||||||||||||||||||||
Мнемокод |
Описание команд | Флаги, пояснения, примеры | |||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||||||||
SUB пр,ист. |
Целочисленное вычитание. Пр.: = пр. – ист. | * | -- | -- | -- | * | * | * | * | * | |||||||||||||||||||
Mov ax ,1329; Загружает 531H в AX, Mov bx ,373; Загружает 175H в BX, Sub ax,bx; AX = 956 (3BCH). | |||||||||||||||||||||||||||||
SBB пр,ист. |
Вычесть с заемом. Вычитает из приемника источник и содержимое флага CF. Пр.:= пр. – ист. – CF | * | -- | -- | -- | * | * | * | * | * | |||||||||||||||||||
Mov ax , 1329; Загрузить 531H в AX. Mov bx ,373; Загрузить 175H в BX. Sub al , bl; Вычесть 75H из 31H, Sbb ah , bh; Вычесть 1 и CF из 5, давая 3. Полная разность в AX = 956 (3BCH) | |||||||||||||||||||||||||||||
DEC пр. |
Декремент операнда. Уменьшение операнда на 1. Пр.: = пр. – 1 | * | -- | -- | -- | * | * | * | * | -- | |||||||||||||||||||
Mov ax ,956; Загружает 3ВСН в АХ. Dec ax ; Уменьшает АХ на 1, АХ = 955 (3ВВН). | |||||||||||||||||||||||||||||
NEG пр.
|
Инкремент операнда. Пр.: = пр. + 1 или Пр.: = 0 – пр. | * | -- | -- | -- | * | * | -- | * | * | |||||||||||||||||||
Mov ax ,579 BH; В АХ 579ВН. Neg ax; В АХ 0А865Н (то же что и вычитание операнда из нуля. | |||||||||||||||||||||||||||||
AAS
| ASCII- коррекция AL после вычитания Если AL > 9 То AL:=0000XXXX-6 Установить AL:=0000XXXX AH:=AH - 1 | * | -- | -- | -- | ? | ? | * | ? | * | |||||||||||||||||||
Mov al ,34Н; Загружаем вычитаемые представленные в ASCII формате Mov bl , 38Н; в AL и BL. Sub al,bl;Из AL вычли 8. Aas; AX=FF06H, CF=AF=1. OR ax ,0030 H; Преобразуем результат в ASCII код. | |||||||||||||||||||||||||||||
CMP пр., ист. | Сравнение. Вычитает второй операнд из первого, устанавливая признаки в регистре флагов. Пр. – ист. | * | -- | -- | -- | * | * | * | * | * | |||||||||||||||||||
Mov ax ,956; Загружает 3ВСН в АХ Mov bx ,373; Загружает 175Н в ВХ Cmp ax , bx; Вычитает из ax, bx и устанавливает флаги. В АХ осталось 956. | |||||||||||||||||||||||||||||
Продолжение таблицы 3.6
Команды умножения | ||||||||||||||||||
Мнемокод |
Описание команд | Флаги, пояснения, примеры | ||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | ||||||||||
MUL ист. |
Беззнаковое умножение. AX : = AL × ист.
| * | -- | -- | -- | ? | ? | ? | ? | * | ||||||||
Mov al ,80 H;В АL загружается 128. Mov bl ,47H; В ВL загружается 64. Mul bl; В AX результат -2000 (7D0).
| ||||||||||||||||||
IMUL ист. IMUL пр,ист. |
Знаковое умножение AX := AL × ист. DX : AX = AX × ист EDX : EAX:= EAX × ист | * | -- | -- | -- | ? | ? | ? | ? | * | ||||||||
Mov al ,80 H;В АL загружается -128. Mov bl ,47H; В ВL загружается 64. Imul bl; В AX результат E000Н. | ||||||||||||||||||
AAM | Преобразование данных из ASCII кода, в двоичный код после умножения. Делит AL на 10. Частное в AH. Остаток в AL. | ? | -- | -- | -- | * | * | ? | * | ? | ||||||||
Mov al , 35 H; Сомножители в ASCII Mov cl , 39 H; формате. And al , 0 FH; Преобразуем в And cl , 0 FH; двоичный код. Mul cl; Умножим AL на CL. AAM; Преобразуем результат. OR ax , 3030 H; Представим его в ASCII формате.
| ||||||||||||||||||
Команды деления | ||||||||||||||||||
DIV ист. |
Беззнаковое деление. Пр:= DX:AX / ист. Ист.-DB -байт Частное AL:= AX/ист Остаток AH:= AX/ист Ист.- DW- слово AX:DX := DX:AX/ ист Ист. – DD- дв. слово EDX,EAX:=EDX, EAX / ист.
| ? | -- | -- | -- | ? | ? | ? | ? | ? | ||||||||
Mov al , byte 1; Переслать в AL байт. Sub ah , ah; Расширить делимое. Div byte 2; Деление байта на байт. Mov ax , word 1; В АН слово. Div byte 1; Деление слова на на байт. Mov dx , word 2; В DX слово2. Mov ax , word 3; В AX слово3. Div word 1; Дв.слово на слово Mov edx , dword 4; В ЕDX дв.слово. Mov eax , dword 5; В ЕAX дв.слово. Div dword 6; Деление учетверенного слова на двойное слово
| ||||||||||||||||||
Продолжение таблицы 3.6
Мнемокод |
Описание команд | Флаги, пояснения, примеры | |||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||||||
IDIV ист. |
Знаковое деление. Выполняет деление знаковых чисел. Пр:= пр / ист. | ? | -- | -- | -- | ? | ? | ? | ? | ? | |||||||||||||||||
Mov ax ,956; Загрузим 3ВСН в АХ. Mov bx,-300; В BX 0FED4H. Idiv bx; AL = -3 (0FFFDH) в AH =56. | |||||||||||||||||||||||||||
AAD | Преобразование данных в ASCII-коде в двоичный код перед делением. AL := (AL+ (10×AH)) | ? | -- | -- | -- | * | * | ? | * | ? | |||||||||||||||||
Mov ax ,1405 H; Делимое в АХ. Mov bl ,3; Делитель загрузим в ВХ. And 0F0F; Распакуем делимое. Aad; Коррекция делимого.(в АХ 45) Idiv BL; Результат в АХ = 15. | |||||||||||||||||||||||||||
Команды расширения знака | |||||||||||||||||||||||||||
CBW |
Преобразовать байт в слово. AH 8- 15 : = AL 7 | -- | -- | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||
Mov al ,0 FCH; Загрузим – 4 в AL. Cbw; В АХ 0FFFCH (- 4). | |||||||||||||||||||||||||||
CWD |
CDQ |
Логические команды | |||||||||||||||||||||||||
AND пр., ист | Конъюкция ^ (логическое И) Пр:= пр. ист. R:= R R, M:= R M, R:= R M, R/M:= R/M im | 0 | -- | -- | -- | * | * | ? | * | 0 | |||||||||||||||||
Mov ax ,5963 H; Загружает 16– ричное число в АХ. Mov bx ,6 CA 5 H; Загружает 16– ричное число в АХ. And ax , bx; Теперь АХ содержит 4821Н.
| |||||||||||||||||||||||||||
Продолжение таблицы 3.6
Мнемокод |
Описание команд | Флаги, пояснения, примеры | |||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||
OR пр, ист. |
Дизъюнкция (логическое ИЛИ) Пр:= пр. ист. R:= R R, M:= R M, R= R M, R:= R im, M:= M im. | 0 | -- | -- | - | * | * | ? | * | 0 | |||||||||
Mov ax ,5963 H; Загружает 16– ричное число в АХ. Mov bx ,6 CA 5 H; Загружает 16– ричное число в АХ. Or ax , bx; Теперь АХ содержит 7DE7H.
| |||||||||||||||||||
XOR пр, ист |
Неравнозначность (исключающее ИЛИ) Пр:= пр. ^ ист. R:= R ^ R, M:= R ^ M, R:= R ^ M, R:= R ^ im, M:= M ^ im | 0 | -- | -- | -- | * | * | ? | * | 0 | |||||||||
Mov ax ,5963 H; Загружает 16– ричное число в АХ. Xor ax,6CA5H; AX = 35C6H; SF= 0, PF= 1. Команда XOR применяется для реализации функций проверки и сравнения бит.
| |||||||||||||||||||
NOT пр. |
Инвертирование (логическое НЕ) пр:= пр; , | -- | -- | -- | -- | -- | -- | -- | -- | -- | |||||||||
Mov ax ,579 BH; Загрузим данные в АХ. Not ax; Получим в АХ 0А864Н | |||||||||||||||||||
TEST пр., ист. |
Команды сдвиг а | ||||||||||||||||||
SAL Пр., счетчик (n) |
Сдвиг арифметичес-кий влево n CF, пр:= пр.,CL/im n- количество сдвигов, заносится в CL, если 2< n <31, и im, если равно 1. | * | -- | -- | -- | * | * | ? | * | * | |||||||||
Mov ax , 1110100101010111 B; В АХ 0Е957Н. Mov cl , 4; В CL количество сдвигов. Sal ax , cl; В АХ 1001010101110000В, - 9570Н, CF =0 Sal ax ,; В АХ 0010101011100000В, CF=1 | |||||||||||||||||||
Продолжение таблицы 3.6
Мнемокод |
Описание команд | Флаги, пояснения, примеры | ||||||||||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | ||||||||||||||||||||||||||||
SAR пр., счетчик (n) |
SHL пр., Счетчик (n) |
Сдвиг логический влево n CF, пр:= пр, CL/im n- количество сдвигов, заносится в CL, если 2< n < 31, и im, если равно 1. | * | -- | -- | -- | * | * | ? | * | * | |||||||||||||||||||||||||
Mov ax , 1110100101010111 B; В АХ 0Е957Н. Mov cl , 4; В CL количество сдвигов. S h l ax , cl; В АХ 1001010101110000В , - 9570Н. Shl ax , 1; В АХ 0010101011100000В. | ||||||||||||||||||||||||||||||||||||
SHR пр., счетчик (n)
|
Сдвиг логический вправо n CF, пр:= пр, CL/im n- количество сдвигов, заносится в CL, если 2< n < 31, и im, если равно 1. | * | -- | -- | -- | * | * | ? | * | * | ||||||||||||||||||||||||||
Mov ax , 1110100101010111 B; В АХ 0Е957Н. Mov cl , 4; В CL количество сдвигов. Shr ax , cl; В АХ 0000111010010101В , 0E95Н. Shr ax , 1; В АХ 0000011101001010В
| ||||||||||||||||||||||||||||||||||||
RCL пр., счетчик (n)
|
Описание команд | Флаги, пояснения, примеры | ||||||||||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | ||||||||||||||||||||||||||||
RCR пр., счетчик (n) |
Переноса. ROL пр., счетчик (n) |
Сдвиг циклический влево. ROR пр, счетчик (n) |
Сдвиг циклический вправо. Описание команд | Флаги, пояснения, примеры | ||||||||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | ||||||||||||||||||||||||||||
BTS база, смещение |
Проверка и установка бита. Бит по адресу: база +смещение:= 1. BTS R/M , R/ im | -- | -- | -- | -- | -- | -- | -- | -- | * | ||||||||||||||||||||||||||
Выбирает бит и устанавливает в 1. Mov ax ,6652 h; Данные в АХ. BTS ax , 2; Устанавливает 2-й бит в 1. В АХ 6656Н, в CF занесется 0. | ||||||||||||||||||||||||||||||||||||
BTR база, смещение |
Проверка и сброс бита. Бит по адресу: база +смещение:= 0. BTR R/M , R/ im | -- | -- | -- | -- | -- | -- | -- | -- | * | ||||||||||||||||||||||||||
Выбирает бит и устанавливает в 0. Mov ax ,6652 h; Данные в АХ. BTR ax , 1; Устанавливает 1-й бит в 0. В АХ 6650Н, в CF занесется 1. | ||||||||||||||||||||||||||||||||||||
BTC база, cмещение |
Проверка и инверсия бита. Инвертировать бит по адресу: база +смещение. | -- | -- | -- | -- | -- | -- | -- | -- | * | ||||||||||||||||||||||||||
Mov ax ,6652 h; Данные в АХ. BT C ax , 1; Инверсия первого бита. Теперь в АХ 6650Н, в CF -1. | ||||||||||||||||||||||||||||||||||||
BSF пр.,ист. | Прямой поиск бита. Пр:= N первого единичного бита источника. | -- | -- | -- | -- | -- | * | -- | -- | -- | ||||||||||||||||||||||||||
Mov ax ,6650 h; Данные в АХ. BSF вх, ах; В ВХ заносится 4. Mov tab ,6400 h; Данные в ячейку tab. BSF вх, t а b; В ВХ заносится 10. | ||||||||||||||||||||||||||||||||||||
BSR пр.,ист. | Обратный поиск бита. Пр:= N первого Команды обработки строк | |||||||||||||||||||||||||||||||||||
Команды сравнения строк | ||||||||||||||||||||||||||||||||||||
REP REPE REPNE REPZ REPNZ | Повторять Повторять, пока равно. Повторять, пока не равно. Повторять, пока ноль. Повторять, пока не ноль. | Префиксы повторений для строковых команд. Количество повторений в регистре СХ или (ЕСХ). При каждом выполнении команды СХ или (ЕСХ) уменьшаются на 1. | ||||||||||||||||||||||||||||||||||
Продолжение таблицы 3.6
Мнемокод |
Описание команд | Флаги, пояснения, примеры | |||||||||||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||||||||||||||||
* | -- | -- | -- | * | * | * | * | * | |||||||||||||||||||||||||||||
CMPS пр.,ист. | Сравнить строки. Вычитает из источника приемник. DS:[(E)SI]- ES:[(E)DI] IF DF= 1, (E)DI:= (E)DI-1,(2),(4), (E)SI:= (E)SI- 1,(2),(4) | CLD; Установить флаг DF в 0. Mov cx ,100; Установить счетчик цикла на 100. Repe Cmps tab 1, tab 2; Сравнивать 100 элементов до нахождения несовпадающих. | |||||||||||||||||||||||||||||||||||
CMPSВ |
Сравнить строки байтов. DS:[(E)SI]- ES:[(E)DI] IF DF= 0, то (E)DI:= (E)DI+1 (E)SI:= (E)SI +1 | * | -- | -- | -- | * | * | * | * | * | |||||||||||||||||||||||||||
STD; Установить флаг DF в 1. Mov cx ,100; Установить счетчик цикла на 100. Repne Cmpsb tab 1, tab 2;Сравнивать 100 байтов до нахождения совпадающих. | |||||||||||||||||||||||||||||||||||||
CMPSW
|
Сравнить строки слов.
[DS[E)SI]-[ES[E)DI] IF DF:= 0, то (E)DI:= (E)DI+ 2 (E)SI:= (E)SI+ 2 IF DF:= 1, то (E)DI:= (E)DI- 2 (E)SI:= (E)SI- 2
| * | -- | -- | -- | * | * | * | * | * | |||||||||||||||||||||||||||
STD; Установить флаг DF в 1. Mov cx ,100; Установить счетчик цикла на 100. Repne Cmpsw tab 1, tab 2; Сравнивать 100 слов до нахождения совпадающих. Je m 1; При совпадении, передать управление в m1. | |||||||||||||||||||||||||||||||||||||
CMPSD
|
Команды пересылки строк | ||||||||||||||||||||||||||||||||||||
Мнемокод | Описание команд | Флаги, пояснения, примеры | |||||||||||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||||||||||||||||
MOVS Пр.,ист.
|
Пересылать строковые данные Пр:= ист ES:[DI]:= DS: [SI] СХ:= СХ-1 | -- | -- | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||||||||||
CLD; Установить DF = 0. Lea SI , tabist; Адрес источника в SI, Lea DI , ES : tabpr; а приемника в DI. Mov CX ,100; Кол. элементов в СХ Rep Movs tabpr,tabist; Переслать 100 элементов. | |||||||||||||||||||||||||||||||||||||
MOVSB |
Переслать строку байт. ES: [DI]:= DS: [SI] IF DF := 0, то DI := DI+ 1 SI := SI+ 1 IF DF:= 1, то DI := DI- 1 SI := SI- 1 | -- | -- | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||||||||||
CLD; Установить DF = 0. Lea SI , tabist;Адрес источника в SI, Lea DI , ES : tabpr; а приемника в DI. Mov CX ,100;Кол. элементов в СХ Rep Movs tabpr,tabist; Переслать 100 байт. | |||||||||||||||||||||||||||||||||||||
MOVSW |
Пересылать строку слов. ES: [DI] := DS: [SI] IF DF:= 0, то DI := DI+ 2 SI := SI+ 2 IF DF:= 1, то DI := DI- 2 SI := SI- 2 | -- | -- | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||||||||||
CLD; Установить DF = 0. Lea SI , tabist; Адрес источника в SI, Lea DI , ES : tabpr; а приемника в DI. Mov CX ,100; Кол. элементов в СХ. Rep Movs tabpr,tabist; Переслать 100 слов. | |||||||||||||||||||||||||||||||||||||
MOVSD |
Мнемокод |
Описание команд | Флаги, пояснения, примеры | ||||||||||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||||||||||||||||
LODS ист. |
Чтение из строки. AL, (AX),(EAX) := DS:[ (E)SI] IF DF = 0, то [(E)SI] := [(E)SI + 1,(2),(4)] IF DF =1, то [(E)SI] := [(E)SI - 1,(2),(4)] | -- | * | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||||||||||
Lea SI,tab1; Смещение tab1 в SI, а Lea DI,ES:tab2; смещение tab2 в DI. Mov CX,200; Счетчик элементов. Repe Cmps tab 1, tab 2; Искать совпадающие. Je met 1;Совпали? Переход на met1. Met 1: Dec SI; Подправим регистр SI. Lods tab1; Элемент в AL,(AX),(EAX). | |||||||||||||||||||||||||||||||||||||
LODSB
|
Чтение байта из строки. AL:= DS: [(E)SI ] IF DF= 0, то [(E)SI]:= [(E)SI+1] IF DF= 1. то [(E)SI]:= [(E)SI-1] | -- | * | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||||||||||
Lea SI,tab1; Смещение tab1 в SI, а Lea DI,ES:tab2; смещение tab2 в DI. Mov CX,200; Счетчик элементов. Repe Cmpsb; Искать совпадающие. Je met 1; Совпали? Переход на met1. Met 1: Dec SI; Подправим регистр SI. Lodsb; Элемент в AL. | |||||||||||||||||||||||||||||||||||||
LODSW
|
Чтение слова из строки. AX:= [ DS: (E)SI ] IF DF= 0. то [(E)SI]:= [(E)SI+2] IF DF= 1. то [(E)SI]:= [(E)SI-2] | -- | * | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||||||||||
Lea SI,tab1; Смещение tab1 в SI, Lea DI,ES:tab2; а смещение tab2 в DI. Mov CX ,200; В СХ элементов. Repe Cmpsw; Искать совпадающие. Je met 1;Совпали? Переход на met1. met1: Mov SI,SI-2; Коррекция SI. Lodsw; Элемент в AX.
| |||||||||||||||||||||||||||||||||||||
LODSD
|
Описание команд | Флаги, пояснения, примеры | |||||||||||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||||||||||||||||
STOS пр
|
Запись в строку. ES:[(E)DI] := AL; (AX); (EAX) IF DF = 0, то (E)DI := (E)DI+1(2)(4) IF DF =1, то (E)DI:=(E)DI-1(2)(4)
| -- | * | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||||||||||
Lea DI , ES : tab; Адрес строки в DI. Mov AX ,0101Н; Число в АХ. Mov CX ,10; Установить счетчик. REP STOS tab;Записать в tab 10 слов. Mov CX ,10; Установить счетчик. Mov AX ,1256; Число в АХ. REP STOS tab;Записать в tab 10 слов. | |||||||||||||||||||||||||||||||||||||
STOSB
|
Запись байта в строку ЕS: [(E)DI]:= AL IF DF= 0. то [(E)DI]:= [(E)DI+ 1] IF DF= 1 [(E)DI]:= [(E)DI- 1] | -- | * | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||||||||||
Lea DI , ES : tab; Адрес строки в DI. Mov AL ,01Н; Число в АL. Mov CX ,10; Установить счетчик. REP STOSB tab; Записать в tab 10 байт. | |||||||||||||||||||||||||||||||||||||
STOSW | Запись слова в строку. ES: [(E)DI]:= AX IF DF= 0, то [(E)DI]:= [(E)SI+ 2] IF DF= 1, то [(E)DI]:= [(E)DI- 2] | -- | * | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||||||||||
Lea DI,ES:tab; Адрес строки в DI. Mov AX,0125 Н; Число в АX. Mov CX,10; Установить счетчик. REP STOSW; Записать в tab 10 слов. | |||||||||||||||||||||||||||||||||||||
STOSD
| Запись двойного слова в строку. ES: (E)DI := EAX IF DF= 0, то [(E)DI]:= [(E)DI+ 4] IF DF= 1, то [(E)DI]:= [(E)DI- 4] | -- | * | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||||||||||
Lea DI , ES : tab; Адрес строки в DI. Mov EAX ,012567Н; Число в EАX. Mov CX ,10; Установить счетчик. REP STOSD; Записать в таблицу tab 10 двойных слов. | |||||||||||||||||||||||||||||||||||||
SCAS пр. |
Описание команд | Флаги, пояснения, примеры | |||||||||||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||||||||||||||||
SCASB |
Сканировать строку байтов. SCASW |
Сканировать строку слов. AX - ES: (E)DI Результат сравнения в регистре флагов. IF DF= 0 (E)DI:= (E)DI+ 2 IF DF= 1 (E)DI:= (E)DI- 2 | * | * | -- | * | * | * | * | * | * | ||||||||||||||||||||||||||
Lea DI , ES : tab; Адрес строки в DI. Mov AX ,0125Н; Искомое число в АX. Mov CX ,100; Установить счетчик. REPNE SCASW ;Сравнивать пока не найдем в tab число равное 0125Н. SUB DI ,2 ;Поправим DI. Mov BX , DI ;Номер совпадающей ячейки в BX. | |||||||||||||||||||||||||||||||||||||
Безусловный переход Передает управление на метку, безусловно. IP:= [R]/ Label Адрес перехода в регистре или метке ячейки памяти. | -- | -- | -- | -- | -- | -- | -- | -- | -- | ||||||||||||||||||||||||||||
JMP short met; Короткий переход на -128или +127 байт. JMP met2; Ближний переход на JMP near met2; -32768 или 32767 байт. JMP far met3; Дальний переход более 65536 байт. | |||||||||||||||||||||||||||||||||||||
CALL имя
|
Вызов процедуры. IP:= [R]/имя [SS:SP]:= IP SP:= SP-2 | -- | -- | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||||||||||
4F05 Call pr; Вызов процедуры pr и 4F08 Mov ax , bx; запись в стек адреса возврата (4F08). | |||||||||||||||||||||||||||||||||||||
RET |
Возврат из процедуры. IP:= [ SS:SP ] SP:= SP+2
| -- | -- | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||||||||||
Ret pr; Выйти из процедуры и вернуться в основную программу по адресу 4F08. Эта команда аканчивает процедуру. | |||||||||||||||||||||||||||||||||||||
Продолжение таблицы 3.6
Мнемокод |
Описание команд | Флаги, пояснения, примеры | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JPO met7 | Перейти, если в АХ нечетное число единиц. IF PF= 0 IP:= [близкая метка] | -- | -- | -- | -- | -- | -- | -- | 0 | -- | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mov ax , 25; Загрузить число 25 в АХ. Mul bx; Умножить на ВХ. Jp о met7; Перейти на met7, если в АХ нечётное число единиц. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Перейти, если: - больше или равно; - не меньше. IF SF= OF met2- близкая метка. | * | -- | -- | -- | * | -- | -- | -- | -- | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Cmp ax , bx; Сравнить с ВХ. Jge met2; Перейти на met2, если AX больше или равен BX. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JL met3 JNGE met3 |
Перейти, если: - меньше; - не больше и не равно. IF SF ≠ OF IP:= [met3] мet3- близкая метка. | * | -- | -- | -- | * | -- | -- | -- | -- | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mov ax ,7025; Загрузить число в АХ. Cmp ax , bx; Сравнить с ВХ. Jl met3; Перейти на met3, если AX меньше BX. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JCXZ мет4 |
Перейти, если: - значение CX= 0. IF CX= 0 IP:= [близкая метка] | Cmp с x , 0; СХ равен 0 ? JCXZ met4; Перейти на met, если да. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JLE met5 JNG met5
|
Перейти, если: - меньше или равно - не больше IF ZF= 1 или SF≠ OF IP:= [близкая метка] | * | -- | -- | -- | * | 1 | -- | -- | -- | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mov ax ,7025; Загрузить число в АХ. Cmp ax , bx; Сравнить с ВХ. Jl е met5; Перейти на met5, если AX меньше BX. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JLE met5 JNG met5 |
Перейти, если: - меньше или равно - не больше IF ZF= 1 или SF≠ OF IP:= [близкая метка] | * | -- | -- | -- | * | 1 | -- | -- | -- | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mov ax ,7025; Загрузить число в АХ. Cmp ax , bx; Сравнить с ВХ. Jl е met5; Перейти на met5, если AX меньше BX. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Продолжение таблицы 3.6
Команды переходов по флагам | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Мнемокод |
Описание команд | Флаги, пояснения, примеры | ||||||||||||||||||||||||||||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | ||||||||||||||||||||||||||||||||||||||||||||||
JZ met1 |
Перейти, если ноль IF ZF=1, IP:= [met1] met1-(близкая метка) | -- | -- | -- | -- | -- | 1 | -- | -- | -- | ||||||||||||||||||||||||||||||||||||||||||||
Sub ax , bx; Вычесть из АХ ВХ. Jz met; Перейти, если ZF =1. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
JNZ met1 |
Перейти, если не ноль. IF ZF=0, IP:= [met1] | -- | -- | -- | -- | -- | 0 | -- | -- | -- | ||||||||||||||||||||||||||||||||||||||||||||
Sub ax , bx; Вычесть из АХ ВХ. Jnz met; Перейти, если ZF =0. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
JS met2 |
Перейти, если знак IF SF= 1, IP:= [met2] мet-(близкая метка) | -- | -- | -- | -- | 1 | -- | -- | -- | -- | ||||||||||||||||||||||||||||||||||||||||||||
Sub ax , bx; Вычесть из АХ ВХ. Js met2; Перейти, если SF =1. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
JNS met3 |
Переход, если не знак IF SF= 0, IP:= [met3] met2-(близкая метка) | -- | -- | -- | -- | 0 | -- | -- | -- | -- | ||||||||||||||||||||||||||||||||||||||||||||
Sub ax , bx; Вычесть из АХ ВХ. Jns met3; Перейти, если SF =0. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
JO met4
|
Перейти, если переполнение IF OF= 1, IP:= [met4] met3-(близкая метка) | 1 | -- | -- | -- | -- | -- | -- | -- | -- | ||||||||||||||||||||||||||||||||||||||||||||
Add ax , bx; Сложить АХ и ВХ. J о met4; Перейти, если ОF =1. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
JNO met5
|
Перейти, если Не переполнение IF OF= 0, IP:= [met5] мet4-(близкая метка) | 0 | -- | -- | -- | -- | -- | -- | -- | -- | ||||||||||||||||||||||||||||||||||||||||||||
Add ax , bx; Сложить АХ и ВХ. Jn о met5; Перейти, если ОF =0. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
JP mеt6 |
Команды управления циклом | |||||||||||||||||||||||||||||||||||||||||||||||||||||
Мнемокод |
Описание команд | Флаги, пояснения, примеры | ||||||||||||||||||||||||||||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | ||||||||||||||||||||||||||||||||||||||||||||||
LOOP met | Повторять цикл пока СХ ≠ 0. CX:=CX-1 If CX ≠ 0, then Go met. | -- | -- | -- | -- | -- | -- | -- | -- | -- | ||||||||||||||||||||||||||||||||||||||||||||
Mov cx ,10; Число повторений в СХ. Mov ax ,45; Число в АХ. L : Add ax , bx; Сложить с ВХ. Loop L; Повторить сложение 10 раз. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
LOOPE met LOOPZ met
| Повторять цикл пока CX ≠ 0 и ZF = 1: - пока равно, или
- пока ноль. CX:=CX-1 If CX ≠ 0 and ZF=1 then Go to met. | -- | -- | -- | -- | -- | -- | -- | -- | -- | ||||||||||||||||||||||||||||||||||||||||||||
Mov cx ,10; Число повторений в СХ. Mov ax ,45; Число в АХ. L : Cmp ax ,[ bx ]; Сравнить с содержи- мым ячейки по адресу [bx] Inc bx ; Увеличить адрес на 1. Loope L; Повторить сравнение 10 раз. Dec bx ; Уменьшить адрес на 1. Mov dx , bx ; Адрес ячейки в DX. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
LOOPNE met LOOPNZ met
| Повторять цикл пока CX ≠ 0 и ZF= 0: - пока не равно или,
- пока не ноль CX:= CX - 1 If CX ≠ 0 and ZF= 0 then Go to met. | -- | -- | -- | -- | -- | -- | -- | -- | -- | ||||||||||||||||||||||||||||||||||||||||||||
Mov cx ,10; Число повторений в СХ. Mov ax ,45; Число в АХ. L : Cmp ax ,[ bx ]; Сравнить с содержи- мым ячейки по адресу [bx] Inc bx ; Увеличить адрес на 1. Loopne L; Повторить сравнение. Dec bx ; Уменьшить адрес на 1. Mov dx , bx ; Адрес ячейки в DX. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Установить, если: ниже, Перенос. IF CF= 1, пр.:= 1. | -- | -- | -- | -- | -- | -- | -- | -- | 1 | |||||||||||||||||||||||||||||||||||||||||||||
М ov cx , 54 H; Операнд для сравнения Cmp cx , 75 H; Сравнение, CF = 1. SET С AL; AL устанавливается в 1. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Продолжение таблицы 3.6
Мнемокод | Описание команд | Флаги, пояснения, примеры | ||||||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | ||||||||||||||||||||||||
SETBE пр. SETNA пр. |
Установить, если равно, ноль. IF ZF= 1, пр.:= 1. | -- | -- | -- | -- | -- | 1 | -- | -- | -- | ||||||||||||||||||||||
М ov cx , 54 H; Операнд для сравнения Cmp cx , 54 H; Сравнение, ZF = 1. SET E AL; AL устанавливается в 1. | ||||||||||||||||||||||||||||||||
SETNE пр. SETNZ пр. |
Установить, если Не равно, не нуль. IF ZF= 0, пр.:= 1. | -- | -- | -- | -- | -- | 0 | -- | -- | -- | ||||||||||||||||||||||
М ov cx , 54 H; Операнд для сравнения Cmp cx , 86 H; Сравнение, ZF = 0 SETNZ AL; AL устанавливается в 1 | ||||||||||||||||||||||||||||||||
SETP пр SETPE пр. |
Установить, если четно, паритет чётный. IF PF= 1, пр.:= 1.
| -- | -- | -- | -- | -- | -- | -- | 1 | -- | ||||||||||||||||||||||
М ov cx , 55 H; Операнд в СХ. ADD cx , 86 H; Добавить к СХ 86Н. SETP CL; AL устанавливается в 1. | ||||||||||||||||||||||||||||||||
SETNP пр. SETPO пр. |
Установить, если нечетно, паритет нечетный. IF PF= 0, пр.:= 1 | -- | -- | -- | -- | -- | -- | -- | 0 | -- | ||||||||||||||||||||||
М ov cx , 54 H; Операнд в СХ. ADD cx , 86 H; Добавить к СХ 86Н. SETNP AL; AL устанавливается в 1.
| ||||||||||||||||||||||||||||||||
SETA пр. SETNBE пр | Установить, если выше, не ниже и не равно. IF CF= 0, ZF= 0, пр.:= 1 | -- | -- | -- | -- | -- | 0 | -- | -- | 0 | ||||||||||||||||||||||
М ov cx , 54 H; Операнд для сравнения. Cmp cx , 43 H; Сравнение, CF и ZF =0. SETA AL; AL устанавливается в 1. | ||||||||||||||||||||||||||||||||
SETGE пр. SETNL пр. |
Установить, если Больше или равно, не меньше. IF SF= OF, пр.:= 1 | * | -- | -- | -- | * | -- | -- | -- | -- | ||||||||||||||||||||||
М ov cx , 54 H; Операнд для сравнения. Cmp cx , 32 H; Сравнение, SF = OF. SETGE DL; DL устанавливается в 1. | ||||||||||||||||||||||||||||||||
SETL пр. SETNGE пр. |
Установить, если меньше, Не больше IF SF ≠ OF, пр.:= 1
| * | -- | -- | -- | * | -- | -- | -- | -- | ||||||||||||||||||||||
М ov cx , 54 H; Операнд для сравнения. Cmp cx , 62 H; Сравнение, SF ≠ OF. SETL AL; AL устанавливается в 1. | ||||||||||||||||||||||||||||||||
Продолжение таблицы 3.6
Мнемокод | Описание команд | Флаги, пояснения, примеры | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SETLE пр . SETNG пр . |
SETS пр. |
SETNS пр. |
SETO пр. |
SETNO пр. |
Установить, если Не переполнение. IF OF= 0, пр.:= 1 | 0 | -- | -- | -- | -- | -- | -- | -- | -- | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
М ov cx , 38 H; Операнд в СХ. Mov ax , 55 H; Операнд в АХ. Mul cx, ax; 38 × 55 = 1298Н, OF = 0. SETNO BL; BL устанавливается в 1.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
LANF | Загрузить флаги в AH. AH:=SF, ZF, x, AF, x, PF, x, CF. | -- | -- | -- | -- | * | * | * | * | * | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
LANF; Загружает флаги в АН. AND ah ,11 H; Маскирует биты AF и CF. JNZ M 3; Переход по “ AF = CF =1”. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SANF | Сохранить АН в регистре флагов. SF, ZF, х, AF, х, PF, х, CF:= АН. | -- | -- | -- | -- | * | * | * | * | * | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
LANF; Загружает флаги в АН. OR ah ,4; Установим PF =1. SANF; Восстановим флаги. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Продолжение таблицы 3.6
Мнемокод |
Описание команд | Флаги, пояснения, примеры | |||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||
PUSHF
PUSHFD | Копировать флаги в стэк. SP: = SP-2, SS:SP:= EF (Flags) SS:[(E)SP]:= EF (E)SP:= SP-4 SS:[(E)SP]:= EF | * | * | * | * | * | * | * | * | * | |||||||||||||
PUSHF; Сохранить флаги в стэке. OR SS :[ SP ], 800 H; Установить OF =1. POPF; Восстановить флаги. | |||||||||||||||||||||||
POPF POPFD | Восстановить флаги из стэка. EF Flags:= SS[(E)SP] (E)SP:= SP-2 EF Flags:= SS[(E)SP] (E)SP:= SP-4 | * | * | * | * | * | * | * | * | * | |||||||||||||
PUSHF; Сохранить флаги в стэке. OR SS :[ SP ], 800 H; Установить OF =1. POPF; Восстановить флаги. | |||||||||||||||||||||||
STC |
Установить флаг переноса. CF := 1 | -- | -- | -- | -- | -- | -- | -- | -- | 1 | |||||||||||||
STC; Флаг переноса CF устанавливается в 1. | |||||||||||||||||||||||
CLC |
Сбросить флаг переноса CF := 0 | -- | -- | -- | -- | -- | -- | -- | -- | 0 | |||||||||||||
CLC; Флаг переноса CF сбрасывается в 0. | |||||||||||||||||||||||
CMC |
Инвертировать флаг переноса CF:=
| -- | -- | -- | -- | -- | -- | -- | -- | * | |||||||||||||
CMC; Если CF =1, то он устанавли- вается в 0, если CF =0, то в 1. | |||||||||||||||||||||||
STD |
Установить флаг направления DF := 1 | -- | 1 | -- | -- | -- | -- | -- | -- | -- | |||||||||||||
Mov cx ,100; Устанавливаем счетчик. STD; Устанавливаем флаг DF в 1. Rep Mov Tab1,Tab2; Пересылаем 100 элементов из Tab2 в Tab. | |||||||||||||||||||||||
CLD |
Сбросить флаг направления DF := 0 | -- | 0 | -- | -- | -- | -- | -- | -- | -- | |||||||||||||
Mov cx ,100; Устанавливаем счетчик, CLD; Сброс флага направленияв 0, Rep Mov Tab1,Tab2;Пересылаем 100 элементов из Tab2 в Tab1. | |||||||||||||||||||||||
STI | Установить флаг разрешения преры-вания IF := 1 | -- | -- | 1 | -- | -- | -- | -- | -- | -- | |||||||||||||
STI ; Устанавливает IF в 1. | |||||||||||||||||||||||
Окончание таблицы 3.6
Мнемокод | Описание команд | Флаги, пояснения, примеры | |||||||||||||||||||||||||
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||||||||||||||||||
CLI | Сбросить флаг разрешения преры-вания IF := 0 | -- | -- | 0 | -- | -- | -- | -- | -- | -- | |||||||||||||||||
CLI; Сбрасывает IF в 0. | |||||||||||||||||||||||||||
Программные прерывания | |||||||||||||||||||||||||||
INT 21H | Функция DOS 01h. Ввод символа с клавиатуры с эхом на дисплее. Вход : AH = 01H . Выход: AL:= символ | -- | -- | 1 | -- | -- | -- | -- | -- | -- | |||||||||||||||||
Mov ah ,01 h; Код функции DOS в АН Int 21 h ; Копирование в стеке содержи- мого регистров IP, CS, EFLAGS и вызов программы обработки прерывания с функцией 01Н. | |||||||||||||||||||||||||||
INT 21 H |
Функция DOS 02 h . Вывод символа на экран. Вход : AH = 02H DL = ASCII – код символа | -- | -- | 1 | -- | -- | -- | -- | -- | -- | |||||||||||||||||
Mov DL , 41 H; ASCII– код буквы А в DL Mov AH ,02 H; Код функции DOS в АН Int 21 h; Копирование в стеке содержи- мого регистров IP, CS, EFLAGS и вызов программы обработки прерывания с функцией 02Н. | |||||||||||||||||||||||||||
INT 21Н |
Функция DOS 4С h . Завершение программы: Вход: AH = 4СH | 1 | -- | 1 | -- | -- | -- | -- | -- | -- | |||||||||||||||||
Mov AH ,4 CH ;Код функции DOS в АН. INT 21H ; Вызов DOS. | |||||||||||||||||||||||||||
INT 21H |
Функция DOS 09 h . Вывод строки символов на экран. Вход : AH : = 09H DX : = адрес выводимой строки символов. В конце строки должен быть знак $. | -- | * | 1 | -- | -- | -- | -- | -- | -- | |||||||||||||||||
Lea DX , stroka; Адрес строки в DX Mov AH ,09 H; Код функции DOS в АН Int 21 h; Копирование в стеке содержи- мого регистров IP, CS, EFLAGS и вызов программы обработки прерывания с функцией 09Н. | |||||||||||||||||||||||||||
IRET |
Возврат из подпрограммы IP:= [SS:SP] CS:= [SS:SP+ 2] EF Flags:= [SS:SP+ 2] | * | * | * | * | * | * | * | * | * | |||||||||||||||||
Компоновка программы После ассемблирования файла HELLO.ASM, вы продвинулись ещё на один шаг в процессе создания и запуска программы. Теперь, если вы скомпонуете только что полученный объектный код в исполняемый вид, вы сможете запустить программу. Для компоновки программы используется программа LINK, представляющая собой поставляемый вместе с Турбо Ассемблером компоновщик. Введите в командную строку: LINK HELLO Здесь опять не требуется вводить расширение имени файла. Компоновщик LINK по умолчанию предполагает, что этим расширением является расширение .OBJ. Когда компоновка завершится, компоновщик автоматически присвоит файлу с расширением .EXE имя, совпадающее с именем вашего объектного файла (если вы не определили другое имя). При успешной компоновке на экране появляется сообщение: Microsoft ( R ) Overlay Linker Version 3.64 Copyright (C) Microsoft Corp 1983-1988. All rights reserved. В процессе компоновки могут возникнуть ошибки (в данной программе это маловероятно). Если вы получили сообщения об ошибках компоновки (они выводятся на экран), измените исходный код программы так, чтобы он в точности соответствовал тексту программы в приведенном выше примере, а затем снова выполните ассемблирование и компоновку. Примеры программ на языке ассемблера. 5.1 Умножение двойных слов. (СОМ – программа)
TITLE EXDWMUL - Умножение двойных слов CODESG SEGMENT PARA 'Code' ASSUME CS:CODESG,DS:CODESG,SS:CODESG ORG 100H; Установить IP равным 100Н BEGIN: JMP SHORT MAIN; Передать управление на метку MAIN. MULTCND DW 3206H; Элементы данных. DW 2521H MULTPLR DW 6400H DW 0A26H PRODUCT DW 0 DW 0 DW 0 DW 0 MAIN PROC NEAR; Основная процедура Call E10XMUL; Вызвать процедуру 1-го умножения. Call Z10ZERO; Вызвать процедуру очистки произведения. Call F10XMUL; Вызвать процедуру 2-го умножения. Ret; Вернуться в основную программу. MAIN Endp; Конец процедуры. Процедура умножение двойного слова на слово E10XMUL PROC Mov AX,MULTCND+2; Переслать младшую часть двойного слова Mul MULTPLR; в АХ и умножить на множитель. Mov PRODUCT+4,AX; Сохранить произведение, находящееся в Mov PRODUCT+2,DX; регистрах AX и DX. Mov AX,MULTCND; Переслать старшую часть двойного слова Mul MULTPLR; в АХ и умножить на множитель. Add PRODUCT+2,AX; Сложить результат Adc PRODUCT,DX; с полученным ранее. Ret; Вернуться в основную программу. E10XMUL Endp; Конец процедуры. Процедура умножения двух двойных слов F10XMUL PROC Mov AX,MULTCND+2; Второе слово множимого. Mul MULTPLR+2; Второе слово множителя. Mov PRODUCT+6,AX; Сохранить результат находящися Mov PRODUCT+4,DX; в регистрах AX и DX. Mov AX,MULTCND; Первое слово множимого. Mul MULTPLR; Первое слово множителя. Add PRODUCT+4,AX; Сложить Adc PRODUCT+6,DX; с предыдущим результатом. Adc PRODUCT,00; Прибавить перенос. Mov AX,MULTCND; Первое слово множимого. Mul MULTPLR+2; Второе слово множителя. Add PRODUCT+4,AX; Сложить с предыдущим Adc PRODUCT+6,DX; результатом. Adc PRODUCT,00; Прибавить перенос. Mov AX,MULTCND; Первое слово множимого. Mul MULTPLR; Первое слово множителя. Add PRODUCT+2,AX; Сложить с предыдущим Adc PRODUCT,DX; результатом. Ret; Вернуться в основную программу. F10XMUL Endp; Конец процедуры. Отладчики программ Управляющие клавиши Alt − активизация строки меню в верхней части экрана. Alt /F/X - выход из Code View. Alt/R/R – рестарт программы (возвращение её в исходное состояние для повторного пуска с самого начала). Ctrl/G – увеличение размера (каждый раз на одну строку информационного окна с курсором). Ctrl/T – уменьшение размера (каждый раз на одну строку информационного окна с курсором). Esc− выход из меню. Функциональные клавиши F1 − вывод справочника. F2 − вывод на экран информационного поля с содержимым регистров процессора. F3 − переключение вида основного информационного кадра (только машинные команды, только исходный текст). F4 − переключение на экран DOS и обратно. F5 − выполнение программы до конца или до точки останова. F6 − перевод курсора на информационное поле программы или на поле командной строки. F7 − выполнение программы до курсора или до точки останова. F8 − выполнение одной команды (подпрограммы и циклы выполняются команда за командой). F9 − установка или снятие точки останова в положение курсора. F10 − выполнение одной команды (подпрограммы и циклы выполняются как одна команда, если в них нет точки останова). Команды командной строки G seg: addr − выполнение программы до адреса seg: addr, точки останова или конца программы. В качестве параметра seg может использоваться обозначение сегментного регистра или число. По умолчанию seg = CS. P n – выполнение n команд, с выполнением подпрограмм и циклов как одной команды. По умолчанию n =1. T n- выполнение n команд со входом в подпрограммы и циклы. По умолчанию n =1. D type seg: addr L nmb − дамп nmb байтов в формате type начиная с адреса seg: addr. В качестве параметра seg может использоваться обозначение сегментного регистра или число. По умолчанию seg = CS. Параметр type (тип)- может принимать следующие значения: − А − только коды ASCII; − В − байты и коды ASCII, W- слова. После выполнения одной команды D указанный тип остаётся установленным. Между командой и типом не должно быть пробела. D type seg: addr1 addr2 − дамп памяти от адреса seg: addr1 до адреса seg: addr2. R reg- вывод содержимого регистра reg и запрос его изменение. R reg= n- занесение в регистр reg значения n. E type seg: addr n1 n2 …- занесение в память начиная с адреса seg: addr значений n1, n2 в формате type. Возможные значения type приведены в описании команды D. По умолчанию seg= DS. Между командой и типом не должно быть пробелов. N radix − изменение системы счисления в параметрах командной строки. Параметр radix может принимать значения 16 и 10. Команда N без параметра выводит действующее значение системы счисления. BP seg: addr − установка точки останова по адресу seg: addr. По умолчанию seg:= CS. BP seg: addr ste p− установка точки останова по адресу seg: addr с пропуском её при выполнении первых step раз. Команда используется при отладке многошаговых циклов. BL − вывод списка точек останова с их адресами. BCn − снятие точки останова с номером n. BC * − снятие всех точек останова. BDn − выключение (но не снятие) точки останова с номером n.
Библиографический список
1. Бройдо В.Л. Вычислительные системы, сети и телекоммуникации – СПб.: Питер, 2002. – 688 с. 2. Вычислительные системы сети и телекоммуникации. Пятибратов и др. – М.: ФИС, 2003.− 512 с. 3. Столингс, Вильям. Структурная организация и архитектура компьютерных систем.− М.: Изд. Дом «Вильямс», 2002. – 896 с. 4. Каган Б.М. Электронные вычислительные машины и системы. − М.: Энергоатомиздат, 1991. − 592 с. 5. Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке Ассемблера. − М.: Радио и связь, 1989.- 336 с. 6. Гилмор Ч. Введение в микропроцессорную технику. − М.: Мир, 1984.- 334 с. 7. Зельцин Е. А. Цифровые интегральные микросхемы в информационно-измерительной аппаратуре. − Л.: Энергоатомиздат, 1986.- 280 с. 8. Пильщиков В. Н. Программирование на языке Ассемблера IBM PC. − М.: Диалог - МИФИ, 1996.- 340 с. 9. Русак И. М. Технические средства ПЭВМ справочник. − Минск.: Высш. шк. 1996.- 504 с. 10. Абель П. Язык Ассемблера для IBM PC и программирования. − М.: Высш. шк., 1992.- 447 с. 11. Лямин Л. В. Макроассемблер MASM. − М.: Радио и связь, 1994.- 320 с. 12. Рудаков П. И. Программирование на языке ассемблера IBM PC- 2-е изд., перабот. и доп. − Обнинск.: Издательство “Принтер”, 1997.- 584 с. 13. Бредли Д. Программирование на языке ассемблера для персональной ЭВМ фирмы IBM. − М.: Радио и связь, 1988.- 448 с. 14. Фрир Дж. Построение вычислительных систем на базе перспективных микропроцессоров. − М.: Мир, 1990.- 413 с. 15. Стрыгин В.В. Основы вычислительной, микропроцессорной техники и программирования. − М.: Высш. шк., 1989.- 479 с. 16. Шило В. Л. Популярные цифровые микросхемы: справочник. − М.: Радио и связь, 1987.- 352 с. 17. Соломатин Н. М. Элементы ЦВМ. − М.: Высш. шк., 1984.- 143 с. 18. Гук М. Интерфейсы ПК: справочник. − СПб: Питер Ком, 1999.-416 с. 19. Бердышев Е. Технология ММХ. Новые возможности процессоров Р5 и Р6. − М.: ДИАЛОГ-МИФИ, 1998-234 с. 20. Гук М. Процессоры Pentium 11. − Спб: Издат. "Питер" , 2000.- 480 с. 21. Гук М., Юров В. Процессоры Pentium 111, Athlon и другие - СПб: Издательство "Питер" , 2000.- 480 с. 22. Смит Б.Э., Джонсон М. Т. Архитектура и программирование процессора INTEL 80386 / Пер. с англ. Григорьева В.Л. – М.: Конкорд, 1992. - 334 с. 23. Фролов А.В., Фролов Г.В. Аппаратное обеспечение персонального компьютера. – М.: ДИАЛОГ - МИФИ, 1997. – 304 с. 24. Олифер В.Г., Олифер Н.А. Компьютерные сети. Принципы, технологии, протоколы. – СПб.: Издательство Питер, 1999. – 672 с. 25. Шатт С. Мир компьютерных сетей. – К.:BHV, 1996. – 288 с. 26. Гук М. Локальные сети NOVEL. – СПб.: Питер, 1996. – 288 с. 27. Корнеев В.В. Современные микропроцессоры. − М.: НОЛИДЖ, 2000. − 320 с. 28. Стандарты по локальным вычислительным сетям: Справочник. В.К.Щербо, В.М.Киреичев, С.И.Самойленко; под ред. С.И.Самойленко.- М.: Радио и связь, 1990. − 456 с. 29. Волоконная оптика в локальных и корпоративных сетях связи. А.Б.Семенов, АйТи. – М.: Компьютер-пресс, 1998. −340 с. 30. Персональные компьютеры в сетях ТСР/IР. Крейг Хант, перев. с англ. – BHV – Киев, 1998. − 350 с. 31. Высокопроизводительные сети. Энциклопедия пользователя. Марк А. Спортак и др.; перев. с англ. – Киев ДиаСоф, 1998. − 560 с. 32. Толковый словарь по вычислительной технике; перев. с англ. – М.: Издательский отдел “Русская редакция” ТОО ”Channel Trading LTD.”1995. −479 с.
Содержание
Введение.............................................................................................................. 6 1 Функциональное и структурное построение ПК............................................ 7 1.1 Основные понятия......................................................................................... 7 1.2 Программная модель процессора 8086.................................................... 14 1.2.1 Регистры общего назначения............................................................... 15 1.2.2 Сегментные регистры.............................................................................. 16 1.2.3 Регистры указателей и индексов............................................................. 17 1.2.4 Указатель команд IP.............................................................................. 18 1.2.5 Регистр флагов EF.................................................................................. 19 1.2.5.1 Флаги состояний.................................................................................. 19 1.2.5.2 Флаги управления................................................................................. 20 1.3 Вычисление адреса ячейки памяти............................................................. 21 1.4 Представление данных в ЭВМ................................................................... 22 2 Введение в язык Ассемблера......................................................................... 25 2.1 Формат команд Ассемблера....................................................................... 25 2.2 Режимы адресации операндов команд...................................................... 27 2.2.1 Регистровая и непосредственная адресация........................................... 28 2.2.2 Прямая адресация памяти....................................................................... 31 2.2.3 Косвенная регистровая адресация.......................................................... 32 2.2.4 Адресация по базе.................................................................................... 33 2.2.5 Прямая адресация с индексированием................................................... 33 2.2.6 Адресация по базе с индексированием................................................... 34 2.3 Задание данных в операторах исходной программы............................. 35 2.3.1 Идентификаторы данных и команд........................................................ 36 2.4 Псевдооператоры (директивы) Ассемблера..................................... 37 2.4.1 Псевдооператоры (директивы) определения типа данных.............. 37 2.4.2 Псевдооператоры определения сегмента / процедуры.............. 38 2.4.3 Псевдооператоры присваивания атрибута данным.................... 40 2.4.4 Псевдооператоры возвращающие значения................................. 40 2.4.5 Псевдооператоры (директивы) задания набора команд............ 41 2.4.6 Пример использования директив и команд в программе.................... 41 3 Система команд процессора 80386............................................................... 43 3.1 Подробное описание некоторых команд Ассемблера.............................. 46 3.1.1 Команды сложения - ADD, ADC............................................................. 46 3.1.2 Команды безусловной передачи управления - CALL, RET, JMP........ 48 3.1.3 Команда сравнения источника и приемника - CMP.............................. 51 3.1.4 Команды преобразования типов данных – CBW, CWD,CDQ.............. 52 3.1.5 Команда уменьшения содержимого приемника - DEC.......................... 53 3.1.6 Команды деления - DIV, IDIV................................................................ 53 3.1.7 Команды умножения - MUL, IMUL....................................................... 55 3.1.8 Команда увеличения значения приемника – INC.................................. 56 3.1.9 Команда программного прерывания – INT........................................... 57 3.1.10 Команды условной передачи управления - Jxx................................... 58 3.1.11 Команда пересылки адреса - LEA........................................................ 61 3.1.12 Команда управления циклами - LOOP................................................ 62 3.1.13 Команда пересылки данных - MOV..................................................... 63 3.1.14 Команда возврата из процедур............................................................. 65 3.1.15 Команды обращения в стэк – POP, PUSH............................................ 65 3.1.16 Команды вычитания - SUB, SBB.......................................................... 69 3.1.17 Логические команды - AND, OR, XOR и TEST............................... 71 3.1.18 Команда обмена операндами - XCHG.................................................. 73 3.2 Команды процессоров Intel 8086 – Intel 80386....................................... 74 Команды пересылки данных.................................................................... 76 Арифметические команды........................................................................ 79 Команды расширения знака...................................................................... 82 Команды манипулирования битами......................................................... 82 Команды обработки строк...................................................................... 86 Команды управления программой........................................................... 91 4. Ввод, трансляция и исполнение программы............................................. 100 4.1 Разработка программы на языке Ассемблере......................................... 100 4.2 Ваша первая программа на Ассемблере................................................. 101 4.2.1 Ассемблирование вашей первой программы....................................... 102 4.2.2 Компоновка программы........................................................................ 104 4.2.3 Запуск вашей первой программы......................................................... 104 5 Примеры программ на языке ассемблера................................................. 106 5.1 Умножение двойных слов. (СОМ – программа)..................................... 106 5.2 Сложение чисел в ASCII-формате. (СОМ – программа)........................ 108 5.3 Многословное сложение (ЕХЕ – программа).......................................... 109 5.4 Преобразование шестнадцатеричной цифры в ASCII код..................... 111 5.5 Преобразование ASCII формата в двоичный формат............................ 113 6. Сообщения об ошибках MASM и LINK.................................................... 117 7 Отладчики программ................................................................................... 127 7.1 Назначение и функции отладчиков программ........................................ 127 7.2 Основные команды отладчика DEBUG................................................... 128 7.3 Основные команды отладчика CodeView Microsoft................................ 133 Библиографический список.................................................................... 136 Тюрин В.Н.
Вычислительные машины, Системы и сети Учебное пособие для студентов заочной формы обучения.
Красноярск, 2006
Федеральное агентство по образованию
ГОУВПО “ Сибирский государственный технологический университет” Вычислительные машины, Системы и сети Учебное пособие по выполнению контрольных работ для студентов заочной формы обучения, специальности 210200 «Автоматизация технологических процессов и производств»
Красноярск, 2006
УДК 68132(075.8) Т 985
Тюрин В.Н. Вычислительные машины, системы и сети: Учебное пособие по выполнению контрольных работ для студентов заочной формы обучения, специальности 210200 «Автоматизация технологических процессов и производств». Красноярск: СибГТУ, 2006. – 110с.
Рецензент: Научно-методический совет СибГТУ – к.т.н., доцент Т.Г.Зингель
© В.Н. Тюрин
© Сибирский государственный технологический университет, 2006 Введение
Учебное пособие содержит всю необходимую информацию для разработки и написания полноценных программ на языке Ассемблера. Первая глава содержит описание ЭВМ совместимых с IBM PC. Здесь приведены структура процессора, назначение основных регистров, система представления данных в ЭВМ. Во второй главе описываются форматы команд, режимы адресации, псевдооператоры (директивы) языка, даны примеры использования директив. Третья глава посвящена командам языка Ассемблера. Здесь приведены мнемокод, алгоритм выполнения команды и указано их воздействие на регистр флагов. Наиболее распространенные команды описаны подробно. В четвертой главе описываются правила и приемы создания рабочей программы на языке Ассемблера и способы ее отладки. В пятой главе приведены примеры программ на языке Ассемблера. В шестой главе описаны некоторые характерные ошибки, встречающиеся в программах на Ассемблере и обнаруженные транслятором и компоновщиком при создании исполняемого файла. Седьмая глава содержит описание команд интерактивных отладчиков Debug Borland и Code View Microsoft. В целом пособие составлено таким образом, чтобы в краткой форме пояснить модель процессора, цикл его работы и описать состав, назначение и функционирование основных регистров. Для максимального облегчения составления программ студентами, имеющими начальные знания по языку Ассемблера, каждая команда приведена с примером её использования.
Функциональное и структурное построение ПК
1.1 Основные понятия
В методических материалах под термином “персональный компьютер” (сокращенно ПК) понимается персональная ЭВМ с системой команд х86, занимающая в около 90 % рынка ЭВМ. Первые 16–разрядные ПК появились в 1981 г., в настоящее же время активно распространяются 64 и 128–разрядные ПК. Но во всех моделях ЭВМ фирмы INTEL строго соблюдается программная преемственность. Это означает что программа, написанная для ЭВМ младшей модели, например IBM PC AT, без каких - либо изменений выполняется на любой старшей модели ЭВМ. Такая совместимость снизу вверх обеспечивается тем что, процессоры, составляющие основу и сердце ЭВМ всех типов, используют одну систему команд языка Ассемблера, хотя структура и архитектура различных моделей процессоров значительно отличаются между собой. В старшие модели ПК лишь добавляются новые команды необходимые для многозадачных и мультимедийных режимов. Таким образом, процессор 8086 может служить базовым процессором для изучения функционирования блоков и устройств ПК всех остальных моделей данного семейства. Укрупненная блок-схема компьютера классической (фон-Немановской) архитектуры показана на рисунке 1.1. Она состоит из: а) процессора; б) каналов связи (внешнего интерфейса); в) оперативной (или основной) памяти; г) внешней памяти; д) устройств ввода–вывода; ж) прочих внешних устройств.
Процессор основной блок компьютера, по существу, является устройством, выполняющим все функции элементарной вычислительной машины. Центральный процессор — это мозг компьютера. Его задача — выполнять программы, находящиеся в основной памяти. Он вызывает команды из памяти, определяет их тип, а затем выполняет их одну за другой. Компоненты соединены шиной, представляющей собой набор параллельно связанных проводников, по которым передаются адреса, данные и сигналы управления. Шины могут быть внешними (связывающими процессор с памятью и устройствами ввода-вывода) и внутренними (обеспечивающими передачу данных и управляющих сигналов между блоками процессора). Процессор состоит из: устройства управления, которое синхронизирует и управляет работой процессора и всей вычислительной системы; арифметико-логического устройства, выполняющего логические, арифметические, сдвиговые и прочие операции над целыми данными. Результат вычисления формируется в выходном регистре, откуда он может переместиться в память или в другие регистры процессора для дальнейшей обработки; внутри процессорной памяти, хранящей промежуточные результаты вычислений и некоторые команды управления. Эта память состоит из нескольких регистров, выполняющих некоторые общие функции и кроме того, каждый регистр имеет свою специализацию. Чтение и запись данных в регистры происходит на частоте работы процессора, поскольку они территориально расположены на кристалле процессора и принадлежат CPU (Central Processor Unit); устройства преобразования адресов памяти, основная функция которого вычислять адреса операндов и команд, используя для этого различные режимы адресации памяти; интерфейсного блока с микросхемами системной поддержки, обеспечивающего связь процессора с памятью и другими внешними устройствами посредством внешнего интерфейса, системных шин и адаптеров связи. Системные шины состоят из шины данных (ШД), шины адресов (ША), шины управления (ШУ). Каналы связи (внешнего интерфейса) – служат для сопряжения процессора с его внешними устройствами. Оперативная (или основная) память — запоминающее устройство, используемое для оперативного хранения данных и программ, а также обмена информацией с другими устройствами ЭВМ. Внешние устройства обеспечивают эффективное взаимодействие компьютера с окружающей средой: пользователями, объектами управления, другими машинами. В состав внешних устройств обязательно входят внешняя память и устройства ввода-вывода и прочие устройства. Процессоры архитектуры фон-Неймана выполняют команды последовательно, одну за другой, выбирая их из основной или промежуточной памяти. Для каждой команды реализуются следующие действия: 1. вычисление адреса команды; 2. чтение команды из памяти; 3. дешифрация команды (преобразование во внутренний микрокод CPU); 4. модификация содержимого IP; 5. вычисление адреса операндов; 6. чтение (выборка) операндов из памяти на регистры процессора; 7. исполнение операции над выбранными операндами; 8. запись результата операции в память или регистры процессора. В результате получается цикл выборки, дешифрации и исполнения команды, который называется базовым циклом работы процессора. Большинство из перечисленных действий выполняются отдельными блоками процессора, самостоятельно или по сигналам устройства управления. Для того чтобы обеспечить опережающее чтение очередной команды из памяти, автоматический инкремент регистра IP, называемого программным счетчиком или указателем команд, на величину равную количеству байт дешифрированной команды, производится сразу после дешифрации поступившей команды.Таким образом, при выполнении очередной команды в IP находится адрес следующей инструкции. При инкременте IP команды последовательно выполняются в том порядке, в каком они хранятся в памяти и только при «переходе» или «вызове» подпрограммы в IP загружается значение, указанное в имени вызываемой подпрограммы, и следующая команда выбирается из новой указанной ячейки. Скорость обработки команд или производительность процессора зависит от двух факторов: скорости дешифрации и выполнения инструкций в вычислительном устройстве процессора; скорости доставки инструкций и операндов из памяти процессору. Для повышения скорости выполнения инструкций применяют много способов, в том числе: конвейерный способ выполнения команд в процессоре; увеличение ступеней конвейера вычислительного устройства; применяют супер или мультискалярные вычислительные устройства процессоров; увеличение тактовой частоты работы процессоров; увеличение интеграции элементов на кристалле процессора, что сокращает время распространения сигналов в процессоре между блоками и т.д. Второй фактор увеличивают, также применяя различные ухищрения. Например: применяют иерархическую структуру системы памяти ЭВМ; увеличивают разрядность и количество регистров процессора; физически приближают часть основной памяти (кэш-память) к вычислителю процессора; разбивают основную память на несколько блоков, то есть вводят принцип расслоения памяти; используют различные способы адресации памяти; расширяют шину данных до 128 разрядов; повышают частоту шины и т.д. Принцип иерархической организации памяти заключается в разумном сочетании основной памяти большого объема на DRAM с относительно небольшой кэш-памятью на SRAM. Метод кэширования памяти очень широко распространен в современных процессорах. Их архитектура подразумевает наличие между процессором и основной памятью промежуточной быстродействующей памяти небольшой емкости, территориально расположенной на кристалле микропроцессора. В ней хранятся те данные и команды, которые процессор должен обработать в ближайшее время. Конвейерный принцип выполнения команд, основанный на автономности работы каждого блока процессора, подразумевает одновременное выполнение процессором нескольких команд. При конвейеризации, весь процесс выполнения команды разбивается на несколько (от 5 до 25) этапов или ступеней. Каждый этап выполняется отдельными блоками функционирующими по сигналам устройства управления независимо друг от друга. Грубо говоря, пока одна команда выбирается из памяти, то предыдущая дешифрируется, а первая исполняется и т.д. В зависимости от числа ступеней конвейера, в процессоре одновременно выполняются 5 и более команд. Конвейер классического процессора Pentium имеет 5 ступеней, а в Pentium IV команды проходят до 24 ступеней. В зависимости от количества конвейеров, процессоры подразделяются на скалярные, суперскалярные и мультискалярные. Процессоры 8086 относятся к скалярным с расширенным набором выполняемых инструкций (CISC). Упрощенная структурная схема подобного процессора представлена на рисунке 1.2. Этот процессор работает согласно указанному выше алгоритму. Преобразователь адресов формирует 20–битный адрес, который обеспечивает прямой доступ к памяти емкостью 1 Мбайт. Информация поступает в процессор по шине данных. Все операнды команд обрабатываются по сигналам устройства управления 16–разрядным АЛУ, которое помещает результат вычислений в РОН или буферный регистр данных. Программно–доступными являются РОН, сегментные регистры, регистр флагов и указатель команд. Дата: 2018-11-18, просмотров: 477. |