Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.07 c
2-1172301898
nija
2007-02-24 10:24
2007.03.18
Web-browser


2-1172231782
rts111
2007-02-23 14:56
2007.03.18
TWordApplication: Как узнать количество страниц в документе?


4-1155566603
Sinus
2006-08-14 18:43
2007.03.18
Загрука и отображение bitmap


15-1172051251
GARPbI4
2007-02-21 12:47
2007.03.18
Сколько могут стоить услуги програмеров на асемблере? (нужна пом)


15-1172114951
Slider007
2007-02-22 06:29
2007.03.18
С днем рождения ! 22 февраля





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский