Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практикум_СП

.pdf
Скачиваний:
39
Добавлен:
15.02.2015
Размер:
1.01 Mб
Скачать

при діленні виникне переповнювання. Для реалізації ділення байтів у разі, коли частка перевищує розмір байта, слід перетворити ділене в подвійне слово, а дільник в слово і отримати коректний результат. Якщо ж при діленні слів частка виходить за рамки слова, то необхідно скористатися наступним алгоритмом:

 

Нехай 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