Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Оптимизация кода программы для работы с массивами


Автор: vladis222 26.11.2013, 21:40
Здравствуйте,нужна ваша помощь,я написал код программы для работы с массивами, но он,к сожалению, не оптимизирован как нужно,а ассистент кафедры  дал задание оптимизировать заданный код,подскажите,пожалуйста что в нем можно исправить,какие ошибки если есть ?
Задание :

Y[k] = 4*X[k]/X[2N-k] + k^2*X[N+1-k]/(k+1)/X[k+1]
                     N=5     k=1,2,...5

Код программы:
Код

.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
.data
; данные программы
 
 
arr_x db 0,1,2,3,4,5,6,7,8,9,10,11    ;Размер каждого элемента 1 байта
arr_y dw 7 dup (0)                    ;Размер каждого элемента 2 байта
N db 5
 
.code
main proc
    ; код главной функции
    mov si,0    ;si=0
    mov cx,5    ;cx= k=4
    
for_k:
    mov ax, 4    ;ax=4
    movzx dx, N            ;dx= N=5
    mov si,cx            ;si=cx= k    
    movsx bx, arr_x[si]    ;bx= X[k]
    imul ax, bx            ;ax= 4*X[k] ???
    mov bx, ax            ;bx= 4*X[k]
    mov ax,dx            ;ax = N
    imul ax, word ptr 2    ;ax= 2N ???
    sub ax,cx            ;ax= 2N-k
    mov si,ax            ;si= 2N-k
    mov ax,bx            ;ax=bx= 4*X[k]
    mov bl, arr_x[si]
    idiv bl                ;ax= 4*X[k]/X[2N-k]
    movsx esi,cx        ;esi=cx= k
    movsx dx, al
    mov arr_y[esi*2],dx    ;Y[k]= 4*X[k]/X[2N-k]
    mov ax,cx            ;ax= k
    mul cx                ;ax= k^2 ???
    movsx si,N            ;si= N
    sub si,cx            ;si= N-k
    imul arr_x[si+1]    ;ax= k^2*X[N+1-k] ???
    cwd
    mov bx,cx            ;bx= k
    add bx,1            ;bx= k+1
    idiv bx                ;al= (k^2*X[N+1-k])/(k+1)
    mov si,cx            ;si= k
    idiv arr_x[si+1]    ;al= (k^2*X[N+1-k])/(k+1)/X[k+1]
    movsx ax,al
    movsx esi,cx
    add arr_y[esi*2], ax ;ax= 4*X[k]/X[2N-k] + 
                        ;    + (k^2*X[N+1-k])/(k+1)/X[k+1]
    dec cx
    test cx,cx        ;ax ? bx сравнение(ax-bx)
    jnz for_k
 
    invoke ExitProcess, 0    ; завершение работы
main endp
end main


Автор: kolobok0 4.12.2013, 22:01
Цитата(vladis222 @ 26.11.2013,  21:40)
...задание оптимизировать...что в нем можно исправить...

1) оптимизировать что? если размер - одно. если скорость - другое. как правило это взаимоисключающие вещи. и обычно компиляторы помимо настроек стремяться к сбалансированному подходу.
2) если Вы возьмёте скорость выполнения ассемблерных инструкций для данного типа проца или МК, и попытаетесь исключить их из общей логики(особенно циклов если есть) работы - то получите профит. Например в Вашей формуле наверняка можно попытаться заменить такие операции как деление...
3) попытаться использовать особенности двоичной системы и конкретного железа. Ну например: сдвиг в право два раза есть деление на 4. Или скажем отбросив с права слово от 64 разрядов Вы делите на 65535 smile и т.д..

удачи вам
(круглый)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)