Форум: "Прочее";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
ВнизAssembler - программирование циклических процессов Найти похожие ветки
← →
Двоишник (2007-02-21 17:01) [0]Помогите, пожайлуста.
Написал прогу, которая вычисляет выражение y[k] и результат записывает в массив. С вычислениями все получилось нормально, а вот с записью в массив не очень, при записи нового элемента стирает предыдущий. Что не так?
;y[k]=4*X[k]/X[2N-k]+k**2*X[N+1-k]/(k+1)/X[k+1]
Stack segment stack "stack"
dw 100H DUP (0)
stack ends
Data segment "data"
X db -2,-1, 1, 2, 3, 4, 5, 6, 7
Y dw 0, 0, 0, 0, 0
Data ends
Code segment "code"
assume cs:code, ss:stack, ds: data
Drob1 proc far
; значение k передается в регистре CL
push ax
push cx
push dx
push si
mov al,cl ;Заносим счетчик (k) в АХ
cbw ;Переконвертируем из byte в word
mov si,ax
sub ax,ax ;Очистим АХ
sub bx,bx ;Очистим BХ
mov al,X[si-1] ;Заносим в AL X[k]
cbw
mov dl,4
imul dl ;Умножим на 4
mov bl,al
mov al,5 ;Вычислим
add al,al
cbw
sub ax,cx ;[2N-k]
mov si,ax
mov al,X[si-1]
cbw
mov dx,bx
mov bx,ax
mov ax,dx
cbw
idiv bl ;Разделим на X[2N-k]
mov bl,al
cbw
pop si
pop dx
pop cx
pop ax
ret ;Возвращаем значение
Endp
Drob2 proc FAR
; значение k передается в регистре CL
push bx
push cx
push dx
push si
mov al,cl ;Заносим счетчик (k) в AL
imul al
cbw
mov bx,ax
mov al,5 ;Заносим число элементов в АL
sub al,cl ;Вычислим N-k
cbw
mov si,ax
mov al,X[si] ;Заносим в AL значение X[N+1-k]
cbw
imul bx
mov bl,cl
cbw
inc bx ;Добавим единицу
idiv bx
mov bl,cl
inc bl
cbw
mov si,bx
mov bl,X[si-1]
idiv bl
cbw
pop si
pop dx
pop cx
pop bx
ret
Endp
Begin proc far
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
mov al,5 ;Заносим значение в счетчик
cbw
mov cx,ax
Start:
call Drob1
call Drob2
add ax,bx ;Слаживаем результаты
mov bl,cl
cbw
mov si,bx
mov Y[si],ax ;Сохраняем результат
Loop Start ;Повторяем цикл, если есть необходимость
ret
Begin Endp
Code Ends
End Begin
← →
Ketmar © (2007-02-21 17:14) [1]точно форумом не ошибся?
← →
Prohodil Mimo © (2007-02-21 17:29) [2]Ketmar © (07.02.21 17:14) [1]
точно форумом не ошибся?
Delphi-программисты знают всё, не то что программисты других языков :о)
← →
alien1769 © (2007-02-21 17:33) [3]
> Что не так?
Ник не нравится :(
← →
oldman © (2007-02-21 17:55) [4]Ты хоть код правильно пиши...
> mov al,cl ;Заносим счетчик (k) в АХ
> cbw ;Переконвертируем из byte в word
> mov si,ax
> sub ax,ax ;Очистим АХ
> sub bx,bx ;Очистим BХ
> mov al,X[si-1] ;Заносим в AL X[k]
И зачем счетчик сначала в АХ, чтоб тут же его в SI???
И не вижу (может, просто не вижу), а где счетчик меняется?
← →
Чапаев © (2007-02-21 18:01) [5]> mov al,5 ;Заносим значение в счетчик
> cbw
> mov cx,ax
Это зачем такой изврат? Чемmov cx,5
рылом не вышел?
> с записью в массив не очень, при записи нового элемента
> стирает предыдущий. Что не так?
То, что результат у тебя -- массив слов. А ты с каждой итерацией на байт продвигаешься. Лично я бы вместо
> mov bl,cl
> cbw
> mov si,bx
сделалmov si,cx
.
shl si,1
Ну и ещё непонятно, зачем ты все процедуры дальними объявил. И завершать exe ret"ом некошерно...
← →
Ketmar © (2007-02-21 18:22) [6]вах. кто-то даже прочесть код асилил...
← →
oldman © (2007-02-21 18:36) [7]
> при записи нового элемента стирает предыдущий
"Если в ассемблере вам надо 5 переменных, свободных регистров всегда 4"
(Законы Мерфи ©)
← →
Двоишник (2007-02-21 21:57) [8]>>(21.02.07 18:01) [5]
Дима, огромное спасибо.
>>Ну и ещё непонятно, зачем ты все процедуры дальними объявил. И завершать exe ret"ом некошерно...
...так двоишник же 8-))
> Prohodil Mimo © (21.02.07 17:29) [2]
> Ketmar © (07.02.21 17:14) [1]
> точно форумом не ошибся?
>
> Delphi-программисты знают всё, не то что программисты других
> языков :о)
...а разве нет?
← →
Ketmar © (2007-02-21 22:17) [9]> Чапаев © (21.02.07 18:01) [5]
lea si,[cx*2]
? или оно в 16 битак не фонтан?
← →
Rouse_ © (2007-02-21 22:44) [10]ужос... sub вместо xor, cbw вместо a(e/c/d)x, проводка параметра через два регистра, отсутствие поправки на dw... Мдя...
Двоешник - я не согласен с alien1769. Ник у тебя правильный.
← →
Zeqfreed © (2007-02-21 22:56) [11]> ужос... sub вместо xor
Они же, вроде, в байт-код одинаковой длины преобразуются?
← →
Ketmar © (2007-02-21 22:57) [12]все олдскулеры используют xor.
я тоже. %-)
← →
Zeqfreed © (2007-02-21 22:59) [13]> Ketmar © (21.02.07 22:57) [12]
Нет, ну я тоже предпочел бы xor, но это не так уж страшно, по-моему :)
← →
Ketmar © (2007-02-21 23:05) [14]в общем -- хреново учат в универах ассемблеру. не видно творческого подхода.
← →
Чапаев © (2007-02-22 10:18) [15]> [9] Ketmar © (21.02.07 22:17)
Фонтан, просто... комплексы, наверное, мои личные... Ну вот такая фигня, что если уж я на асме пишу, так с таким набором инструкций, который на 8086 исполнится. :-D
Хотя на 100% не уверен, может быть, что масштабирование только с 32-разрядными регистрами работает, не помню уже...
> ужос... sub вместо xor
Это как раз нормально. Afaik, sub и xor эквивалентны и по размеру, и по быстродействию. Но вот sub ax,ax/sub bx,bx я бы заменил на sub ax,ax/mov bx,ax.
← →
alien1769 © (2007-02-22 10:37) [16]
> Двоешник - я не согласен с alien1769. Ник у тебя правильный.
Розыч для тебя напишу.
Просмотрев текст кода автора я "настучал", что с таким ником обсуждения не будет.
← →
default © (2007-02-22 10:39) [17]а мне сабж понравился
"программирование циклических процессов" как звучит!
← →
Ketmar © (2007-02-22 11:12) [18]> Чапаев © (22.02.07 10:18) [15]
> может быть, что масштабирование только с 32-разрядными
> регистрами работает, не помню уже...
так та же фигня. я правда, тоже lea постоянно забываю. потому что не было такого в Z80. %-)
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.03.18;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.044 c