Практикум_СП
.pdfпри діленні виникне переповнювання. Для реалізації ділення байтів у разі, коли частка перевищує розмір байта, слід перетворити ділене в подвійне слово, а дільник в слово і отримати коректний результат. Якщо ж при діленні слів частка виходить за рамки слова, то необхідно скористатися наступним алгоритмом:
|
Нехай y1 y0 - 32-розрядне ділене, а x - 16-розрядний дільник, тоді |
|
( y1 |
- 216 + y0 ) / x = ( y1 - 216)/ / x = q1 -216 із залишком r1 і потім |
|
(r1 |
-216 + y0 ) / x = q0 із залишком r0 . |
|
|
В результаті виходить 32-розрядна частка q1 q0 |
і залишок r0 (проміжний |
залишок r1 використовується при другому діленні). |
Слід зазначити, що цей |
алгоритм придатний для чисел в беззнаковому уявленні. Щоб застосувати його для чисел із знаком, необхідно запам'ятати знаки операндів, перетворити операнди в додатні еквіваленти, провести ділення, а потім відповідно до знаку операндів встановити знак результату (частки і залишку). Добуток двійкових чисел, що мають довжину два і більше слів, також здійснюється програмно.
Контрольні питання
1.Чому при однаковій довжині діапазон представлення двійкових чисел без знаку в 2 рази більше, ніж чисел із знаком?
2.Які команди є в системі команд МП x86 для обробки двійкових цілих чисел і десяткових чисел?
3.Чим відрізняється корекція десяткових чисел BCD-формату від десяткових чисел в ASCII-форматі?
4.Чому при складанні і відніманні двійкових чисел із знаком і двійкових чисел без знаку схема виконання операцій однакова, а сигналізація ситуації переповнювання здійснюється по-різному?
5.Чому для двійкових чисел із знаком і без знаку використовуються однакові команди складання і віднімання, але різні команди множення і ділення?
Індивідуальні завдання
1.Написати програму для обчислення приведених нижче виразів, де всі операнди є 16-розрядними двійковими числами із знаком. Початкові значення змінним задати самостійно, частку і залишок результату записати окремо:
2.Y = 12573 / (14 * А + (В – С + 356))
3.Y = (А * B - 7832) / (27 * С + 255)
4.Y = ((4 * А + В) - (2 * А - 456)) / С
5.Y = (A + 2 * B - 1653)^2 / (C + 12439)
21
6.Y = A^2 / (25 * B - С - 345)
7.Y = А / (В - 152 * С + 3768).
8.Написати програму обчислення добутку 1723893618 * 6, застосовуючи для обох співмножників і результату представлення десяткових чисел в ASCII-форматі.
9.Написати програму обчислення частки і залишку від ділення 5723893618 / 7, застосовуючи для діленого, дільника і результату представлення десяткових чисел в ASCII-форматі.
10.Написати програму перетворення десяткового числа 927459h в BCDформаті в ASCII-формат, вважаючи, що сама старша цифра числа відображає знак десяткового числа 0 = +, 9 = +. 10. Написати програму перетворення ASCII-ланцюжка -54279 у упакований ВСD-формат, використовуючи для представлення знаку десяткові цифри згідно попередньому завданню.
11.Написати програму обчислення суми 237459 + 649158, застосовуючи для доданків і результату ASCII-формат, потім результат перетворити в упакований BCD-формат.
12.Написати програму обчислення різниці 873451 - 548197, застосовуючи для операндів до результату ASCII-формат, потім результат перетворити в упакований BCD-формат.
13.Написати програму обчислення суми 653872 + 185643, застосовуючи для доданків і результату упакований BCD-формат, потім результат перетворити в ASCII-формат.
14.Написати програму обчислення різниці 879374 - 489617, застосовуючи для операндів і результату упакований BCD-формат, потім результат перетворити в ASCII-формат.
15.Написати програму перетворення ASCII-ланцюжка 31259 в двійкове ціле число, використовуючи схему множення попереднього результату на 10 і додавання до нього двійкового значення чергової цифри.
16.Написати програму перетворення двійкового числа 27456 в ASCIIланцюжок, використовуючи схему послідовного ділення на 10 і обліку залишків як цифр результату.
22
Практична робота № 4
Тема: Створення псевдографіки. Монохромні зображення.
Мета роботи: Навчитися створювати псевдографічні малюнки у текстовому режимі за допомогою виведення на екран повідомлень із заданими атрибутами тексту.
Теоретична частина
Для створення монохромних зображень можна використовувати два способи:
а) порядкове виведення; б) дворядкове виведення;
Порядкове виведення застосовується тоді, коли розмір виконуваного фалу та лістингу не мають значення, а дворядкове виведення дозволяє скоротити сегмент даних у двічі. До того ж дворядкове виведення займає менше часу написання лістингу ніж порядкове.
Отож давайте розглянемо ці дві технології кодування монохромних зображень.
На рисунку 4.1 показаний приклад програми, яка виводить на екран повідомлення порядково.
Рисунок 4.1 Відповідність рядка лістингу до зображення
Упершому випадку ми кодуємо зображення порядково, тобто для одного рядка малюнка ми застосовуємо один рядок даних. Замість пустих клітинок ми використовуємо пропуски, а для замальованих клітинок – з російського алфавіту “Ы” (його код 0219 у таблиці символів ASCII кодів).
Уметоді порядкового виведення псевдографіки застосовується лише два символи, яких повністю достатньо щоб вивести на екран малюнок. Для замальованої клітинки застосовується символ російського алфавіту “Ы”, який у операційній системі MS-DOS розпізнається як символ замальованої клітинки “_”, а клітинки, які залишилися не замальовані, кодуються клавішею, яка називається “Space”, або ж пробіл.
23
Другий метод – це метод дворядкового виведення, він також дуже простий, у ньому як і у першому застосовується літера російського алфавіту “Ы”, але додаються ще деякі символи: це літери “Я” та “Ь”.
Для кодування малюнку одразу кодуються два рядка. У попередньому випадку літера “Ы” символьно відображала одну клітинку малюнка. Але зараз літера “Ы” відображає дві клітинки. Літери “Я” та “Ь” теж відображають дві клітинки. У цьому випадку (рисунок 4.2), одразу обирається два рядки малюнка. Якщо зустрічаються рядки, у яких замальована нижня клітинка (код літери розраховується по горизонталі), то ставиться літера “Ь”, якщо верхня – то “Я”, а якщо замальовані обидві клітинки – “Ы”.
Рисунок 4.2 Дворядкове кодування
Зараз вам буде представлений лістинг програми, який написаний порядковим методом для ведення на екран псевдографічного зображення.
|
model |
small |
;модель |
пам’яті |
що |
використовує |
;програма ехе |
;розмір стеку |
|
|
|
||
stack |
256 |
|
|
|
||
dataseg |
|
;початок сегменту даних |
|
|
||
Line1 |
|
db"••••••••ЫЫЫЫЫ",0dh,0ah,'$' |
|
|
||
Line2 |
|
db"•••••••ЫЫЫЫЫЫЫ",0dh,0ah,'$' |
|
|
||
Line3 |
|
db"••••••ЫЫЫЫЫЫЫЫЫ",0dh,0ah,'$' |
|
|||
Line4 |
|
db"•••••ЫЫЫЫЫЫЫ••ЫЫ",0dh,0ah,'$' |
|
|||
Line5 |
|
db"••••ЫЫЫЫЫЫЫЫ•••ЫЫ",0dh,0ah,'$' |
|
|||
Line6 |
|
db"•••ЫЫЫЫЫЫЫЫЫЫ•••ЫЫ",0dh,0ah,'$' |
|
|||
Line7 |
|
db"••ЫЫЫЫЫЫЫЫЫЫЫЫ•••ЫЫ",0dh,0ah,'$' |
|
|||
Line8 |
|
db"•ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ",0dh,0ah,'$' |
||||
Line9 |
|
db"•Ы•••••••ЫЫЫ",0dh,0ah,'$' |
|
|
||
Line10 |
|
db"•Ы••••••",'$' |
|
|
|
|
Line11 |
|
db"ЫЫЫЫЫ",0dh,0ah,'$' |
|
|
||
Line12 |
|
db"ЫЫЫ••••",'$' |
|
|
|
|
Line13 |
|
db"ЫЫЫЫЫЫЫ",0dh,0ah,'$' |
|
|
||
Line14 |
|
db"•Ы••••",'$' |
|
|
|
|
Line15 |
|
db"ЫЫЫЫЫЫЫЫЫ",0dh,0ah,'$' |
|
|
||
Line16 |
|
db"•••••ЫЫЫЫЫЫЫЫЫЫЫ",0dh,0ah,'$' |
|
|||
Line17 |
|
db"•••••Ы•ЫЫЫ•ЫЫЫ•Ы",0dh,0ah,'$' |
|
|||
Line18 |
|
db"•••••ЫЫЫ•ЫЫЫ•ЫЫЫ",0dh,0ah,'$' |
|
24
Line19 |
db"•••••ЫЫЫЫЫЫЫЫЫЫЫ",0dh,0ah,'$' |
|
|
|
|||
Line20 |
db"••••••ЫЫЫЫЫЫЫЫЫ",0dh,0ah,'$' |
|
|
|
|||
Line21 |
db"•••••••ЫЫЫЫЫЫЫ",0dh,0ah,'$' |
|
|
|
|||
Line22 |
db"••••••••ЫЫЫЫЫ",0dh,0ah,'$' |
|
|
|
|
||
Line23 |
db"•••••••••ЫЫЫ",0dh,0ah,'$' |
|
|
|
|
||
Line24 |
db"••••••••••Ы",0dh,0ah,'$' |
|
|
|
|
||
Line25 |
db"••••••••••Ы",0dh,0ah,'$' |
|
|
|
|
||
Line26 |
db"••••••••••Ы",0dh,0ah,'$' |
|
|
|
|
||
Line27 |
db"•••••••ЫЫЫЫЫЫЫ",0dh,0ah,'$' |
|
|
|
|||
codeseg |
;початок сегменту коду |
|
|
|
|
||
start: |
ax,@data |
;призначення |
регістру |
АХ |
як |
||
mov |
|||||||
;регістру даних |
ds,ax |
;переміщення даних з АХ у DS |
|
||||
mov |
|
||||||
mov |
ah,9 |
;номер функції |
DOS |
– |
виведення |
||
;повідомлення на екран |
|
;переміщення |
даних |
з |
|||
mov |
dx,offset Line1 |
||||||
;сегменту даних у регістр DX |
;виклик переривання DOS |
|
|
||||
int |
21h |
|
|
||||
mov |
ah,9 |
|
|
|
|
|
|
mov |
dx,offset Line2 |
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
mov |
dx,offset Line3 |
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
mov |
dx,offset Line4 |
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
mov |
dx,offset Line5 |
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
mov |
dx,offset Line6 |
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
mov |
dx,offset Line7 |
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
mov |
dx,offset Line8 |
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
mov |
dx,offset Line9 |
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
mov |
dx,offset Line10 |
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
mov |
dx,offset Line11 |
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
mov |
ah,9 |
|
|
|
|
|
|
mov |
dx,offset Line12 |
|
|
|
|
|
|
int |
21h |
|
|
|
|
|
|
25
mov |
ah,9 |
|
mov |
dx,offset Line13 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line14 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line15 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line16 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line17 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line18 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line19 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line20 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line21 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line22 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line23 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line24 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line25 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line26 |
|
int |
21h |
|
mov |
ah,9 |
|
mov |
dx,offset Line27 |
|
int |
21h |
;вихід з програми |
mov |
ah,4ch |
|
int |
21h |
;завершення програми |
end start |
|
1. Після того як весь текст програми набраний, потрібно зберегти його з розширенням *.asm, наприклад picture.asm, після цього перемістіть його в директорію c:\tasm\bin. Потім за допомогою команди tasm picture.asm
26
скомпілюйте початковий модуль у об’єктний файл. Скомпонувати об’єктний Таблиця 4.1 Варіанти монохромних зображень.
|
|
|
|
1 |
2 |
3 |
4 |
|
|
|
|
5 |
6 |
7 |
8 |
|
|
|
|
9 |
10 |
11 |
12 |
|
|
|
|
13 |
14 |
15 |
16 |
файл у виконуваний можна за допомогою команди tlink /x picture.obj. Запустіть файл для перевірки, для цього введіть: picture.exe і натисніть клавішу Enter. Після цього на екрані монітора з’явиться малюнок.
Приклад виконання індивідуального завдання наведено у Додатку 4.1.
27
Контрольні питання:
1.Які методи кодування малюнків у сегменті даних ви знаєте?
2.Який метод і коли краще застосовувати у програмі з псевдографікою?
3.Під яким кодом знаходиться літера “Ы” у таблиці ASCII символів?
4.Яку функцію виконує символ 0dh у сегменті даних?
5.Яку функцію виконує символ 0ah у сегменті даних?
Індивідуальні завдання:
2. За допомогою текстового редактору створіть початковий модуль програми, що виводитиме монохромне зображення, відповідно вашому індивідуальному варіанту (Таблиця 4.1). Використовуйте обидва методи кодування малюнків. Виконайте асемблювання програми.
Порівняйте об’єм пам’яті, що займає кожен з виконуваних файлів. Проаналізуйте від чого залежить цей об’єм.
Додаток 4.1 Приклад виконання індивідуального завдання:
Створення подібних програм умовно можна розділити на дві частини. В першому етапі прописуємо сегмент data листингу, у якому безпосередньо міститься саме зображення (Рис. 4.4), з урахуванням необхідної кількості пробілів і символів. На другому етапі прописуємо сегмент code, у
якому задіємо засоби DOS і BIOS виведення псевдографіки на екран.
Рисунок 4.4 Приклад створення зображення рядків.
Перший етап:
model small stack 256 dataseg
…………………
H19 |
DB" |
ЫЫЫ |
ЫЫ",0DH,0AH,'$' |
H20 |
DB"ЫЫ |
ЫЫ |
ЫЫ ЫЫ",0DH,0AH,'$' |
………………… |
|
|
Другий етап:
CODESEG
START:
MOV AX,@DATA MOV DS,AX
…………………
28
MOV AH,9 |
; виводимо рядок Н19 |
MOV DX,OFFSET H19 |
|
INT 21H |
; виводимо рядок Н20 |
MOV DX,OFFSET H20 |
|
INT 21H |
|
………………… |
|
MOV AH,4CH |
|
INT 21H |
|
END START |
|
Завдання: Створити початковий модуль програми виведення на екран монохромного зображення, яке наведено на рисунку 4.3.
Рисунок 4.3 Варіант монохромного зображення.
Програма виведення монохромного зображення порядковим методом. Крапками вказується кількість пробілів.
model small stack 256 dataseg
H1 DB"••Ы",0DH,0AH,'$'
H2 DB"••ЫЫЫЫ",0DH,0AH,'$'
H3 DB"•ЫЫЫЫЫЫЫ",0DH,0AH,'$'
H4 DB"•ЫЫЫЫЫЫЫЫ",0DH,0AH,'$'
H5 DB"•Ы•ЫЫЫЫЫЫ",0DH,0AH,'$'
H6 DB"•ЫЫЫ•ЫЫЫЫЫ",0DH,0AH,'$'
H7 DB"•ЫЫЫ•ЫЫЫЫЫ",0DH,0AH,'$'
H8 DB"•ЫЫЫ•ЫЫЫЫЫЫЫЫЫЫЫЫЫ",0DH,0AH,'$'
H9 DB"•••••ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ",0DH,0AH,'$'
H10 DB"•••••ЫЫЫЫЫЫЫЫЫЫЫЫЫЫ•ЫЫЫ",0DH,0AH,'$'
H11 DB"•••••ЫЫЫЫЫЫЫЫЫЫЫЫЫЫ••ЫЫЫ",0DH,0AH,'$'
H12 DB"•••••ЫЫЫЫЫЫЫЫЫЫЫЫЫЫ•••ЫЫ",0DH,0AH,'$'
H13 DB"••••••ЫЫЫЫЫЫЫЫЫЫЫЫЫ•••ЫЫ",0DH,0AH,'$'
H14 DB"••••••ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ•ЫЫ",0DH,0AH,'$'
H15 DB"••••••ЫЫЫЫ•••••ЫЫЫЫЫЫ•ЫЫ",0DH,0AH,'$'
H16 DB"••••••ЫЫЫ••••••••ЫЫЫЫ",0DH,0AH,'$'
H17 DB"•••••ЫЫЫ•••••••••••ЫЫЫ",0DH,0AH,'$'
H18 DB"•••••ЫЫ••••••••••••ЫЫЫ",0DH,0AH,'$'
H19 DB"••••ЫЫЫ•••••••••••••ЫЫ",0DH,0AH,'$'
H20 DB"ЫЫ••ЫЫ••••••••••••••ЫЫ•ЫЫ",0DH,0AH,'$'
H21 DB"ЫЫЫЫЫЫ••••••••••••••ЫЫЫЫЫ",0DH,0AH,'$'
H22 DB"ЫЫЫЫЫ•••••••••••••••ЫЫЫЫЫ",0DH,0AH,'$'
H23 DB"••ЫЫЫЫЫЫЫ•••••••ЫЫЫЫЫЫЫ",0DH,0AH,'$'
H24 DB"••••ЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫЫ",0DH,0AH,'$'
H25 DB"••••••••ЫЫЫЫЫЫЫЫЫ",0DH,0AH,'$'
29
CODESEG
START:
MOV AX,@DATA
MOV DS,AX
MOV AH,9
MOV DX,OFFSET H1 INT 21H
MOV DX,OFFSET H2 INT 21H
MOV DX,OFFSET H3 INT 21H
MOV DX,OFFSET H4 INT 21H
MOV DX,OFFSET H5 INT 21H
MOV DX,OFFSET H6 INT 21H
MOV DX,OFFSET H7 INT 21H
MOV DX,OFFSET H8 INT 21H
MOV DX,OFFSET H9 INT 21H
MOV DX,OFFSET H10 INT 21H
MOV DX,OFFSET H11 INT 21H
MOV DX,OFFSET H12 INT 21H
MOV DX,OFFSET H13 INT 21H
MOV DX,OFFSET H14 INT 21H
MOV DX,OFFSET H15 INT 21H
MOV DX,OFFSET H16 INT 21H
MOV DX,OFFSET H17 INT 21H
MOV DX,OFFSET H18 INT 21H
MOV DX,OFFSET H19 INT 21H
MOV DX,OFFSET H20 INT 21H
MOV DX,OFFSET H21 INT 21H
MOV DX,OFFSET H22 INT 21H
MOV DX,OFFSET H23 INT 21H
MOV DX,OFFSET H24 INT 21H
MOV DX,OFFSET H25 INT 21H
MOV AH,4CH
INT 21H
END START
30