Оптимизация деления

  • Автор темы karloson
  • Дата начала
Статус
Закрыто для дальнейших ответов.
K

karloson

Гость
#1
Да, конечно для большинства это замученная тема, и не представляет интереса, но ведь форум для того и создан, чтобы люди могли что то спросить, а знающие могли помочь....
Ну вообщем сама задача: Нужно реализовать макрос деления на константу, и проверить - является ли константа степенью двойки, если является, то деление осуществить сдвигом (shr),если нет - DIV.
Здесь я описал - как я делил просто на двойку, но и тут не лады :) : когда я делю DIV (см МЕТКА 1) , затем вывожу число на экран, а затем смотрю флаг CF , чтобы посмотреть остаток - то всё ништяк, а когда я делаю сдвиг (МЕТКА 2), то остаток не выводится(т.е. всегда переходит на NOFLOAT:). [Основной ворос про МАКРОС]
DATASEG
....
Buffer DB 10 Dup(0)
....
CODESEG
.....
Proc SetPosition
push dx
push ax
push cx
mov dl,bl
mov dh,bh
mov bh,0
mov ah,02h
int 10h
mov bh,dh
pop cx
pop ax
pop dx
ret
ENDP SetPosition

Proc ByteToScreen ; dl- input byte
push cx
push ax
Call SetPosition

Call ByteToCh
mov dx, offset Buffer
mov ah,09h
int 21h
pop ax
pop cx
ret
EndP ByteToScreen

start:
.......
add ax,bx
; mov bl,2
; div bl ; МЕТКА 1
shr ax,1; МЕТКА 2

push ax
push bx

mov bl,56 ;\
mov bh,9 ; \
mov dl,al ; /Вывожу число на экран
Call ByteToScreen;/

cmp ah,1
jne nofloat; ah<>1 jne cf=0
mov [Buffer+0],'.'
mov [Buffer+1],'5'
mov [Buffer+2],'$'
mov dx, offset Buffer
mov ah,09h
int 21h

nofloat:
......
end start
 
?

????

Гость
#2
Ну вообщем сама задача: Нужно реализовать макрос деления на константу, и проверить - является ли константа степенью двойки, если является, то деление осуществить сдвигом (shr),если нет - DIV.
Вот:
Код:
MULTIPLY MACRO FACTOR
;
; Проверить, является ли FACTOR степенью 2
;
IS_POWER_OF_TWO = 0
COUNT      = 15
POWER_OF_TWO   = 8000h
   REPT   16
IF POWER_OF_TWO EQ FACTOR
IS_POWER_OF_TWO = 1   ; множитель представляет собой степень числа 2
   EXITM
ENDIF
COUNT      = COUNT - 1
POWER_OF_TWO   = POWER_OF_TWO SHR 1
   ENDM

IF IS_POWER_OF_TWO
   sub  dx,dx
   REPT COUNT
   shl  ax,1
   rcl  dx,1
   ENDM
ELSE
   mov  dx,FACTOR
   mul  dx
ENDIF
ENDM
MULTIPLY в ходе работы проверяет, выполняется ли умножение на сте-
пень 2, и ассемблирует соответствующий код. Поэтому код:

MULTIPLY 10

ассемблируется в:

.
.
mov dx,10
mul dx
.
.

а код:

MULTIPLY 8

ассемблируется в следующий вид:

.
.
sub dx,dx
shl ax,1
rcl dx,1
shl ax,1
rcl dx,1
shl ax,1
rcl dx,1
.
.
 
K

Karloson

Гость
#3
БОльшое спасибо, я вот тут написал сам кое что, до того как прочёл ваше предложение, но боюсь это не оптимально :P

MACRO SHRorDiV x,Delit ; x/y
mov ax,x
IF Delit EQ 2
shr ax,1
ELSE
IF Delit EQ 4
shr ax,2
ELSE
IF Delit EQ 8
shr ax,3
ELSE
IF Delit EQ 16
shr ax,4
ELSE
IF Delit EQ 32
shr ax,5
ELSE
IF Delit EQ 64
shr ax,6
ELSE
IF Delit EQ 128
shr ax,7
ELSE
IF Delit EQ 256
shr ax,8
ELSE
IF Delit EQ 512
shr ax,9
ELSE
IF Delit EQ 1024
shr ax,10
ELSE
IF Delit EQ 2048
shr ax,11
ELSE
IF Delit EQ 4096
shr ax,12
ELSE
IF Delit EQ 8192
shr ax,13
ELSE
IF Delit EQ 16384
shr ax,14
ELSE
IF Delit EQ 32768
shr ax,15
ELSE
mov bx,Delit
xor dx,dx
div bx
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF

ENDM SHRorDiV
 
D

deeka

Гость
#4
Ага... На этапе компиляции принять решение о делимости числа на 2...
Хитро, но не актуально.
 
Статус
Закрыто для дальнейших ответов.