 
        
        - •Лабораторна робота №5
- •4. Методичні вказівки для виконання роботи
- •4.1 Проста програма на Асемблері
- •4.4 Теоретичні відомості про команди мови Assembler
- •4.4.1. Команди арифметичниз операцій
- •4.4.2. Команди передачі значень:
- •4.4.3.Команди додавання і віднімання.
- •4.4.4 Команди множення й ділення.
- •4.4.5Команди умовного Перехіду
- •Контрольний приклад
- •4.5 Введення і виведення
- •4.5.1Введення/виведення з використанням модуля io.Asm
- •Ввод числа: inint ор
- •4.5.2 Приклад програми з використанням io.Asm
4.5.2 Приклад програми з використанням io.Asm
Формулювання завдання
Р озробити
програму обчислення Z
залежно від значення символу ch
по формулі:
озробити
програму обчислення Z
залежно від значення символу ch
по формулі:
(3v) / (2d)якщо ch ≥ 'n'
55, якщо ch < 'n'
де: v (байт) - вік студента ( кількість повних років );
d (байт) - день народження студента.
Значення символу ch вводиться з клавіатури.
При тестуванні програми для виведення набутих значень Z використовувати модуль IO.ASM
Постановка завдання Для визначення типу величини Z проаналізуємо формулу її розрахунку. У першій, найбільш складній частині формули, Z - результат ділення чисел, означає під розміщення Z необхідно виділити масив з двох елементів (неповна частка і залишок). Тип обох результатів ділення співпадає з типом дільника, в даному випадку, цей твір 2*d, причому d по умові завдання - байт. Твір співмножників - байтів дає результат розміром слово. Таким чином, Z слід описати як масив з двох елементів-слів.
На початку програми треба передбачити виведення запрошення на введення будь-якого ASCII -символа. Для введення символу використовувати можливості переривання int 21h, причому для контролю за правильністю введення використовувати функцію 1h.
Після порівняння введеного символу із заданим виконати обчислення Z за відповідною формулою і перейти на блок виведення результату. Блок виводу має забезпечувати виведення двох результатів, якщо розрахунок виконується по першій частині формули, і одного - якщо по другій. Для коректної роботи блоку виводу ввести допоміжну змінну - прапор, що має деяке початкове значення (наприклад, 0), що задається при її описі, і що змінюється (наприклад, на 1), якщо розрахунок виконується по першій частині формули. Блок в обох випадках забезпечує безумовне виведення одного результату (неповної частки або 55), а далі після аналізу прапора або виводить другий результат (залишок), або відразу виконує перехід на завершення програми. Перед виведенням залишку передбачити табуляцію - переведення курсора вправо на 8
При виконанні розрахунку по першій частині формули в цілях скорочення пересилок даних при діленні спочатку вирахувати знаменник 2*d, а потім чисельник 3*v. Треба врахувати, що дільник має тип - слово, отже, ділиме (чисельник) розміщується в подвійному слові DX : AX. В той же час чисельнику, який є результатом множення байтів 3*v, фактично вистачає слова, а саме, АХ. Означає в цьому конкретному випадку для отримання правильного результату перед діленням необхідно очистити регістр DX.
Для виведення чисел підключити до програми модуль IO.ASM.
2.12.3 Тестування програми
Початкові дані: d=28, v=20. При введенні символу f розрахунок робиться по першій частині формули, неповна частка дорівнює 1, а залишок 4. Якщо ввести символ t, то результат дорівнює 55
2.12.4 Лістинг програми
model small
include io.asm ; підключення модуля
io.asm .stack 100h
.data d db 28v db 20
z dw ?, ? ; для результату
zaprosh db 'Введіть символ-> ','$'
rez db 'Результат розрахунку -> ','$'
flag db 0 ;початкове значення прапора
.code start: ; точка входу в програму
mov ax, @data ; завантаження адреси сегмента данних
mov ds, ax
mov dx, offset zaprosh ; вивод рядка
mov ah, 9h
int 21h
mov ah, 1h ; ввод символа
int 21h ; код символа в al
cmp al, ‘n’ ; порівняння кодів символів
jb menshe ; якщо введенний символ менший, перейти на мітку на menshe
;********* ch≥s' - розрахунок першої частини *********
mov flag, 1 ; нове значення прапорця =1
mov al, 2 ; підготовка множення (знаменник)
mul d ; [ax]=2d
mov bx, ax ; копіювання 2d в bx
mov al, 3 ; чисельник
mul v ; [ax]=3v
; для ділення чисельник має бути: в dx - старше слово,
; в ax - моладше слово (вже знаходиться)
mov dx, 0 ; очистка dx
div bx ; неповна частка в ax, залишок в dx
mov z, ax ; неповна частка в перше слово масива z
mov z+2, dx ; залишок во друге слово масива z
jmp vivod ; безузмовний перехід на блок виводу
; ************* розрахунок другої частини ***************
menshe: mov z, 55 ; результат в перше слово масива z
; ******************** блок виводу ************************
vivod: mov dx, offset rez ; вивід рядка - повідомлення
mov ah, 9h
int 21h
outint z ; вивод першого слова масива z
cmp flag, 0 ; якщо прапор=0, вивід завершено
je finish
; прапор змінився, продолженння виводу
mov dl, 9 ; вивод символа «табуляція»
mov ah, 2h
int 21h
outint z+2 ; вивод другого слова масива z
; завершення роботи
finish: mov ah, 1 ; затримка для вивчення результату
int 21h
mov ax, 4C00h
int 21h
end start
Варінти Завдань
| 1) (2X+3Y)Z, Y<2 та X>5 F= (3XX-Z)/Y, Y>0 або z<8 3Z, в інших випадках 2) 5/y+3x, x=>5 та y<>0 F= 4x-3z, z<2 або x<3 x+y+z в інших випадках 3) (4xx-3)/5+7y, x>5 або в>0 F=(y-3)/z, z<>0 та x<=5 5y+7, в інших випадках 4) (3x+9y)/(2+3z), z<>3 та в>10 F=7y+5x-z, y<8 або x<5 zz-3, в інших випадках 5) 6x+2y, x=5 або z>0 F=z-3/5y, y<>0 та x=0 4x+5y-z, в інших випадках 6) (7x-5)/7, y>0 або z=0 F= y-3+z, y<=10 та x=0 x+z+zz-2, в інших випадках 7) 4x+z, y=0 або x<5 F= 5y-3+6z/(z-1), x=0 та z<>1 x+y, в інших випадках 8) 3x+5, x>5 або y=0 F= 7y-7+6x/z, x<3 та z<>0 zz, в інших випадках 9) 4x/5y, y<>0 та x>5 F= 6y-3z, z>3 або x<3 6xx, в інших випадках 10) 7x+xx-1, x<10 та z=0 F= 5y/z, x>5 або y=0 5x+3y+3, в інших випадках 11) (2X+3Y)Z, Y<2 та X>5 F= (3XX-Z)/Y-1, x>0 або z<8 3Z в інших випадках 12) 5/y+3x, x=5 або y<>0 F= 4x-3z, y<2 та x>3 x+y+z в інших випадках 
 25) a/b-37 a>b 3 a=b (a3-b)/a в інших випадках 
 | 
 13) (3xx+9y)/2+3*в, z<>3 та в>0 F=7y+5x-6z, z>1 або x<5 zz-5x, в інших випадках 14) 6x+2y+1, x=5 або z=0 F=z-3+4x, y=0 та z>10 4x+5y-z, в інших випадках 15) (3x-5)/7+1, y>15 або z=0 F= y-3+z, y<10 та x=0 x+z+2y, в інших випадках 16) 4x+z/7, y=0 або x<5 F= 5y+6z/(z-1), x=0 та z<>1 x+y-z, в інших випадках 17) 3x+2z+5, x>5 або y=0 F= 7y-7+6x/z, x<3 та z<>0 z+3x, в інших випадках 18) 4x/5y+3z, y<>0 та x>15 F= 8y-3z-1, z>3 або x<3 6x+y, в інших випадках 19) 7x+yx-1, x<12 та z=0 F= 5y/z+2, x>5 або y>=10 4x+3y+7, в інших випадках 20) (2XY+3Y)Z, Y<2 та X>5 F= (3XX-Z)/3+Y, Y>0 або z<=8 3Z+1, в інших випадках 21) y/2+3x, x>=5 або y<>0 F= (4x-3z)/(2x+1), z<2 та x>3 x+y+z в інших випадках 22) (4x-3)/5+7yz, x>=5 або в>0 F=(y-3)/z+x, z<>0 та x<=5 5y+7, в інших випадках 23) (3x+9)/(3+3z), z<>-1 та в>10 F=7y+5x-z, z>3 або x<5 (z-3)x, в інших випадках 24) 6x+2y-1, x<=5 або z>6 F=z-3/5y, y<>0 та x=0 4x+5y-z, в інших випадках 26) b/a-55 a>b F=7y+5x-z, z>3 або x<5 6x+y, в інших випадках 
 
 27) 7x+5, x>5 або y=0 F= 7y-7+6x/z, x<3 та z<>0 2z-4x, в інших випадках 
 
 
 | 
ДОДАТОК
Система команд мікропроцесора Intel 8086
| Мнемокод | Дія | 
| 1 | 2 | 
| AAA | Коригування додавання для представлення в кодах ASCII | 
| FFD | Коригування ділення для представлення в кодах ASCII | 
| AAM | Коригування множення для представлення в кодах ASCII | 
| AAS | Коригування віднімання для представлення в кодах ASCII | 
| ADC | Додавання з переносом | 
| ADD | Додавання | 
| AND | Логічне І | 
| CALL | Виклик процедури | 
| CBW | Перетворення байта в слово | 
| CLC | Обнулення прапора переносу | 
| CLI | Обнулення прапора переривання | 
| CMC | Обернення прапора переносу | 
| CMP | Порівняння значень | 
| CMPS, CMPSB, CMPSB | Порівняння рядків | 
| CWD | Перетворення слова в подвійне слово | 
| DAA | Коригування додавання для представлення в десятичній формі | 
| DAS | Коригування віднімання для представлення в десятичній формі | 
| DEC | Зменшення значення на 1 | 
| DIV | Ділення | 
| ECS | Передача команди співпроцесору | 
| HLT | Зупинка програми | 
| IDIV | Ділення цілих чисел | 
| IMUL | Множення цілих чисел | 
| IN | Зчитування значення з порту | 
| INC | Прирощення значення на 1 | 
| INT | Переривання | 
| INTO | Переривання при переполнении | 
| IRET | Повернення після переривання | 
| JA, JNBE | Перехід, якщо більше | 
| JAE, JNB | Перехід, якщо більше або дорівнює | 
| JNC | Перехід, якщо нема переносу | 
| JB, JNAE | Перехід, якщо нижче | 
| JC | Перехід, якщо є перенос | 
| JBE, JNA | Перехід, якщо ниже або дорівнює | 
| JCXZ | Перехід, якщо значення регістра CX дорівнює 0 | 
| JE, JZ | Перехід, якщо дорівнює | 
| JG, JNLE | Перехід, якщо більше | 
| JGE, JNL | Перехід, якщо більше або дорівнює | 
| JL, JGNE | Перехід, якщо менше | 
| JLE, JNG | Перехід, якщо менше або дорівнює | 
| JMP | Перехід безумовний | 
| JNE, JNZ | Перехід, якщо не дорівнює | 
| JNO | Перехід, якщо нема переполнення | 
| JNP, JPO | Перехід, якщо нема четности | 
| JNS | Перехід, якщо знакови й разряд = 0 | 
| JO | Перехід, якщо переповнення | 
| JP, JPE | Перехід, якщо есть парність | 
| JS | Перехід, якщо знаковий разряд =1 | 
| LAHF | Завантаження регістра AH прапори | 
| LDS | Завантаження вказівникя с використанням регістра DS | 
| LEA | Завантаження виконавчої адреси | 
| LES | Завантаження вказівника с використаням регістра ЕS | 
| LOCK | Блокування шини | 
| LODS, LODSB, LODSW | Завантаження рядка | 
| LOOP | Повторення цикла до кінця лічильника | 
| LOOPE, LOOPZ | Повторення цикла, якщо дорівнює | 
| LOOPNE, LOOPNZ | Повторення цикла, якщо не дорівнює | 
| MOV | Пересилка значення | 
| MOVS, MOVSB, MOVSW | Пересилка рядка | 
| MUL | Множення | 
| NEG | Обернення знака | 
| NOP | Нема операції | 
| NOT | Обернення бітів | 
| OR | Логічне АБО | 
| OUT | Вивід значення в порт | 
| POP | Видобування значення из стека | 
| POPF | Видобування прапорів із стека | 
| PUSH | Розміщення значення в стек | 
| PUSHF | Розміщення прапорів в стек | 
| RCL | Зсув вліво циклічно с прапорцем переносу | 
| RCR | Зсув вправо циклічно с прапорцем переносу | 
| REP, REPE, REPZ | Повторення, доки дорівнює | 
| REPNE, REPNZ | Повторення, доки не дорівнює | 
| RET | Повернення в модуль (процедуру) | 
| ROL | Зсув вліво циклічно | 
| ROR | Зсув вправо циклічно | 
| SAHF | Завантажити прапори з регістра AH | 
| SAL, SHL | Зсув вліво арифметично | 
| SAR | Зсув вправо арифметично | 
| SBB | Віднімання с зайомом | 
| SCAS, SCASB, SCASW | Сканування рядка | 
| SHR | Зсув вправо логічний | 
| STC | Установка прапора переносу | 
| STD | Установка прапора направлення | 
| STI | Установка прапора переривання | 
| STOS, STOSB, STOSW | Збереження рядка | 
| SUB | Віднімання | 
| TEST | Перевірка | 
| WAIT | Очікування | 
| XCHG | Обмін значень | 
| XLAT | Вибір значень из таблиці | 
| XOR | Логічне АБО що виключає | 
	 
		
