Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 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 Логічне АБО що виключає

 






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных