Операция
Результирующие данные
(данные экрана)
Результат
00111000
OR
00001010
00111010=58
00111000
AND
00001010
00001000=8
00111000
XOR
00001010
00110010 =50
Нетрудно заметить, что в результате любой из логических операций изменяется индекс цвета. Иногда это может совпадать с нашим желанием, но в данном случае это не то, что мы хотели получить, замещая «непрозрачные» (ненулевые) пиксели экрана новым значением.
Однако нам никто не запрещает совершить более одной логической операции с исходными и результирующими данными для достижения желаемого результата. Мы можем делать все, что захотим, но главное при этом — не потерять тот выигрыш в быстродействии, который мы получаем при использовании логических операций. Ведь оператор IF осуществляет только два действия: сравнение и переход в нужное место. Так не окажется ли применение оператора IF более целесообразным, нежели многократное повторение логических операций? Чтобы выяснить это, давайте сравним коды, реализующие оба способа (Листинги 7.1 и 7.2), и посмотрим, как обстоят дела на самом деле.
Листинг 7.1. Дизассемблирование оператора IF.
; File if.с ; # include <stdio.h>
;
; char far *source, *dest; //области
исходных
//и результирующих данных
; main()
;{
; Line 8
_main:
*** 000000 c8 00 00 00 enter OFFSET L00181,OFFSET 0
*** 000004 56 push si
*** 000005 57 push di ; index = fffc ; data = fffa
;
;int index;
; Line 10
; unsigned data;
; Line 11
; // оператор if
; if (data=source[index]) ; Line 15
*** 000006 8b 46 fc mov ax, WORD PTR -4[bp]
*** 000009 8b 1e 00 00 mov bx,WORD PTR source
*** OOOOOd 8b 0e 02 00 mov ex,WORD PTR source+2
*** 000011 03 d8 add bx,ax
*** 000013 8e cl mov es,cx
*** 000015 26 8a 07 mov al,BYTE PTR es:[bx]
*** 000018 98 cbw
*** 000019 89 46 fa mov WORD PTR -6[bp] ,ax
*** 0000lC 3d 00 00 cmp ax,OFFSET 0