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

3. Перетворення в регістрах

Призначення: розширення операнда зі знаком.

Схема команди: CBW ; байта в слово

CWDE ; слово в подвійне слово, для і386 і вище

CWD ; слово в подвійне слово

CDQ ; подвійне слово в чотири слова, для і386 і вище

Алгоритм роботи:

CBW — при роботі команда використовує тільки регістри AL і AX:

  • аналіз знакового біта регістра AL:

якщо знаковий біт AL=0, то AH=00h;

якщо знаковий біт AL=1, то AH=0ffh.

CWDE — при роботі команда використовує тільки регістри AX і EAX:

  • аналіз знакового біта регістра AX:

якщо знаковий біт AX=0, то установити старше слово EAX=0000h;

якщо знаковий біт AX=1, то установити старше слово EAX=0ffffh.

CWD — при роботі команда використовує тільки регістри AX і DX:

  • аналіз знакового біта регістра AX:

якщо знаковий біт AX=0, то DX=0000h;

якщо знаковий біт AX=1, то DX=0ffffh.

CDQ — при роботі команда використовує тільки регістри EAX і EDX:

  • аналіз знакового біта регістра EAX:

якщо знаковий біт EAX=0, то EDX=00000000h;

якщо знаковий біт EAX=1, то EDX=0ffffffffh.

Стан ознак після виконання команди: виконання команди не впливає на ознаки.

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

  1. Алгоритм введення–виведення цілих чисел

В системі переривання DOS 21h та BIOS 10h не передбачені функції введення–виведення цілих чисел, функції переривань дозволяють працювати тільки з символами та рядками. Для роботи з цілими при програмування мовою асемблера користувачеві необхідно створити власні процедури введення – виведення. Типові алгоритми та реалізації таких розглянемо у цьому параграфі.

    1. Виведення цілих чисел.

Виведення цілих чисел складається з етапів:

  • перетворення внутрішнього представлення числа у рядок символів(код ASCII);

  • виведення отриманого рядка.

На першому етапі здійснюється перетворення внутрішнього представлення числа у рядок, який складається із символьного представлення цифр цього числа. Причому перетворення можемо здійснювати у будь–яку систему числення. Для прикладу розглянемо алгоритм перетворення цілого (16-розрядного, машинне слово) числа зі знаком з діапазону –32768 до 32767.

Для перетворення у сегменті даних необхідно зарезервувати буфер із 7 байтів, та комірку розміром в 1 байт для збереження інформації про знак.

Алгоритм

  1. Розмістити вихідне ціле число регістр АХ.

  2. Очистити буфер(наприклад заповнити пробілами), у сьому позицію записати символ долар(‘$’). Встановлюємо активною шосту позицію буфера.

  3. Перевірити знак числа. Якщо число від’ємне відмічаємо у комірці знаку та перетворюємо його у додатне число.

  4. Виконуємо без знакове цілочислове на 10.

  5. Остачу від ділення перетворюємо у символ ( до остачі додаємо код символу ‘0’).

  6. Заносимо символьне представлення остачі у активну позицію буфера. Активною позицією робимо позицію буфера з індексом на одиницю менше.

  7. Перевіряємо частку. Якщо вона не рівна нулю повертаємося на пункт 4.

  8. Якщо число було від’ємне, то у буфер заносимо символ мінус ('-').

  9. Кінець.

На другому етапі виводимо вміст буфера за допомогою переривання DOS 21h або BIOS 10h.

Реалізація алгоритму.

Data segment

;

signed db 1 ; 1 – signed, 0 unsigned

decimal dw -4567

outdecimal db 6 dup(' '),'$'

;

Data ends

Code segment

ASSUME CS : Code, DS : Data

;

outinteger proc

push SI

push DX

push CX

push BX

mov AX,decimal ; 1)

mov DL,’ ‘ ; 2)

mov SI,0 ; …

mov CX,6

cls_buf: mov outdecimal[SI],DL

inc SI

loop cls_buf ; 2)

mov SI,5 ; 2)

mov BX,0ah ;

mov DL,0 ;

test AX,8000h ;3)

je ns ;

mov DL,1 ;

neg AX ;

ns: mov signed, DL ;3)

n1: cwd ; AX -> (DX,AX)

div BX ;4) -> AX=div DX=mod

add DL,'0' ;5)

mov outdecimal[SI],DL ; 6)

dec SI ;6)

cmp AX,0 ; 7)

jnz n1 ;7)

mov DL,signed ;8)

cmp DL,1h ;8)

jne n2

mov outdecimal[SI],'-' ;8)

n2: mov AH,9 ;

lea DX,outdecimal

int 21h

pop BX

pop CX

pop DX

pop SI

ret

outinteger endp

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