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

Тема в разделе "Другие", создана пользователем karloson, 17 дек 2003.

Статус темы:
Закрыта.
  1. karloson

    karloson Гость

    Да, конечно для большинства это замученная тема, и не представляет интереса, но ведь форум для того и создан, чтобы люди могли что то спросить, а знающие могли помочь....
    Ну вообщем сама задача: Нужно реализовать макрос деления на константу, и проверить - является ли константа степенью двойки, если является, то деление осуществить сдвигом (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. ????

    ???? Гость

    Вот:
    Код (Text):
    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
    .
    .
     
  3. Karloson

    Karloson Гость

    БОльшое спасибо, я вот тут написал сам кое что, до того как прочёл ваше предложение, но боюсь это не оптимально :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
     
  4. deeka

    deeka Гость

    Ага... На этапе компиляции принять решение о делимости числа на 2...
    Хитро, но не актуально.
     
  5. ????

    ???? Гость

    deeka

    т.е. все актуально :( и ничего хитрого нет ;)
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей