
- •Лабораторна робота №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
по формулі:
(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 |
Логічне АБО що виключає |