
- •Битовые операции Булевские команды
- •Команды сдвигов
- •Средства Ассемблера для битовых операций
- •Int 21h
- •Задание a5 Пример программы, включающей битовые операции Формулировка задания
- •Тексты программ
- •If not (ta eq TypeByte or ta eq TypeWord)
- •If pattern gt 111b
- •Выполнение задания на машине.
- •Inspecting treat_array
- •6356:0000 D5 75
- •6356:0002 80D5 00f5
If not (ta eq TypeByte or ta eq TypeWord)
%OUT На входе должен быть массив слов или байтов!
%OUT Массив array этому условию не удовлетворяет!
%OUT
EXITM
ENDIF
If pattern gt 111b
%OUT В образце pattern могут быть установлены
%OUT только три младших бита.
%OUT
EXITM
ENDIF
mov si, OFFSET array ;; В SI — адрес массива
mov cx, len_of_array ;; В CX — количество элементов
mov dx, TA ;; В DX — тип элементов
mov bp, pattern ;; В BP — образец
call treat_array
jc error_label
ENDM
Директива EXITMиспользуется для досрочного выхода из макроса.
Встроенная функция (времени ассемблирования) TYPEвозвращает числовой код, соответствующий типу данных: 1 — для байтов, 2 — для слов, 4 — для двойных слов, остальные значения опустим.
Для комментариев используется повтор точки с запятой. Это делается для того, чтобы комментарии макроса не попадали в листинг и не увеличивали его длину.
Наконец, создадим файл с главной программой. Сначала сконструируем данные, на которых будем проверять правильность работы программы.
Нужно образовать массивы, элементы которых таковы, что они либо удовлетворяют, либо не удовлетворяют условию задачи, чтобы проверить правильность работы программы во всех возможных ситуациях.
Будем использовать образец, задаваемый как параметр в макросе, 101b. В нашем примере достаточно сконструировать массив всего из двух элементов: для одного элемента условие выполняется, а для другого — нет.
Первый элемент (рис.6.2):
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
= |
|
|
|
установить |
Рис.6.2.
Второй элемент (рис.6.3):
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
сбросить |
Рис.6.3.
Итак, первый элемент 11010101
11010101, т.е. D5h
D5h, а второй элемент 11110101
01110101, т.е. F5h
75h. Аналогичный тест предложим для слов:
00D5h
80D5h, 00F5h
00F5h.
main5v0.asm
COMMENT &
0. Иванов И.И. Дан массив байтов (слов) указанного размера.
Над каждым элементом массива выполнить операцию: если битовое
поле 6:4 совпадает с битовым полем 2:0 и с заданным образцом,
то установить старший бит элемента, иначе — сбросить его.
&
JUMPS ; Оптимизация переходов
.286 ; Разрешены инструкции 286-го процессора
INCLUDE macro.inc ; Включить общий файл макросов
INCLUDE macr5v0.inc ; Включить специальный файл макросов
;
EXTRN treat_array:PROC
.MODEL small
.STACK 100h
.DATA
arrb DB 0D5h,0F5h
Len_of_arrb = $ - arrb
arrw DW 00D5h,00F5h
Len_of_arrw = ($ - arrw) SHR 1
arrd DD 0FFFFFFFFh
Len_of_arrd = ($ - arrd) SHR 2
msg_err DB "Массив пуст!",CRLFT
.CODE
start:
mov ax,@data
mov ds,ax
treat arrb, Len_of_arrb, 101B, error
treat arrw, Len_of_arrw, 101B, error
treat arrw, Len_of_arrw, 1101B, error
treat arrd, Len_of_arrd, 10B, error
exit
error: message msg_err
exit 1
END start
Содержимое файла macro.inc описано в 5.2.3.