Мы поможем в написании ваших работ!
ЗНАЕТЕ ЛИ ВЫ?
|
Данная команда копирует содержимое правого операнда в левый операнд.
Похожие статьи вашей тематики
Эта команда, равно как и практически все остальные команды, оперирующие парой операндов, удовлетворяет двум важным условиям:
Результат операции сохраняется в левом операнде.
|
Ёмкости левого и правого операндов равны:
Operand_1: 1 байт Operand_2: 1 байт
или
Operand_1: 2 байта Operand_2: 2 байта
| Для обозначения содержимого ячеек оперативной памяти при записи команд используются квадратные скобки. В квадратных скобках указывается не содержимое ячейки оперативной памяти, а адрес ячейки. Например:
[0150] − содержимое 1-байтовой ячейки оперативной памяти.
0150 − адрес 1-байтовой ячейки оперативной памяти.
[BP] − содержимое 1-байтовой ячейки оперативной памяти.
BP − регистр, содержащий адрес 1-байтовой ячейки памяти.
| Адрес в квадратных скобках может задаваться двумя различными способами:
Прямая адресация.
Пример использования прямой адресации с однобайтовыми операндами:
MOV AL, [0150]
До выполнения: [0150]= 9F
После выполнения: [0150]= 9Fи AL= 9F
| Пример использования прямой адресации с двухбайтовыми операндами:
MOV AX, [0150]
До выполнения: [0150]= 9F [0151]= 5A
После выполнения: [0150]= 9F [0151]= 5A
и AX= 5A9F, то есть AL= 9F и AH= 5A
| Косвенная адресация.
Пример использования косвенной адресации с однобайтовыми операндами:
MOV AL, [SI]
До выполнения: [0150]= 9F SI= 0150
После выполнения: [0150]= 9F SI= 0150
и AL= 9F
| - Изменение порядка операндов отражается на результате следующим образом:
MOV [SI], AL
До выполнения: AL= 9F SI= 0150
После выполнения: AL= 9F SI= 0150
и [0150]= 9F
| - Пример использования косвенной адресации с двухбайтовыми операндами:
MOV AX, [SI]
До выполнения: [0150]= 9F [0151]= 5A SI= 0150
После выполнения: [0150]= 9F [0151]= 5A SI= 0150
и AX= 5A9F, то есть AL= 9F и AH= 5A
| - Практическое использование способов адресации (на примере команды MOV):
Адрес начала команды
| Команда, записанная на языке машинных кодов
| Та же самая команда, записанная на языке ассемблер
| Комментарий, поясняющий, как выполняется команда
|
| B8 34 12
| MOV AX,1234
| НЕПОСРЕДСТВЕННАЯ АДРЕСАЦИЯ:
Занесение 2-х байтового числа 1234 (12 – старший байт числа, 34 – младший байт числа) в 2-х байтовый регистр АХ
|
| A3 20 01
| MOV [0120],AX
| ПРЯМАЯ АДРЕСАЦИЯ:
Копирование 2-х байтового числа, находящегося в АХ, в однобайтовые ячейки оперативной памяти 0120 и 0121
(в 0120 копируется младший байт АХ, в 0121 копируется старший байт АХ)
|
| 8B 1E 20 01
| MOV BX,[0120]
| ПРЯМАЯ АДРЕСАЦИЯ:
Копирование содержимого ячеек оперативной памяти 0120 и 0121, в 2-х байтовый регистр ВХ (в младший байт ВХ, регистр BL, копируется содержимое ячейки 0120, в старший байт ВХ, регистр BH, копируется содержимое ячейки 0121)
| 10A
| BD 38 01
| MOV BP,0138
| НЕПОСРЕДСТВЕННАЯ АДРЕСАЦИЯ:
Занесение 2-х байтового числа 0138 в 2-х байтовый регистр BP
| 10D
| 88 46 00
| MOV [BP+00],AL
| КОСВЕННАЯ АДРЕСАЦИЯ:
Копирование однобайтового числа, находящегося в АL, в однобайтовую ячейку оперативной памяти, адрес которой содержится в регистре BP, т.е. в ячейку с вычисляемым адресом 0138 (0138+00=0138)
|
| 89 46 07
| MOV [BP+07],AX
| КОСВЕННАЯ АДРЕСАЦИЯ:
Копирование 2-х байтового числа, находящегося в АХ, в ячейки оперативной памяти, на адреса которых указывает регистр BP:
младший байт регистра АХ, именуемый АL, копируется в ячейку с вычисляемым адресом 013F (0138 + 07 + 0 = 013F)
старший байт регистра АХ, именуемый АН, копируется в ячейку с вычисляемым адресом 0140 (0138 + 07 + 1 = 0140)
|
| CD 20
| INT 20
| Команда завершения работы программы
|
Практическое использование способов адресации (на примере команды ADD):
Адрес начала команды
| Команда, записанная на языке машинных кодов
| Та же самая команда, записанная на языке ассемблер
| Комментарий, поясняющий, как выполняется команда
|
| 05 34 12
| ADD AX,1234
| НЕПОСРЕДСТВЕННАЯ АДРЕСАЦИЯ:
Сложение 2-х байтового числа 1234 (12 – старший байт числа, 34 – младший байт числа) и содержимого 2-х байтового регистра АХ.Результат размещается в регистре АХ.
|
| 01 06 20 01
| ADD [0120],AX
| ПРЯМАЯ АДРЕСАЦИЯ:
Сложение 2-х байтового числа, находящегося в АХ, с 2-х байтовым числом, расположенном в ячейках оперативной памяти 0120 и 0121
(с содержимым ячейки 0120 складывается содержимое младшего байта АХ, а с содержимым ячейки 0121 складывается содержимое старшего байта АХ).
Результат размещается в ячейках 0120 и 0121.
|
| 03 1E 20 01
| ADD BX,[0120]
| ПРЯМАЯ АДРЕСАЦИЯ:
Сложение содержимого ячеек оперативной памяти 0120 и 0121 с содержимым 2-х байтового регистра ВХ (к младшему байту регистра ВХ, регистру BL, добавляется содержимое ячейки 0120, а к содержимому старшего байта регистра ВХ, регистра BH, добавляется содержимое ячейки 0121).
Результат размещается в регистре BX.
| 10B
| BD 38 01
| MOV BP,0138
| НЕПОСРЕДСТВЕННАЯ АДРЕСАЦИЯ:
Занесение 2-х байтового числа 0138 в 2-х байтовый регистр BP
| 10E
| 00 46 20
| ADD [BP+20],AL
| КОСВЕННАЯ АДРЕСАЦИЯ:
Сложение однобайтового числа, находящегося в АL, с содержимым 1-байтовой ячейки оперативной памяти, адрес которой определяется как сумма содержимого регистра BP и смещения 20, т.е. с содержимым ячейки с вычисляемым адресом 0158 (0138+20=0158).
Результат размещается в ячейке 0158.
|
| 01 46 E0
| ADD [BP-20],AX
| КОСВЕННАЯ АДРЕСАЦИЯ:
Сложение 2-байтового числа, находящегося в AX с содержимым ячеек оперативной памяти, адреса которых вычисляются как BP-20:
младший байт регистра АХ, именуемый АL, складывается с содержимым ячейки, вычисляемый адрес которой определяется как следующая сумма: 0118 (0138 - 20 +0 = 0118)
старший байт регистра АХ, именуемый АН, складывается с содержимым ячейки с вычисляемым адресом 0119 (0138 - 20 + 1 = 0119)
Результат размещается в ячейках 0118 и 0119.
|
| CD 20
| INT 20
| Команда завершения работы программы
| Трассировка представленного выше кода:
Позволяет проследить как выполняется операция сложения.
Первая команда ADD AX,1234 приводит к тому, что AX= 0+1234= 1234
Вторая команда ADD [0120], AX приводит к результату: [0120]= [0120] + AX = 0 + 1234 = 1234 ([0120]= 34 [0121]= 12)
Третья команда ADD BX,[0120] приводит к результату: BX= BX + 1234= 1234
Трассировка второй группы команд даёт следующие результаты:
Первая команда MOV BP,138 приводит к результату: BP= 0138
Вторая команда ADD [BP+20],AL приводит к результату: адрес= 0138 + 20 = 0158. Далее, [0158]= [0158] + AL = 0 + 34= 34
Третья команда ADD [BP-20],AX приводит к результату: адрес= 0138 - 20 = 0118. Далее, [0118]= [0118] + AL = 0 + 34= 34 и [0119]= [0119] + AH = 0 + 12= 12
| Задания к лабораторной работе:
Выполнить следующие задания:
- Изучить содержание лабораторной работы (в часы самоподготовки).
- Повторить выполнение разобранных в работе примеров (в часы самоподготовки).
- Законспектировать примеры применения команд (в часы самоподготовки).
- Чем завершится выполнение следующей группы команд:
MOV BX,80A0 MOV AX,90E0 ADD BX,BX ADD AX,BX MOV [BX],AX Чем завершится выполнение следующей группы команд: MOV DX,E0F0 MOV CX,A0C0 ADD CX,DX ADD DX,CX MOV [128],DX Чем завершится выполнение следующей группы команд: MOV DX,E0B0 MOV AX,F0D0 ADD AX,DX ADD AH,AL ADD AL,AH MOV [132],AX Чем завершится выполнение следующей группы команд: MOV CX,7090 MOV BX,9070 ADD BX,BX ADD CH,BL ADD CL,BH MOV [BX],CH Чем завершится выполнение следующей группы команд: MOV BP,190 MOV CX,9070 ADD CX,BP ADD CH,CL ADD CL,CH MOV [BP],CX
|
РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА:
1. Абель П. Язык ассемблера для IBM PC и программирования. - М.: Высшая школа, 1992.- 447 с.
2. Лямин Л.В. Макроассемблер MASM. - М.: Радио и связь, 1994.- 320 с.
3. Нортон П., Соухэ Д. Язык ассемблера для IBM PC. – М.: "Компьютер", Финансы и статистика, 1992. –352 с.
4. Сван Т. Освоение Turbo Assembler. – Киев: "Диалектика", 1996.
5. Юров В. Assembler: учебный курс. – СПб: Питер, 1998.
6. Юров В., Хорошенко С. Assembler: учебный курс.-Санкт-Петербург: Питер, 1999. -672
7. Юров В. Assembler: Специальный справочник. – СПб: Питер, 2000.
8. Юров В. ASSEMBLER: практикум. (с дискетой).-Санкт-Петербург: Питер, 2002. -400
9. Юров В. Assembler: практикум – СПб: Питер, 2003.- 400 с.
10. Пирогов В.Ю. Ассемблер на примерах. - СПб.: БХВ-Петербург, 2005. - 416 с.
11. Пирогов В.Ю. Ассемблер для Windows. - 3-е изд. - СПб.: БХВ-Петербург, 2005. - 864 с.
12. Шнайдер О. Язык ассемблера для персонального компьютера фирмы IBM. Пер. с англ. под ред. Е.К.Масловского.-Москва: Мир, 1988. -405C.
13. Юров В.И. Assembler. Учебник для вузов. 2-ое изд. – СПб: Питер, 2005. - 637 с.
14. Использование Turbo Assembler при разработке программ. – Киев: "Диалектика", 1994. - 288 с.
|
Лабораторная работа № 3
Тема: «Ассемблер i8086: типовые примеры».
Краткая аннотация: данная работа посвящена знакомству с типовыми примерами, выполненными с использованием команд ассемблера i8086. Перечень тем рассматриваемых ниже примеров таков:
- копирование ячеек указанного диапазона;
- занесение в ячейки указанного диапазона заданного ряда чисел;
- поиск и замена образцов указанного диапазона;
- подсчёт количества образцов указанного диапазона;
- суммирование содержимого ячеек заданного диапазона;
- нахождение минимального значения в заданном диапазоне;
- нахождение максимального значения в заданном диапазоне.
Студент должен освоить типовые примеры. Последнее означает:
- умение выполнять ручную трассировку ассемблерного кода для диапазона из 3-4 ячеек;
- умение составлять ассемблерный код для 2-х диапазонов.
Приобретенный в ходе выполнения работы опыт должен позволить в последующем ориентироваться в исходных кодах более сложных ассемблерных программ.
ЦЕЛЬ: Знакомство с простейшими типовыми примерами ассемблерных программ.
Студент должен освоить типовые примеры. Последнее означает:
- умение выполнять ручную трассировку ассемблерного кода для диапазона из 3-4 ячеек;
- умение составлять ассемблерный код для 2-х диапазонов.
Приобретенный в ходе выполнения работы опыт должен позволить в последующем ориентироваться в исходных кодах более сложных ассемблерных программ.
Типовые примеры ассемблерных программ.
В данной лабораторной работе собраны 7 простейших типовых программ-примеров:
- Копирование ячеек указанного диапазона.
- Занесение в ячейки указанного диапазона заданного ряда чисел.
- Поиск и замена образцов указанного диапазона.
- Подсчёт количества образцов указанного диапазона.
- Суммирование содержимого ячеек заданного диапазона.
- Нахождение минимального значения в заданном диапазоне.
- Нахождение максимального значения в заданном диапазоне.
К разряду простейших эти примеры отнесены по простой причине: ни в одном из них не требуется выводить символы на экран. Во всех случаях действия осуществляются с числами, располагающимися в ячейках оперативной памяти. Во всех случаях просмотр результатов предполагает использование отладчика DEBUG. Все рассматриваемые программы-примеры собраны в рабочей папке, где хранятся файлы описания данной лабораторной работы. Для загрузки этих файлов следует вспомнить раздел 1-ой лабораторной работы, в котором речь идёт о работе с файлами.
Команды, используемые в типовых примерах.
INT 20— команда, завершающая работу программы, размещённой в файле com-типа
INC Operand — увеличение значения операнда Operand на единицу (+1)
LOOP adress — команда цикла (CX<-CX-1, после чего, если CX<>0- переход на adress)
CMP Opr_1,Opr_2 — сравнение левого и правого операндов Opr_1 и Opr_2
JNZ adress — условный переход, если результат сравнения Opr_1 ≠ Opr_2
JBE adress — условный переход, если результат сравнения Opr_1 ≤ Opr_2
JAE adress — условный переход, если результат сравнения Opr_1 ≥ Opr_2
ADC Opr_1,0 — увеличение значения операнда Opr_1 на единицу, если Carry Flag = 1
|
Типовой пример №1.
Копирование ячеек заданного диапазона:
УСЛОВИЕ ЗАДАНИЯ:
Скопировать содержимое ячеек диапазона 130..13F в диапазон,
начинающийся с адреса 150. (все данные в 16-ой системе)
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений
(стартового адреса диапазона-источника= 130,
стартового адреса диапазона-приёмника= 150,
числа шагов цикла= 10).
(все данные в 16-ой системе)
Примечание. Расчет значения счетчика цикла:
CX= (13F - 130) + 1 = F + 1 = 10
(расчёты в 16-ой системе)
2. Организация цикла: AL <- [SI]
[DI]<- AL
(последовательное копирование содержимого
ячеек 130,131,132,...,13F
в ячейки 150,151,152,...,15F соответственно)
3. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV SI,0130; SI <- 130 (стартовый адрес диапазона-источника= 130)
103 MOV DI,0150; DI <- 150 (стартовый адрес диапазона-приёмника= 150)
106 MOV CX,0010; CX <- 10 (число шагов цикла = размеру дипазона = 10)
; цикл по перебору ячеек диапазона:
109 MOV AL,[SI]; AL <- [SI] (копирование в регистр AL содержимого очередной ячейки диапазона)
10B MOV [DI],AL; [DI] <- AL (размещение в очередной ячейке диапазона-приёмника содержимого AL)
10D INC SI; SI <- SI + 1 (наращивание адреса диапазона-источника: +1)
10E INC DI; DI <- DI + 1 (наращивание адреса диапазона-приёмника: +1)
10F LOOP 109; CX <- CX-1 После чего, если CX <> 0 - переход по адресу 109
111 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
Кроме того, будем считать, что изначально в ячейках 130..132
находятся следующие числа:
[130] = 10 [131] = 11 [132] = 12
100: SI = 130
103: DI = 150
106: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
109: AL = [130] = 10
10B: [150]= AL= 10 (содержимое 1-ой ячейки скопировано)
10D: SI= 130+1= 131
10E: DI= 150+1= 151
10F: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 109)
109: AL= [131]= 11
10B: [151] = AL = 11 (содержимое 2-ой ячейки скопировано)
10D: SI= 131+1= 132
10E: DI= 151+1= 152
10F: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 109)
109: AL= [132]= 12
10B: [152]= AL = 12 (содержимое 3-ей ячейки скопировано)
10D: SI= 132+1= 133
10E: DI= 152+1= 153
10F: CX= 1-1= 0 (CX= 0, поэтому цикл заканчивается)
111: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
[150]= 10 [151]= 11 [152]= 12
| Типовой пример №2.
Заполнение ячеек заданного диапазона указанным рядом чисел:
УСЛОВИЕ ЗАДАНИЯ:
Ввести в ячейки с адреса 120 числа 7,B,...,FF (все данные в 16-ой системе)
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений
(начального числа= 7,
стартового адреса= 120,
числа шагов цикла= 3F).
Примечание. Расчет значения счетчика цикла:
CX= (FF-7):4 + 1 = F8:4+1= 3E+1= 3F
2. Организация цикла: [DI]<- AL
(последовательное заполнение ячеек 120,121,122,... числами 7,B,F,...,FF)
3. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV AL,07; AL<- 7 (начальное число = 7)
102 MOV DI,0120; DI<- 120 (стартовый адрес = 120)
105 MOV CX,003F; CX<- 3F (число шагов цикла= 3F)
; цикл по перебору ячеек диапазона:
108 MOV [DI],AL; [DI]<- AL (размещение в очередной ячейке памяти очередного числа)
10A ADD AL,04; AL<- AL+4 (наращивание числа: +4)
10C ADD DI,0001; DI<- DI+1 (наращивание адреса: +1)
10F LOOP 108; CX<- CX-1 После чего, если CX<>0, следует переход по адресу 108
111 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
100: AL= 7
102: DI= 120
105: CX= 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
108: [120]= 7
10A: AL= 7+4= B
10C: DI= 120+1= 121
10F: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 108)
108: [123]= B
10A: AL= B+4= F
10C: DI= 121+1= 122
10F: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 108)
108: [126]= F
10A: AL= F+4= 13
10C: DI= 122+1= 123
10F: CX= 1-1= 0 (CX= 0, цикл завершен)
111: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
[120]= 7 [123]= B [126]= F
| Типовой пример №3.
Поиск и замена образца в заданном диапазоне:
УСЛОВИЕ ЗАДАНИЯ:
Просмотреть ячейки 120..16F и заменить символ "9" символом "5".
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений до начала цикла
(стартового адреса= 120,
ASCII-кода символа "5"= 35,
ASCII-кода символа "9"= 39,
числа шагов цикла= 50).
Примечание. Расчет значения счетчика цикла:
CX= (16F-120)+ 1 = 4F+1= 50
2. Организация цикла: [DI]<->AH
(последовательная проверка ячеек с целью поиска в них числа 39,
заполнение очередной ячейки кодом 35, если найден символ "9",
наращивание содержимого регистра DI)
3. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV DI,0120; DI<- 120
103 MOV AL,35; AL<- 35
105 MOV AH,39; AH<- 39
107 MOV CX,0050; CX<- 50
; цикл по перебору ячеек диапазона:
10A CMP [DI],AH;[DI]<->AH
10C JNZ 0110; переход, если "Not Zero" (не равное 0 значение)
10E MOV [DI],AL; [DI]<- AL (AL= 35)
110 INC DI; DI<- DI+1
111 LOOP 010A; CX<- CX-1, после чего, если CX<>0, переход на адрес 10А
113 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
В ячейках 120-122 разместим строку "193"
100: DI = 120
103: AL = 35
105: AH = 39
107: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
10A: [120]= 31<->39 Не равно, т.е. имеет место "Not Zero"
10C: переход на адрес 110, т.к. имеет место "Not Zero"
110: DI= 120+1= 121
111: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 10А)
10A: [121]= 39<->39 Равно, т.е. имеет место "Zero"
10C: переход на адрес 110 не следует, т.к. имеет место "Zero"
10E: [121]= 35
110: DI= 121+1= 122
111: CX= 2-1= 1 (CX=1> 0, поэтому следует переход на адрес 10А)
10A: [122]= 33<->39 Не равно, т.е. имеет место "Not Zero"
10C: переход на адрес 110, т.к. имеет место "Not Zero"
110: DI= 122+1= 123
111: CX= 1-1= 0 (CX=0, цикл завершен)
113: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
В ячейках 120-122 находятся символы "153"
| Типовой пример №4.
Подсчёт количества образцов в заданном диапазоне:
УСЛОВИЕ ЗАДАНИЯ:
Подсчитать количество символов «9» в диапазоне ячеек 120..16F. Результат сохранить в ячейке 170.
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений до начала цикла
(стартового адреса= 120,
ASCII-кода символа "5"= 35,
счётчика образцов= 0,
числа шагов цикла= 50).
Примечание. Расчет значения счетчика цикла:
CX= (16F-120)+ 1 = 4F+1= 50
2. Организация цикла: [DI]<->AH
(последовательная проверка ячеек с целью поиска в них числа 39,
наращивание значения счётчика образцов, если найден символ "9",
наращивание содержимого регистра DI)
3. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV DI,0120; DI<- 120
103 MOV AL,0; AL<- 0
105 MOV AH,39; AH<- 39
107 MOV CX,0050; CX<- 50
; цикл по перебору ячеек диапазона:
10A CMP [DI],AH;[DI]<->AH
10C JNZ 0110; переход, если "Not Zero" (не равное 0 значение)
10E INC AL; AL<- AL+1
110 INC DI; DI<- DI+1
111 LOOP 010A; CX<- CX-1, после чего, если CX<>0, переход на адрес 10А
113 MOV [170],AL; сохранение найденного количества образцов
116 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
В ячейках 120-122 разместим строку "193"
100: DI = 120
103: AL = 0
105: AH = 39
107: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
10A: [120]= 31<->39 Не равно, т.е. имеет место "Not Zero"
10C: переход на адрес 110, т.к. имеет место "Not Zero"
110: DI= 120+1= 121
111: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 10А)
10A: [121]= 39<->39 Равно, т.е. имеет место "Zero"
10C: переход на адрес 110 не следует, т.к. имеет место "Zero"
10E: AL= 0+1= 1 (один образец найден)
110: DI= 121+1= 122
111: CX= 2-1= 1 (CX=1> 0, поэтому следует переход на адрес 10А)
10A: [122]= 33<->39 Не равно, т.е. имеет место "Not Zero"
10C: переход на адрес 110, т.к. имеет место "Not Zero"
110: DI= 122+1= 123
111: CX= 1-1= 0 (CX=0, цикл завершен)
113: [170]= 1 (сохранение количества найденных образцов)
116: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
В ячейку 170 занесено число 1
| Типовой пример №5.
Суммирование содержимого ячеек заданного диапазона:
УСЛОВИЕ ЗАДАНИЯ:
Просуммировать содержимое ячеек 140..157. Результат сохранить в ячейках, начиная с ячейки 170
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений
(стартового адреса= 140,
числа шагов цикла= 18,
начального значения суммы= 0).
2. Организация цикла: (ADD AL,[BP])и(ADC AH,00)
(последовательное добавление содержимого ячеек 140..157 к накапливаемой сумме)
3. Сохранение найденной суммы (в ячейках памяти 0170 и 0171: [170]=AL [171]=AH).
4. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV AX,0000; в регистре AX накапливаться сумма, поэтому AX = 0
103 MOV BP,0140; в регистр BP заносится стартовый адрес ячеек диапазона
106 MOV CX,0018; в регистр CX заносится количество ячеек диапазона
; цикл по перебору ячеек диапазона:
109 ADD AL,[BP]; добавление к содержимому AL содержимого ячейки [BP]
10C ADC AH,00; добавление 1, если регистр AL оказался переполненным
10F INC BP; наращивание значения указателя адресов BP
110 LOOP 109; CX<- CX-1, после чего, если CX<>0, переход на адрес 10А
112 MOV [170],AX; сохранение в ячейках 170 и 171 найденной суммы
115 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
В ячейках 140-142 разместим числа 7A, D9, E6.
100: AX = 0
103: BP = 140
106: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
109: AL= AL+[140]= 0+7A= 7A (кроме того, Carry Flag CF= 0)
10C: AH= AH+0+CF= 0+0+0= 0
10F: BP= 140+1= 141
110: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 109)
109: AL= AL+[141]= 7A+D9= 53 (кроме того, Carry Flag CF= 1)
10C: AH= AH+0+CF= 0+0+1= 1
10F: BP= 141+1= 142
110: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 109)
109: AL= AL+[142]= 53+E6= 39 (кроме того, Carry Flag CF= 1)
10C: AH= AH+0+CF= 1+0+1= 2
10F: BP= 142+1= 143
110: CX= 1-1= 0 (CX=0, цикл завершён)
112: [170]= AL= 39 [171]= AH= 2 (найденная сумма= 239)
116: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
В ячейку 170 занесено число 39, в ячейку 171 число 2.
| Типовой пример №6.
Поиск минимального значения в заданном диапазоне:
УСЛОВИЕ ЗАДАНИЯ:
Определить минимальное число диапазона 140..16F. Результат сохранить в ячейке 170.
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений
(стартового адреса= 140,
числа шагов цикла= 30,
начального значения минимума= FF).
2. Организация цикла: (CMP DL,[BP+00]) (последовательное сопоставление
содержимого ячеек 140..16F с текущим минимумом)
3. Сохранение найденного минимума (в ячейке памяти 0170: [170]=DL).
4. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV BP,0140; загрузка в регистр BP начального адреса
103 MOV CX,0030; в регистр CX заносится количество ячеек диапазона
106 MOV DL,FF; в регистр DL заносится FF (начальное значение min)
; цикл по нахождению минимального значения:
108 CMP DL,[BP]; текущий min DL сравнивается с содержимым очередной яч-ки
10B JBE 0110; если текущий min DL ≤ [BP]имеет место переход на 110
10D MOV DL,[BP]; обновление текущего min DL (знач-е [BP] оказалось меньше)
110 INC BP; наращивание адреса текущей ячейки памяти
111 LOOP 0108; цикл по перебору ячеек памяти
113 MOV [170],DL; сохранение в ячейке 170 найденного минимума
117 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
В ячейках 140-142 разместим строку "391"
100: BP = 140
103: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
106: DL = FF (начальное значение min)
108: DL<->[BP] FF<->[140]=33 Результат сравнения > (больше)
10B: переход на адрес 110 не следует, т.к. имеет место > (больше)
10D: DL= [140]= 33 обновление текущего min DL
110: DI= 140+1= 141
111: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 108)
108: DL<->[BP] 33<->[141]=39 Результат сравнения < (меньше)
10B: переход на адрес 110, т.к. условие переходы выполнено
110: DI= 141+1= 142
111: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 108)
108: DL<->[BP] 33<->[142]=31 Результат сравнения > (больше)
10B: переход на адрес 110 не следует, т.к. имеет место > (больше)
10D: DL= [142]= 31 обновление текущего min DL
110: DI= 142+1= 143
111: CX= 1-1= 0 (CX=0, цикл завершён)
113: [170]= DL= 31 (сохранение найденного min)
116: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
В ячейку 170 занесено значение минимума 31
| Типовой пример №7.
Поиск максимального значения в заданном диапазоне:
УСЛОВИЕ ЗАДАНИЯ:
Определить максимальное число диапазона 140..16F. Результат сохранить в ячейке 170.
ПЛАН РЕШЕНИЯ:
1. Задание начальных значений
(стартового адреса= 140,
числа шагов цикла= 30,
начального значения максимума= 0).
2. Организация цикла: (CMP DL,[BP+00]) (последовательное сопоставление
содержимого ячеек 140..16F с текущим максимумом)
3. Сохранение найденного максимума (в ячейке памяти 0170: [170]=DL).
4. Завершение работы программы (INT 20)
КОД ПРОГРАММЫ:
100 MOV BP,0140; загрузка в регистр BP начального адреса
103 MOV CX,0030; в регистр CX заносится количество ячеек диапазона
106 MOV DL,0; в регистр DL заносится 0 (начальное значение max)
; цикл по нахождению максимального значения:
108 CMP DL,[BP]; текущий max DL сравнивается с содержимым очередной яч-ки
10B JAE 0110; если текущий max DL ≥ [BP]имеет место переход на 110
10D MOV DL,[BP]; обновление текущего max DL (знач-е [BP] оказалось больше)
110 INC BP; наращивание адреса текущей ячейки памяти
111 LOOP 0108; цикл по перебору ячеек памяти
113 MOV [170],DL; сохранение в ячейке 170 найденного максимума
117 INT 20; завершение работы
ПРОВЕРКА РЕШЕНИЯ:
Для проверки решения уменьшим значение счетчика цикла СХ до 3.
В ячейках 140-142 разместим строку "319"
100: BP = 140
103: CX = 3 (т.к. проверка проводится для первых 3-х ячеек диапазона)
106: DL = 0 (начальное значение max)
108: DL<->[BP] 0<->[140]=33 Результат сравнения < (меньше)
10B: переход на адрес 110 не следует, т.к. имеет место < (меньше)
10D: DL= [140]= 33 обновление текущего max DL
110: DI= 140+1= 141
111: CX= 3-1= 2 (CX=2>0, поэтому следует переход на адрес 108)
108: DL<->[BP] 33<->[141]=31 Результат сравнения > (больше)
10B: переход на адрес 110, т.к. условие переходы выполнено
110: DI= 141+1= 142
111: CX= 2-1= 1 (CX=1>0, поэтому следует переход на адрес 108)
108: DL<->[BP] 33<->[142]=39 Результат сравнения < (меньше)
10B: переход на адрес 110 не следует, т.к. имеет место < (меньше)
10D: DL= [142]= 39 обновление текущего max DL
110: DI= 142+1= 143
111: CX= 1-1= 0 (CX=0, цикл завершён)
113: [170]= DL= 39 (сохранение найденного max)
116: INT 20 - завершение работы.
РЕЗУЛЬТАТ РЕШЕНИЯ:
В ячейку 170 занесено значение минимума 39
| Задания к лабораторной работе:
Выполнить следующие задания:
- Изучить содержание лабораторной работы (в часы самоподготовки).
- Повторить выполнение разобранных в работе программ (в часы самоподготовки).
- Выполнить проверку решения типового задания "Подсчитать количество символов "7" в диапазоне ячеек 140..17E. Результат сохранить в ячейке 134". Проверку выполнить для первых 3-х ячеек диапазона ([140]= 34;[141]= 37;[142]= 36).
- В диапазоне ячеек памяти 140-173 заменить все заглавные буквы "В", встречающиеся в этом диапазоне на строчные "в", а в диапазоне 174-183 определить максимальное значение, сохранив результат в ячейке 184.
- Выполнить проверку решения типового задания "Просуммировать содержимое ячеек 143..157. Результат сохранить в ячейках, начиная с ячейки 140". Проверку выполнить для первых 4-х ячеек диапазона ([143]= AD;[144]= BC;[145]= FE;[146]= ED).
- Скопировать содержимое ячеек диапазона 130-149 в диапазон, начинающийся адресом 150, а в диапазоне 16А-180 определить минимальное значение, сохранив результат в ячейке 181
- Выполнить проверку решения типового задания "Определить минимальное число диапазона 141..16F. Результат сохранить в ячейке 140". Проверку выполнить для первых 3-х ячеек диапазона ([141]= 34;[142]= 37;[143]= 32).
- Занести в ячейки диапазона 140-149 числа 2, 6, A, …, а в диапазоне 15А-177 определить количество символов "6", сохранив результат в ячейке 181.
| РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА:
1. Абель П. Язык ассемблера для IBM PC и программирования. - М.: Высшая школа, 1992.- 447 с.
2. Лямин Л.В. Макроассемблер MASM. - М.: Радио и связь, 1994.- 320 с.
3. Нортон П., Соухэ Д. Язык ассемблера для IBM PC. – М.: "Компьютер", Финансы и статистика, 1992. –352 с.
4. Сван Т. Освоение Turbo Assembler. – Киев: "Диалектика", 1996.
5. Юров В. Assembler: учебный курс. – СПб: Питер, 1998.
6. Юров В., Хорошенко С. Assembler: учебный курс.-Санкт-Петербург: Питер, 1999. -672
7. Юров В. Assembler: Специальный справочник. – СПб: Питер, 2000.
8. Юров В. ASSEMBLER: практикум. (с дискетой).-Санкт-Петербург: Питер, 2002. -400
9. Юров В. Assembler: практикум – СПб: Питер, 2003.- 400 с.
10. Пирогов В.Ю. Ассемблер на примерах. - СПб.: БХВ-Петербург, 2005. - 416 с.
11. Пирогов В.Ю. Ассемблер для Windows. - 3-е изд. - СПб.: БХВ-Петербург, 2005. - 864 с.
12. Шнайдер О. Язык ассемблера для персонального компьютера фирмы IBM. Пер. с англ. под ред. Е.К.Масловского.-Москва: Мир, 1988. -405C.
13. Юров В.И. Assembler. Учебник для вузов. 2-ое изд. – СПб: Питер, 2005. - 637 с.
14. Использование Turbo Assembler при разработке программ. – Киев: "Диалектика", 1994. - 288 с.
|
Лабораторная работа № 4
Тема: «Функции ввода и вывода строк прерывания INT 21h».
Краткая аннотация: данная работа посвящена знакомству с функциями ввода/вывода строк, что предполагает, в частности:
- знакомство с 9-ой и 10-ой функциями прерывания INT 21h;
- знакомство с форматом выводимой на экран строки;
- знакомство со структурой буфера вводимой с клавиатуры строки;
- знакомство с приёмами обработки введённой с клавиатуры строки.
Студент должен освоить приёмы использования функций ввода/вывода строк.
Приобретенный в ходе выполнения работы опыт должен позволить в последующем ориентироваться в листингах ассемблерных модулей.
ЦЕЛЬ: Знакомство с функциями ввода/вывода строк и приёмами использования возможностей этих функций.
Вывод строк.
Краткое описание функции вывода строк прерывания INT 21h:
Вывод строки на экран монитора осуществляется с помощью 9-ой функции прерывания 21h операционной системы MS DOS.
В регистре DX задаётся адрес выводимой строки. Ограничителем символов выводимой строки является знак $ (ASCII-код знака $ равен 24h).
В регистре AH задаётся номер функции прерывания 21h: 9-ая функция.
| Программная реализация вывода строки в отладчике DEBUG:
Программа, реализующая вывод строки, имеет вид:
Вводим строку, начиная с адреса 140:
Введённая строка располагается в памяти следующим образом:
Запускаем программу, обеспечивающую вывод строки @ABCDEFG на экран.
|
Ввод строк.
Краткое описание функции ввода строки с клавиатуры (прерывание INT 21h):
Ввод строки с клавиатуры осуществляется с помощью 10-ой (Ah) функции прерывания 21h операционной системы MS DOS.
В регистре DX задаётся адрес буфера вводимой строки. Ограничитель количества вводимых с клавиатуры символов строки вносится в первую ячейку буфера.
Количество вводимых с клавиатуры символов на 1 меньше значения ограничителя.
В регистре AH задаётся номер функции прерывания 21h: 10-ая (Ah) функция.
| Программная реализация ввода строки в отладчике DEBUG:
Программа, реализующая ввод строки, имеет вид:
Вводим значение ограничителя на количество вводимых с клавиатуры символов строки в ячейку памяти с адресом 150:
Введённое значение (4 символа) располагается в памяти следующим образом:
Запускаем программу, введя в ходе её работы значение ABC с клавиатуры:
По завершении работы программы просматриваем содержимое ячеек оперативной памяти:
|
Ввод и вывод строк.
Задача. Запросить имя. Ввести это имя. Вывести именное приветствие.
Программа, представляющая собою решение задачи, имеет вид:
-u 100 135
0CE7:0100 BA 40 01 MOV DX,0140 0CE7:0103 B4 09 MOV AH,09 0CE7:0105 CD 21 INT 21 OCE7:0107 BA 60 01 MOV DX,0160 0CE7:010A B4 0A MOV AH,0A 0CE7:010C CD 21 INT 21 0CE7:010E BA 5C 01 MOV DX,015C 0CE7:0111 B4 09 MOV AH,09 0CE7:0113 CD 21 INT 21 0CE7:0115 BD 40 01 MOV BP,0140 0CE7:0118 8A 4E 21 MOV CL,[BP+21] 0CE7:011B B5 00 MOV CH,00 0CE7:011D 8A 66 22 MOV AH,[BP+22] 0CE7:0120 88 66 47 MOV [BP+47],AH 0CE7:0123 45 INC BP 0CE7:0124 E2 F7 LOOP 01ID 0CE7:0126 B8 21 24 MOV AX,2421 0CE7:0129 89 46 47 MOV [BP+47],AX 0CE7:012C B4 09 MOV AH,09 0CE7:012E BA 80 01 MOV DX.0180 0CE7:0131 CD 21 INT 21
0CE7:0133 CD 20 INT 20
Состояние ячеек оперативной памяти перед запуском программы на исполнение:
-d 140 I5O
0CE7:0140 57 68 61 74 27 73 20 79-6F 75 72 20 6E 61 6D 65 What's your name 0CE7:0150 3F 20 20 24 00 00 00 00-00 00 00 00 0D 0A 24 00? $..........$. 0CE7:0160 1D 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................ 0CE7:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................ 0CE7:0180 48 65 6C 6C 6F 2C 20 00-00 00 00 00 00 00 00 00 Hello,.........
Результат запуска программы на исполнение:
-G=100
What's your name? Without Hello, Without! Программа завершилась нормально
Состояние ячеек оперативной памяти по завершении работы программы:
0CE7:0140 57 68 61 74 27 73 20 79-6F 75 72 20 6E 61 6D 65 What's your name 0CE7:0150 3F 20 20 24 00 00 00 00-00 00 00 00 0D 0A 24 00? $..........$. 0CE7:0160 1D 07 57 69 74 68 6F 75-74 0D 00 00 00 00 00 00..Without....... 0CE7:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................ 0CE7:0180 48 65 6C 6C 6F 2C 20 57-69 74 68 6F 75 74 21 24 Hello, Without!$
Комментарии:
100..135 – код; 140..153 – текст запроса; 15C..15E – ASCII-коды перевода строки; 160 – буфер ввода (1C(h) – максимальное число вводимых символов) 170 – начало текста именного приветствия, завершающегося восклицательным знаком
| Задания к лабораторной работе:
Выполнить следующие задания:
- Изучить содержание лабораторной работы (в часы самоподготовки).
- Повторить выполнение разобранных в работе примеров (в часы самоподготовки).
- Законспектировать примеры применения команд (в часы самоподготовки).
- Составить следующие программы:
- ввести строку символов и вывести на экран первые 5 символов введённой строки; - ввести строку символов и вывести на экран последние 5 символов введённой строки; - ввести строку символов и вывести на экран все символы строки, кроме 3-х первых символов и 3-х последних.
|
РЕКОМЕНДУЕМАЯ ЛИТЕРАТУРА:
1. Абель П. Язык ассемблера для IBM PC и программирования. - М.: Высшая школа, 1992.- 447 с.
2. Лямин Л.В. Макроассемблер MASM. - М.: Радио и связь, 1994.- 320 с.
3. Нортон П., Соухэ Д. Язык ассемблера для IBM PC. – М.: "Компьютер", Финансы и статистика, 1992. –352 с.
4. Сван Т. Освоение Turbo Assembler. – Киев: "Диалектика", 1996.
5. Юров В. Assembler: учебный курс. – СПб: Питер, 1998.
6. Юров В., Хорошенко С. Assembler: учебный курс.-Санкт-Петербург: Питер, 1999. -672
7. Юров В. Assembler: Специальный справочник. – СПб: Питер, 2000.
8. Юров В. ASSEMBLER: практикум. (с дискетой).-Санкт-Петербург: Питер, 2002. -400
9. Юров В. Assembler: практикум – СПб: Питер, 2003.- 400 с.
10. Пирогов В.Ю. Ассемблер на примерах. - СПб.: БХВ-Петербург, 2005. - 416 с.
11. Пирогов В.Ю. Ассемблер для Windows. - 3-е изд. - СПб.: БХВ-Петербург, 2005. - 864 с.
12. Шнайдер О. Язык ассемблера для персонального компьютера фирмы IBM. Пер. с англ. под ред. Е.К.Масловского.-Москва: Мир, 1988. -405C.
13. Юров В.И. Assembler. Учебник для вузов. 2-ое изд. – СПб: Питер, 2005. - 637 с.
14. Использование Turbo Assembler при разработке программ. – Киев: "Диалектика", 1994. - 288 с.
|
Лабораторная работа N 1.
|