Программирование игр для Windows. Советы профессионала


Операция


Результирующие данные

(данные экрана)

Результат

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




Начало  Назад  Вперед