Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
default.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
256.51 Кб
Скачать

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

Логічне АБО що виключає

18

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]