Главная страница
    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.062 c
2-1172270538
Riply
2007-02-24 01:42
2007.03.18
Положительные или отрицательные стороны оператора With


15-1171961180
Ученик чародея
2007-02-20 11:46
2007.03.18
Как именно пираты вредят развитию IT-области?


4-1162818043
Виктор1985
2006-11-06 16:00
2007.03.18
Функция обратная GetDC


15-1172140211
RomanH
2007-02-22 13:30
2007.03.18
Аналог IBExpert a для MSSQL


15-1171822276
Kerk
2007-02-18 21:11
2007.03.18
Простите и вы меня чтоль





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский