
- •Лабораторна робота №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
Контрольний приклад
Нехай треба обчислити
F= (4xx-3)/5y, якщо x>5 або y=5, додаткова умова - z<>0
F=(y-3)/z+2, або якщо z<>0 та x<=5
F= y*y-3, в інших випадках
………….
cmp y,5
je m1
cmp x,5
jg m1
cmp z,0
jne m2
mov ax,y
imul y
sub ax,3
jmp stop
m1: mov ax,4
imul x
imul x
sub ax,3
mov bx,5
xchg ax,bx
imul y
xchg ax,bx
idiv bx
jmp stop
m2: mov ax,y
sub ax,3
idiv z
add ax,2
stop:
mov f,ax
……………….
4.5 Введення і виведення
Будь яка програма потребує засобів вводу і виводу. Команди Асемблера можуть це зробити єдиним способом – реалізувати переривання операційної системи або BIOS. В прикладі Розділу 4.1 було показано як виводити, наприклад, рядок. Проте ввведення і виведення чисел для програми Асемблера являє собою певну проблему. Причина в тому, що процесор не працює з числом чи символом –він працює з кодом числа або символа.
Команди Асемблера можуть використовувати як символьні константи так числові константи.
Найлегше користуватися десятковими значеннями (тобто з основою 10), оскільки ми звикли до них в повсякденному житті. Ясно, найпростіше ввести: mov cx, 100 ; встановити лічильник в значення 100 Насправді, Турбо Асемблер рахує значення десятковими, якщо ви не вказали зворотне. Проте, десяткові значення у багатьох випадках не зовсім підходять для програмування на мові Асемблера, оскільки комп'ютери є двійковими пристроями . Тоді логічно використовувати в програмах на Асемблері двійкове представлення. Ви можете вказати Турбо Асемблеру, що число виражене в двійковому виді, якщо просто помістите у кінці числа букву b (звичайно, при цьому число повинне складатися тільки з 0 і 1, оскільки це єдині дві цифри, допустимі в двійковому представленні). Наприклад, десяткове значення 5 двійковому виді, буде 101b. Наприклад, перепишемо інструкцію з операндами в двійковому представленні
mov cx, 1100100b ; встановити лічильник ; значення 100 Шістнадцяткові числа позначаються суфіксом h. Крім того, шістнадцяткові числа повинні починатися з однією з цифр 0-9, оскільки шістнадцяткове число типу BAD4h може помилково інтерпретуватися, як мітка. Наведемо приклад, до якому використовується як число 0BAD4h, так і мітка BAD4h : . . . .DATA BAD4h DW 0 ; мітка BAD4h . . . .CODE mov ax, 0BAD4h ; завантажити в AX ; шістнадцяткову константу (перший 0 показує, що це константа ) . . . mov ax, BAD4h ; завантажити в AX із змінної в пам'яті ; BAD4h (відсутність 0 в першому символі показує, що це мітка
Щоб показати, що число є десятковим, в ролі суфікса можна використовувати букву d. Навіщо ж потрібний цей суфікс, якщо за умовчанням Турбо Асемблер і так припускає, що усі числа є десятковими? Як ви можете здогадатися, відповідь полягає в тому, що числа окрім десяткового можуть мати і інші представлення. Двійкові значення розміром в слово і подвійне слово ще важче читати і використовувати.
Тепер ми готові до того, щоб розглянути способи, за допомогою яких в Турбо Асемблері можна визначати змінні. Давайте спочатку розглянемо визначення даних, що ініціалізували. Якраз спосіб ініціалізації і є методом вирішення проблем вводу для нашої лабораторної роботи.
Директиви визначення даних DS, DW, DD, DF, DP, DQ і DT дозволяють вам визначити змінні в пам'яті різного типу:
DВ 1 байт
DW 2 байта = 1 слово
DD 4 байта = 1 подвійне слово
DF, DP 6 байт = 1 вказівник дальнього типу (386)
DQ 8 байт = одно четвірне слово
DT 10 байт
Наприклад:
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
.DATA
ByteVar DB 'Z' ; 1 байт
WordVar DW 101b ; 2 байта (1 слово)
DwordVar DD 2BFh ; 4 байта (1 подвійне слово)
QWordVar DQ 307o ; 8 байт (1 четвірне слово)
TWordVar DT 100 ; 10 байт
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Далі глянемо ще фрагмети коду
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
mov ah,2 ; функція DOS виводу на дисплей
mov dl,[ByteVar] ; символ, який потрібно вивести на экран
int 21h
.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
add ax,[WordVar]
.
.
.
add WORD PTR [DwordVar],ax
adc WORD PTR [DwordVar+2],dx
.
.
.
Тут визначено, надано значення і використано п’ять змінних в пам’яті і далі у фрагментах коду показано, як деякі з них можна використати. Зокрема показано як на дисплей виводиться символ. Це досить просто. Набагато складніше ввести і вивести число. Власне вивести і вивести число від 0 до 9 можна, а всі інші так просто ні. Відтак доведеться використовувати допоміжні засоби. Таким засобом є модуль ІО.ASM. Цей модуль приведено в книзі В.Н.ПИЛЬЩИКОВА «Ассемблер».