Главная
Популярная публикация
Научная публикация
Случайная публикация
Обратная связь
ТОР 5 статей:
Методические подходы к анализу финансового состояния предприятия
Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века
Ценовые и неценовые факторы
Характеристика шлифовальных кругов и ее маркировка
Служебные части речи. Предлог. Союз. Частицы
КАТЕГОРИИ:
|
Приклад програми з використанням 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
Мнемокод
| Дія
|
|
| 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
| Логічне АБО що виключає
|
Не нашли, что искали? Воспользуйтесь поиском:
|