Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Данная команда копирует содержимое правого операнда в левый операнд.

Поиск

Эта команда, равно как и практически все остальные команды, оперирующие парой операндов, удовлетворяет двум важным условиям:

Результат операции сохраняется в левом операнде.

 

Ёмкости левого и правого операндов равны: 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):
Команда 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):

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

Задания к лабораторной работе:

Выполнить следующие задания:
  1. Изучить содержание лабораторной работы (в часы самоподготовки).
  2. Повторить выполнение разобранных в работе примеров (в часы самоподготовки).
  3. Законспектировать примеры применения команд (в часы самоподготовки).
  4. Чем завершится выполнение следующей группы команд:
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 простейших типовых программ-примеров:

  1. Копирование ячеек указанного диапазона.
  2. Занесение в ячейки указанного диапазона заданного ряда чисел.
  3. Поиск и замена образцов указанного диапазона.
  4. Подсчёт количества образцов указанного диапазона.
  5. Суммирование содержимого ячеек заданного диапазона.
  6. Нахождение минимального значения в заданном диапазоне.
  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

Задания к лабораторной работе:

Выполнить следующие задания:
  1. Изучить содержание лабораторной работы (в часы самоподготовки).
  2. Повторить выполнение разобранных в работе программ (в часы самоподготовки).
  3. Выполнить проверку решения типового задания "Подсчитать количество символов "7" в диапазоне ячеек 140..17E. Результат сохранить в ячейке 134". Проверку выполнить для первых 3-х ячеек диапазона ([140]= 34;[141]= 37;[142]= 36).
  4. В диапазоне ячеек памяти 140-173 заменить все заглавные буквы "В", встречающиеся в этом диапазоне на строчные "в", а в диапазоне 174-183 определить максимальное значение, сохранив результат в ячейке 184.
  5. Выполнить проверку решения типового задания "Просуммировать содержимое ячеек 143..157. Результат сохранить в ячейках, начиная с ячейки 140". Проверку выполнить для первых 4-х ячеек диапазона ([143]= AD;[144]= BC;[145]= FE;[146]= ED).
  6. Скопировать содержимое ячеек диапазона 130-149 в диапазон, начинающийся адресом 150, а в диапазоне 16А-180 определить минимальное значение, сохранив результат в ячейке 181
  7. Выполнить проверку решения типового задания "Определить минимальное число диапазона 141..16F. Результат сохранить в ячейке 140". Проверку выполнить для первых 3-х ячеек диапазона ([141]= 34;[142]= 37;[143]= 32).
  8. Занести в ячейки диапазона 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 – начало текста именного приветствия, завершающегося восклицательным знаком

Задания к лабораторной работе:

Выполнить следующие задания:
  1. Изучить содержание лабораторной работы (в часы самоподготовки).
  2. Повторить выполнение разобранных в работе примеров (в часы самоподготовки).
  3. Законспектировать примеры применения команд (в часы самоподготовки).
  4. Составить следующие программы:
- ввести строку символов и вывести на экран первые 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.



Поделиться:


Последнее изменение этой страницы: 2016-07-16; просмотров: 765; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.153.232 (0.012 с.)