Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

Xltbl db 47 dup(40h) ;Пробелы в коде ebcdic

DB 0F0H,0F1H,0F2H,0F3H,...,0F9H ;0-9 (EBCDIC)

DB 199 DUP(40H) ;Пробелы в коде EBCDIC

Команда XLAT предполагает адрес таблицы в регистре BX, а транслируемый

байт (например, поля ASCNO) в регистре AL. Следующие команды выполняют

подготовку и трансляцию байта:

LEA BX,XLTBL

MOV AL,ASCNO

XLAT

Команда XLAT использует значение в регистре AL в качестве относительного

aдреса в таблице, т.е. складывает адрес в BX и смещение в AL. Если,

например, ASCNO содержит 00, то адрес байта в таблице будет XLTBL+00 и

команда XLAT заменит 00 на шест.40 из таблицы. Если поле ASCNO cодержит

шест.32, то адрес соответствующего байта в таблице будет XLTBL+50. Этот

байт содержит шест.F2 (2 в коде EBCDIC), который команда XLAT загружает в

регистр AL.

В программе на рис.14.4 добавлено преобразование десятичной точки

(2E) и знака минус (2D) из кода ASCII в код EBCDIC (4B и 60

соответственно). В программе организован цикл для обработки шестибайтового

поля. Поле ASCNO в начале выполнения программы содержит значение 31.5 с

последующим пробелом, или шест.2D33312E3520. В конце выполнения программы

в поле EBCNO должно быть шест.60F3F14BF540.

__________________________________________________________________________

page 60,132

TITLE XLATE (COM) Перевод кода ASCII в код EBCDIC

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,ES:CODESG

ORG 100H

BEGIN: JMP MAIN

; ----------------------------------------------------

ASCNO DB '-31.5'

EBCNO DB 6 DUP(' ')

Xltab db 45 dup(40h)

DB 60H, 2DH

DB 5CH

DB 0F0H,0F1H,0F2H,0F3H,0F4H

DB 0F5H,0F6H,0F7H,0F8H,0F9H

DB 199 DUP(40H)

; ----------------------------------------------------

MAIN PROC NEAR ;Основная процедура

LEA SI,ASCNO ;Адрес символов ASCNO

LEA DI,EBCNO ;Адрес поля EBCNO

MOV CX,06 ;Длина

LEA BX,XLTAB ;Адрес таблицы

A20:

MOV AL,[SI] ;Получить ASCII символ

Xlat ;Перекодировка

MOV [DI],AL ;Записать в поле EBCNO

INC DI

INC SI

LOOP A20 ;Повторить 6 раз

RET

MAIN ENDP

CODESG ENDS

END BEGIN

__________________________________________________________________________

Рис.14.4. Преобразование ASCII в EBCDIC.

ПРОГРАММА: ОТОБРАЖЕНИЕ ШЕСТ. И ASCII-КОДОВ

________________________________________________________________

__________________________________________________________________________

page 60,132

TITLE ASCHEX (COM) Преобразование ASCII в шест.

CODESG SEGMENT PARA 'Code'

ASSUME CS:CODESG,DS:CODESG,ES:CODESG

ORG 100H

BEGIN: JMP MAIN

; -----------------------------------------------

DISPROW DB 16 DUP(' '), 13

HEXSTR DB 00

XLATAB DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H

DB 41H,42H,43H,44H,45H,46H

; -----------------------------------------------

MAIN PROC NEAR ;Основная процедура

CALL Q10CLR ;Очистить экран

LEA SI,DISPROW

A20LOOP:

CALL C10HEX ;Перекодировать

CALL D10DISP ; и вывести на экран

CMP HEXCTR,0FFH ;Последнее значение (FF)?

JE A50 ; да - завершить

INC HEXCTR ; нет - перейти к следующему

JMP A20LOOP

A50: RET

MAIN ENDP

C10HEX PROC NEAR ;Перекодировка в шест.

MOV AH,00

MOV AL,HEXCTR ;Получить шест.пару

SHR AX,CL ;Сдвиг правой шест.цифры

LEA BX,XLATAB ;Установить адрес таблицы

MOV CL,04 ;Установить величину сдвига

XLAT ;Перекодировка в шест.

MOV [SI],AL ;Записать левый символ

MOV AL,HEXCTR

SHL AX,CL ;Сдвиг левой цифры

XLAT

MOV [SI]+1,AL ;Перекодировка в шест.

RET ;Записать правый символ

C10HEX ENDP

D10DISP PROC NEAR ;Вывод на экран

MOV AL,HEXCTR

MOV [SI]+3,AL

CMP AL,1AH ;Символ EOF?

JE D20 ; да - обойти

CMP AL,07H ;Меньше/равно 08?

JB D30 ; да - OK

CMP AL,10H ;Больше/равно 0F?

JAE D30 ; да - OK

D20:

MOV BYTE PTR [SI]+3,20H

D30:

ADD SI,05 ;Следующий элемент в строке

LEA DI,DISPROW+80

CMP DI,SI

JNE D40

MOV AH,40H ;Функция вывода на экран

MOV BX,01 ;Номер устройства

MOV CX,81 ;Вся строка

LEA DX,DISPROW

INT 21H

LEA SI,DISPROW ;Начальный адрес строки

D40: RET

D10DISP ENDP

Q10CLR PROC NEAR ;Очистка экрана

MOV AX,0600H

MOV BH,03 ;Цвет (07 для ч/б)

MOV CX,0000

MOV DX,184FH

INT 10H

RET

Q10CLR ENDP

CODESG ENDS

END BEGIN

__________________________________________________________________________

Рис.14.5. Отображение шест. и ASCII-кодов

Программа, приведенная на рис.14.5, отображает на экране почти все

ASCII-символы, а также их шест. значения. Например, ASCII-символ для

шест.53 - это буква S, эти данные программа выводит в виде 53 S. Полное

изображение на экране выглядит в виде матрицы 16х16:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . .

F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF

Как было показано еще на рис.8.1, отображение ASCII-символов, oсобых

проблем не вызывает. Что же касается отображения шест. значений в символах

ASCII, то этот процесс более сложный. Например, для вывода на экран в коде

ASCII шест.00, 01 и т.д. необходимо преобразовать шест.00 в шест.3030,

шест.01 в шест.3031 и т.д.

В программе начальное значение поля HEXCTR равно 00. Это значение

последовательно увеличивается на 1. Процедура C10HEX расщепляет байт

HEXCTR на две щест. цифры. Предположим, что байт HEXCTR содержит шест.4F.

Процедура сначала выделяет шест. цифру 4 и использует это значение для

перекодировки по таблице XLATAB. В регистре AL устанавливается в

результате значение шест.34. Затем процедура выделяет вторую шест. цифру F

и перекодирует ее в шест.46. В результате oбработки получается шест.3446,

что отображается на экране как 4F.

Так как функция DOS для вывода на экран (шест.40) рассматривает

шест.1A как конец файла, то в программе это значение заменяется на пробел.

Программа, использующая для вывода на экран функцию DOS (шест.09), должна

заменять символ ограничитель '$' на пробел.

Существует много различных способов преобразования шест. цифр в

ASCII-символы. Можно поэкспериментировать с операциями сдвига и сравнения.

ПРОГРАММА: СОРТИРОВКА ЭЛЕМЕНТОВ ТАБЛИЦЫ

________________________________________________________________

Часто возникает необходимость сортировки элементов таблицы в

восходящем или нисходящем порядке. Например, пользователю может

потребоваться список наименований товара в алфавитном порядке или список

общих цен в нисходящей последовательности. Обычно, табличные данные не

определяются как в предыдущей программе, а загружаются с клавиатуры или с

диска. Данный раздел посвящен сортировке элементов таблицы, что касается

различных применений, включающих сортировку записей на дисках, то здесь

возможны более сложные программы.

Существует несколько алгоритмов сортировки таблиц от неэффективных,

но понятных, до эффективных и непонятных. Программа сортировки,

предлагаемая в данном разделе, весьма эффективна и может применяться для

большинства табличных сортировок. Конечно, если не проверить различные

алгоритмы сортировок, то даже самая неэффективная программа может

показаться работающей со скоростью света. Но цель данной книги - показать

технику ассемблера, а не сортировки. Основной подход заключается в

сравнении соседних элементов таблицы. Если первый элемент больше второго,

то элементы меняются местами. Таким образом выполняется сравнение

элементов 1 со 2, 2 с 3 и т.д. до конца таблицы с перестановкой элементов

там, где это необходимо. Если в проходе были сделаны перестановки, то весь

процесс повторяется с начала таблицы т.е. сравниваются снова элементы 1-2,

2-3 и т.д. Если в проходе не было перестановок, то таблица отсортирована и

можно прекратить процесс.

Ниже приведен алгоритм, в котором переменная SWAP является

индикатором: была перестановка элементов (YES) или нет (NO):

G10: Определить адрес последнего элемента

G20: Установить SWAP=NO

Определить адрес первого элемента

G30: Элемент > следующего элемента?

Да: Представить элементы

Установить SWAP=YES

Перейти к следующему элементу

Конец таблицы?

Нет: Перейти на G30

Да: SWAP=YES?

Да: Перейти на G20 (повторить сорт.)

Нет: Конец сортировки

Программа, показанная на рис.14.6, обеспечивает ввод с клавиатуры до