Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.18;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.059 c
15-1171831724
Leonid Troyanovsky
2007-02-18 23:48
2007.03.18
Таракан


2-1172174890
Kyau
2007-02-22 23:08
2007.03.18
Как узнать, установлен ли в системе тот или иной шрифт?


15-1171647538
Ксардас
2007-02-16 20:38
2007.03.18
Есть ли в html тег который


15-1171980330
oldman
2007-02-20 17:05
2007.03.18
Программа "Налогоплательщик 2006 v10.35"


2-1172082442
Novichok_New
2007-02-21 21:27
2007.03.18
Свой "Планировщик задач"