Команды, используемые в типовых примерах.
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. Абель П. Язык ассемблера для 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 с. |
Дата добавления: 2016-06-29; просмотров: 1961;