г=[ ]=CPU 80386=======================================1=[ ][ ]
| cs:0100>33C0 xor ax,ax | ax 0000 |c=0|
| cs:0102 A03601 mov al,[0136] | bx 0000 |z=0|
| cs:0105 F6263601 mul byte ptr[0136] cx 0000 |s=0|
| cs:0109 BB0010 mov bx,1000 | dx 0000 |o=0|
| cs:010C F7E3 mul bx | si 0000 |p=0|
| cs:010E A33701 mov [0137],ax | di 0000 |a=0|
| cs:0111 89163901 mov [0139],dx | bp 0000 |i=1|
| cs:0115 A03601 mov al,[0136] | sp FFFE |d=0|
| cs:0118 32E4 xor ah,ah | ds 58D2 | |
| cs:011A BB0020 mov bx,2000 | es 58D2 | |
| cs:011D F7E3 mul bx | ss 58D2 | |
| cs:011F 03063701 add ax,[0137] | cs 58D2 | |
| cs:0123 13163901 adc dx,[0139] | ip 0100 | |
|---------------------------------------------+ | |
| ds:0000 CD 20 00 A0 00 9A F0 FE = а ЪЁ | | |
| ds:0008 1D F0 E8 01 3C 23 B2 01 Ёш <# +------------+-|
| ds:0010 3C 23 7D 02 53 1D D1 0F <#} S_T | ss:0000 20CD|
| ds:0018 01 01 01 00 02 FF FF FF |ss:FFFE>0000 |
==============================================|===============
Рисунок 1 - Окно отладчика
В левой верхней части окна отображается реассембированный текст программы (сегмент кода), внизу выводится содержимое сегмента данных, cправа находятся области отображения состояний регистров, флагов и стека.
Для отладки программы в пошаговом режиме используются клавиши F7 и F8, для постановки точек прерывания - ctrl+F8, перемещение по окну выполняется с помощью стрелок и клавиши TAB.
1.4 ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ
1) Просмотрите файл example1.asm, содержащий пример программы на языке Ассемблера. Изучите назначение команд программы.
2) Оттранслируйте программу с помощью средств пакета tasm и
получите исполняемую программу в формате СОМ.
3) Просмотрите пошаговое выполнение программы в отладчике td.
4) Проанализируйте состояния регистров и памяти на каждом шаге.
1.5 СОДЕРЖАНИЕ ОТЧЕТА
1) Постановка задачи.
2) Текст программы.
3) Назначение команд в программе.
4) Результаты отладки.
5) Выводы.
2 ЛАБОРАТОРНАЯ РАБОТА №2. АРИФМЕТИЧЕСКИЕ
ОПЕРАЦИИ В ЯЗЫКЕ АССЕМБЛЕРА IBM PC
Цель работы: изучение арифметических команд языка Ассемблер IBM PC.
2.1 ФОРМАТЫКОМАНД ДВОИЧНОЙ И ДЕСЯТИЧНОЙ
АРИФМЕТИКИ
Процессор имеет четыре базовые арифметические операции в нескольких различных форматах (таблица 2.1). Операции выполняются
над 8- и 16-битовыми знаковыми и беззнаковыми операндами. Кроме того, в языке Ассемблера предусмотрены команды для обработки десятичных чисел.
Таблица 2.1 - Арифметические команды
МНЕМОНИКА КОМАНДЫ | ОПИСАНИЕ КОМАНДЫ |
ADD (сложить) ADC (сложить с переносом) INC (инкремент) | ПРИЕМНИК+ИСТОЧНИК -> ПРИЕМНИК ПРИЕМНИК+ИСТОЧНИК+CF -> ПРИЕМНИК ПРИЕМНИК+1 -> ПРИЕМНИК |
SUB (вычесть) SBB (вычесть с переносом) DEC (декремент) NEG (изменить знак) | ПРИЕМНИК-ИСТОЧНИК -> ПРИЕМНИК ПРИЕМНИК-ИСТОЧНИК-CF -> ПРИЕМНИК ПРИЕМНИК-1 -> ПРИЕМНИК -ПРИЕМНИК -> ПРИЕМНИК |
MUL (умножить) IMUL (умножить со знаком) | AL*ИСТОЧНИК(8) -> AX AX*ИСТОЧНИК(16) -> DX,AX Команда MUL, но операнды знаковые |
DIV (разделить) IDIV(разделить со знаком) | AX/ИСТОЧНИК(8) -> AL DX,AX/ИСТОЧНИК(16) -> AX Команда DIV, но операнды знаковые |
Различие между знаковыми и беззнаковыми числами заключается в способах интерпретации двоичных наборов. Беззнаковые числа -это обычные двоичные числа (все биты значащие), а знаковые числа представлены в дополнительном коде с использованием самого левого бита для представления знака.
Большинство арифметических команд устанавливают или сбрасывают шесть флагов состояния, показывающих определенные свойства результата:
- флаг CF устанавливается, если операция дала беззнаковый результат вне диапазона;
- флаг OF устанавливается, если в операции получился знаковый результат, находящийся вне диапазона (знаковое переполнение);
- флаг ZF устанавливается, если результат операции равен 0;
- флаг SF устанавливается, если старший бит результата операции содержит 1, что соответствует получению отрицательного результата;
- флаг PF устанавливается, если результат операции содержит четное число единичных бит;
- флаг AF устанавливается, если в десятичных операциях требуется коррекция.
Перечисленные выше арифметические операции выполняются над
числами в двоичном формате. Этот формат удобен в том случае, если
данные определены в самой программе. Во многих случаях исходные
данные вводятся программой с клавиатуры или из файла в виде ASCII-символов в десятичном формате. Данные поступают в ЭВМ, как правило, в неупакованном формате, т.е. каждый байт содержит только одну цифру. Примером неупакованного десятичного формата
служит код ASCII, в котором каждый символ представляется одним
байтом. Кодирование цифр показано в таблице 2.2.
Таблица 2.2 - Представление цифр в коде ASCII
Цифра | Код ASCII | Цифра | Код ASCII |
30H | 35H | ||
31H | 36H | ||
32H | 37H | ||
33H | 38H | ||
34H | 39H |
С помощью следующих ассемблерных команд можно выполнять
арифметические операции непосредственно над числами в ASCII -
формате:
AAA - коррекция для сложения ASCII - кодов;
AAD - коррекция для деления ASCII - кодов;
AAM - коррекция для умножения ASCII - кодов;
AAS - коррекция для вычитания ASCII - кодов.
Эти команды записываются без операндов и выполняют автоматическую коррекцию содержимого регистра AX. Рассмотрим пример. Предположим, что регистр AX содержит 0038H (цифра 8), а регистр BX - 0034H (цифра 4). Сложение и коррекция записываются следующими командами:
ADD AL,BL;сложение 34 и 38
AAA;коррекция для сложения ASCII-кодов
Команда AAA проверяет правую шестнадцатиричную цифру (4 бита) в регистре AL. Если эта цифра находится между A и F или флаг переноса AF равен 1, то к содержимому регистра AL прибавляется 6, а к содержимому регистра AH прибавляется 1. В нашем примере в регистре AX получаются следующие значения:
после команды ADD: 006C;
после команды AAA: 0102.
Для получения окончательного ASCII-представления достаточно
просто поставить тройки на место левых шестнадцатиричных цифр:
OR AX,3030H;результат 3132
Сложение многобайтовых ASCII-чисел требует организации цикла, который выполняет обработку цифр рассматриваемого числа слева направо с учетом переноса. В примере, показанном на рисунке 2, складываются два трехбайтовых ASCII- числа в четырехбайтовую сумму.
ASCADD SEGMENT
ASSUME CS:ASCADD,DS:ASCADD,SS:ASCADD
ORG 100H
START: JMP MAIN
;--------------------------------------------------
ASC1 DB '578';первое слагаемое
ASC2 DB '694';второе слагаемое
ASC3 DB '0000';результат
;--------------------------------------------------
MAIN: CLC;сбросить флаг переноса
LEA SI,ASC1+2;адреса ASCII символов
LEA DI,ASC2+2
LEA BX,ASC3+3
MOV CX,03;Число повторений цикла
A20: MOV AH,00;Очистить регистр AH
MOV AL,[SI];Загрузить ASCII-байт
ADC AL,[DI];Сложить (с переносом)
AAA;Коррекция ASCII-кода
MOV [BX],AL;Сохранение суммы
DEC SI
DEC DI
DEC BX
LOOP A20;Пока CX>0 повторить цикл
MOV [BX],AH;Сохранить перенос
RET
ASCADD ENDS
END START
Рисунок 2 - Сложение в ASCII-формате
2.2 ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ
Разработать программу для выполнения заданной арифметической
операции над неотрицательными 80-ти разрядными двоичными
операндами. Исходные данные или результат (в зависимости от варианта задания) представить в распакованном формате в системе счисления с основанием, указанным вариантом задания. Таким образом, при выполнении задания по вариантам 1 - 6 следут запрограммировать последовательность действий:
1) преобразование исходных данных;
2) выполнение арифметической операции;
а по вариантам 7 - 12:
1) выполнение арифметической операции;
2) преобразование результата.
Под распакованным форматом в заданной системе счисления следует понимать представление числа в виде последовательности ASCII-кодов арабских цифр, используемых этой системой счисления.
Исходные данные определить с помощью директив определения данных.
Кроме того, в качестве информации о корректности выполнения арифметической операции сложения или вычитания сформировать однобайтовый код ошибки, равный 0, если результат операции представляет собой 80-битовое неотрицательное число, и равный FFH в противном случае.
Выполнить тестирование программы, по крайней мере, для трех типов тестов, соответсвующих ситуациям:
1) операнды и результат выполнения операции представляют собой положительные 80-разрядные двоичные числа;
2) один из операндов равен 0;
3) длина результата выполнения операции сложения превышает 80 бит или результат выполнения операции вычитания – отрицательное число.
Варианты задания представлены в таблице 2.3. Три символа кода варианта задания определяют: арифметическую операцию (С -сложение, В - вычитание); информацию, которую следует представить в заданной системе счисления (Д - данные, Р - результат);
основание системы счисления для представления исходных данных или результата (4,8-ричная или H-16-ричная).
Таблица 2.3 - Варианты задания
N вар. | ||||||||||||
Код | СД4 | ВД4 | СД8 | ВД8 | СДH | ВДH | СР4 | ВР4 | СР8 | ВР8 | СРH | ВРH |
2.3 СОДЕРЖАНИЕ ОТЧЕТА
1) Постановка задачи в соответствии с заданным вариантом.
2) Краткое описание алгоритма.
3) Текст программы.
4) Результаты тестирования.
5) Выводы: характеристики программы и полноты ее тестирования.
3 ЛАБОРАТОРНАЯ РАБОТА №3. ОБРАБОТКА СТРОКОВЫХ ДАННЫХ В ЯЗЫКЕ АССЕМБЛЕРА IBM PC
Цель работы: изучение команд языка Ассемблер, предназначенных для обработки строк символов.
3.1 ФОРМАТЫКОМАНД ОБРАБОТКИ СТРОКОВЫХ ДАННЫХ
В языке Ассемблера имеется пять команд для обработки строковых данных:
movsb(movsw) - переслать байт (слово) из одной области памяти в
другую;
lodsb(lodsw) - загрузить из памяти байт(слово) в регистр al(ax);
stosb(stosw) - записать содержимое регистра al(ax) в память;
cmpsb(cmpsw) - сравнить содержимое двух областей памяти длиной
байт (слово),
scasb(scasw) - сравнить содержимое регистра al(ax) с содержимым
памяти.
Эти команды предполагают, что регистры si и di содержат относительные адреса соответствующих областей памяти со строковыми данными. При этом регистр si обычно связан с регистром ds, а di - с регистром es. Следовательно, регистр es должен быть инициализирован (обычно - адресом в регистре ds).
Повторение выполнения команды может быть обеспечено использованием префикса rep, если предварительно в регистр cx поместить количество таких повторений. Это позволяет указанным командам обрабатывать строки любой длины. При этом флаг направления df определяет направление просмотра и обработки строковых данных: 0 - слева направо (содержимое регистров si и di увеличивается), 1 - справа налево (содержимое регистров si и di уменьшается).
Флаг df установить в 0 можно с помощью команды CLD, а в 1 - с помощью команды STD.
Префикс rep указывается непосредственно перед командой.
Например,
rep movsb
При выполнении этой команды происходит уменьшение на 1 значенияв регистре СХ до 0.
Рассмотрим примеры.
Ниже приведена группа команд, выполняющая пересылку 10 байт
из области NAME1 в область NAME2 в предположении, что регистры
DS и ES инициализированы адресом сегмента данных.
NAME1 DB 10 DUP('*')
NAME2 DB 10 DUP('?')
...
CLD; сбросить флаг df
MOV CX,10; установить счетчик
LEA DI,NAME2; загрузить относительные адреса
LEA SI,NAME1; областей даных
REP MOVSB; переслать данные
Следующая группа команд выполняет пересылку тех же данных, но
в предположении, что пересылка выполняется справа налево и по
словам.
STD
MOV CX,5
LEA DI,NAME2+8
LEA SI,NAME1+8
REP MOVSW
...
При выполнении команд CMPS и SCAS возможно использование
модификаций префикса REP:
REPZ/REPE - повторять операцию пока флаг zf показывает "равно
или ноль". Прекратить операцию, если zf "не равно или
не ноль" или при CX=0;
REPNE/REPNZ - повторять операцию пока флаг zf показывает "не
равно или не ноль". Прекратить операцию при флаге zf,
указывающем на "равно или ноль" или при CX=0.
3.2 ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ
Разработать программу формирования или распаковки информационного кадра для передачи по локальной вычислительной сети. Формат кадра представлен на риcунке 3.
ПП | Данные | КС | КК |
ПП - преамбула (4 байта с кодом 55Н);
Данные - поле данных (16 байт);
КС - контрольная сумма (2 байта);
КК - конец кадра (1 байт с кодом 1FН).
Рисунок 3 - Формат кадра
Под формированием (распаковкой) понимается заполнение (чтение) поля данных кадра и формирование (проверка) контрольной суммы. Данные для передачи (приема) хранятся в области памяти с именем SDATA и представляют собой последовательность 16 символов из набора от A до Z и от 0 до 9. При формировании (распаковке) кадра данные необходимо зашифровать (расшифровать) согласно таблице кодировки, указанной в варианте задания.
Контрольная сумма может формироваться двумя способами:
1) Как арифметическая сумма всех байт поля данных;
2) Каждый бит КС представляет собой дополнение до четного
числа единиц соответствующего байта поля данных.
Способ формирования контрольной суммы указан в варианте
задания.
В лабораторной работе использовать команды работы со строками:
LODS,STOS и др.
Варианты задания к лабораторной работе приведены в таблице 3.1.
Первый символ варианта обозначает операцию (Ф - формирование
кадра, Р - распаковка кадра). Второй символ задает способ формирования контрольной суммы (С - арифметическая сумма, Ч-
контроль по четности). Третья цифра является номером таблицы кодировки.
Таблица 3.1 - Варианты задания
N вар | ||||||||||||
Код | ФС1 | ФС2 | ФЧ1 | ФЧ2 | ФС3 | ФЧ3 | РС1 | РС2 | РЧ1 | РЧ2 | РС3 | РЧ3 |
Таблицы кодировки:
1. 2.
------------------------------ -------------------------------
| A Q | K 3 | U R | 3 M | | A N | K B | U 4 | 4 X |
| B L | L D | V 9 | 4 V | | B W | L P | V E | 5 8 |
| C O | M X | W B | 5 N | | C 7 | M 3 | W M | 6 J |
| D T | N 7 | X H | 6 E | | D F | N 5 | X 1 | 7 L |
| E W | O 4 | Y 5 | 7 Y | | E O | O I | Y G | 8 2 |
| F G | P U | 9 0 | 8 J | | J Y | T 0 | 3 R | 9 A |
| G Z | Q P | Z 8 | | | F Z | P T | Z Q | |
| H C | R 6 | 0 I | | | G 9 | Q U | 0 V | |
| I 1 | S Z | 1 F | | | H C | R D | 1 6 | |
| J A | T S | 2 K | | | I S | S K | 2 H | |
------------------------------- --------------------------------
3.
-------------------------------
| A 3 | K W | U N | 4 R |
| B L | L C | V 4 | 5 I |
| C X | M U | W D | 6 V |
| D 6 | N Z | X O | 7 Y |
| E Q | O 7 | Y 2 | 8 0 |
| F K | P S | Z 5 | 9 T |
| G B | Q F | 0 A | |
| H J | R 1 | 1 P | |
| I 8 | S M | 2 9 | |
| J E | T G | 3 H | |
--------------------------------
3.3 СОДЕРЖАНИЕ ОТЧЕТА
1) Постановка задачи.
2) Описание алгоритма.
3) Описание входных и выходных данных.
4) Текст программы.
5) Результаты тестирования.
6) Выводы по работе.
БИБЛИОГРАФИЯ
1 Абель П. Язык Ассемблера для IBM PC и программирования.- М.: Высшая школа, 1992.-447с.
2 Дао Л. Программирование микропроцессора 8088.- М.: Мир, 1988.- 355с.
3 Джордейн Р. Справочник программиста IBM PC AT.
4 Скэнлон Л. Персональные ЭВМ IBM PC AT и XT. Программирование на языке ассемблера. - М.: Радио и связь, 1989. – 335с.
5 Turbo Assembler. Version 3.2. User's Guide. Borland Internatiodnal INC, 1992. - 386p.