Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ помогите, почему выдаёт ошибку деление на ноль?

Автор: ne_ass 18.01.2007 9:12

uses crt;
var i,k:word;
BEGIN
clrscr;

asm
mov cx, i { ; это будет i}
mov si, k {; это будет k}
mov bx, 11 {; число для вычисления модуля}

@l0:
cmp cx, 199 {; если i больше или равно 199 выходим из цикла}
jge @ext1

mov ax, si
shr ax, 1 {; деление k на 2}
add ax, cx {; добавляем i}
xor dx, dx {; очищаем dx для деления}
div bx {; делим на 11}

cmp dx, 5{ ; сравниваем остаток}
jnz @label2{ ; если не равен 5 - то на label2}

sub cx, si{ ; иначе i = i - k}
jmp @l0 ; {в начало цикла}

@label2:
mov ax, si {; подготавливаем деление}
xor dx, dx
mul ax {; умножаем на себя (k*k)}
mov dx, cx
shr dx, 1 {; делим i на 2 }
add ax, dx {; добавляем к резульату k*k}
mov si, ax {; заносим результат в k }
jmp @l0 {; в начало цикла}

@ext1:
{... ; обработка результата}
end;
writeln('REZULTAT-ASSAMBLER');
writeln('k=',k,' i=',i);
readkey;
end.



сам цикл таков
i:=57; k:=19;
while i<199 do
if ((i + k div 2) mod 11) = 5 then i:=i-k else k:=k*k+(i div 2)

Автор: hiv 18.01.2007 18:37

В ассемблерном примере деление на ноль у тебя возникает, из-за того, что переменным i и k ты не задал начальных значений.
Более того в том примере, где ты показал как должно быть, цикл получается бесконечный. Ибо после нескольких проходов по телу цикла значения i и k становятся 57 и 17493 и более не меняются. Переменная i не меняется совсем!

Автор: forum4uxa 19.01.2007 0:10

Цитата(hiv @ 18.01.2007 14:37) *

В ассемблерном примере деление на ноль у тебя возникает, из-за того, что переменным i и k ты не задал начальных значений.
Более того в том примере, где ты показал как должно быть, цикл получается бесконечный. Ибо после нескольких проходов по телу цикла значения i и k становятся 57 и 17493 и более не меняются. Переменная i не меняется совсем!



А ты не можешь подсказать где именно ошибка???

Автор: hiv 19.01.2007 14:10

Цитата(forum4uxa @ 18.01.2007 20:10) *

А ты не можешь подсказать где именно ошибка???

Здрасьте, я ваша тетя! В самом начале программы (перед директивой ASM) ставишь i:=57; k:=19;
А по поводу зацикливания - сам разбирайся, у нас телепатов нету. Ты же привел код, а для решения какой задачи не сказал. Вот и ищи теперь сам.

Автор: forum4uxa 19.01.2007 15:11

Цитата(hiv @ 19.01.2007 10:10) *

Здрасьте, я ваша тетя! В самом начале программы (перед директивой ASM) ставишь i:=57; k:=19;
А по поводу зацикливания - сам разбирайся, у нас телепатов нету. Ты же привел код, а для решения какой задачи не сказал. Вот и ищи теперь сам.

а всё же... почему возникает ошибка: ДЕЛЕНИЕ НА НОЛЬ , ведь значения указываем, все регистры чего нить содержат, что за дела-то?

Автор: Malice 19.01.2007 15:48

После того ка я поставил "i:=57; k:=19;" в начале код зацыклился так же как и паскалевский. Значит задание выполнено верно. smile.gif
Если все же есть сомнения, то можно просто откомпилировать паскалевский вариант и выдернуть из дизасма то, что получится. Тогда будет точно 1 в 1.

Автор: forum4uxa 21.01.2007 0:46

Цитата(Malice @ 19.01.2007 11:48) *

После того ка я поставил "i:=57; k:=19;" в начале код зацыклился так же как и паскалевский. Значит задание выполнено верно. smile.gif
Если все же есть сомнения, то можно просто откомпилировать паскалевский вариант и выдернуть из дизасма то, что получится. Тогда будет точно 1 в 1.

а можешь акценировать внимание на "дизасм" , а то я уже и незнаю, что и делать...Если не трудно можешь объяснить, а то уже начинает поднаедать сидеть 3 сутки над этой задачкой, заранее благодарен.

Автор: Malice 21.01.2007 0:55

Цитата(forum4uxa @ 20.01.2007 20:46) *

а можешь акценировать внимание на "дизасм" , а то я уже и незнаю, что и делать...

Вот здесь посмоти, я ответил уже:
http://forum.pascal.net.ru/index.php?s=&showtopic=15349&view=findpost&p=89347

Автор: Asm 21.01.2007 3:17

Код
cmp dx, 5{; сравниваем остаток}
        jnz @label2{; если не равен 5 - то на label2}

jnz - переход если результат не ноль
мне кажется здесь нужно использовать JNE

Автор: Malice 21.01.2007 3:22

Цитата(Asm @ 20.01.2007 23:17) *

jnz - переход если результат не ноль
мне кажется здесь нужно использовать JNE

Одно и тоже, суть - проверка флага ZF.

Автор: forum4uxa 23.01.2007 19:40

и всё таки получилось у кого???

Автор: Malice 23.01.2007 19:49

Ты узнал у препода на счет данного тебе цыкла ? Он виснет. Его менять нельзя. На асме делается тоже самое. В чем проблема ? Что должно получится ?

Автор: forum4uxa 23.01.2007 19:53

Цитата(Malice @ 23.01.2007 15:49) *

Ты узнал у препода на счет данного тебе цыкла ? Он виснет. Его менять нельзя. На асме делается тоже самое. В чем проблема ? Что должно получится ?

препод сказал что всё нормально, поломай типа головку.

Автор: Asm 24.01.2007 4:57

hiv,а есть вероятность что при заданных значениях i и k он когда нибудь расциклится????

Автор: hiv 24.01.2007 13:20

Цитата(Asm @ 24.01.2007 0:57) *

hiv,а есть вероятность что при заданных значениях i и k он когда нибудь расциклится????

даже при четырехбайтовом целом k - вероятность 0%

Автор: Malice 24.01.2007 13:35

Цитата(Asm @ 24.01.2007 0:57) *

hiv,а есть вероятность что при заданных значениях i и k он когда нибудь расциклится????

http://forum.pascal.net.ru/index.php?s=&showtopic=15349&view=findpost&p=89849

Автор: forum4uxa 24.01.2007 15:18

Цитата(Malice @ 24.01.2007 9:35) *

http://forum.pascal.net.ru/index.php?s=&showtopic=15349&view=findpost&p=89849

Друг, а ты её запускал? работала?

Автор: Malice 24.01.2007 15:36

Цитата(forum4uxa @ 24.01.2007 11:18) *

Друг, а ты её запускал? работала?

Конечно. Да. С i=19, k=57.

Автор: forum4uxa 24.01.2007 15:46

Цитата(Malice @ 24.01.2007 11:36) *

Конечно. Да. С i=19, k=57.

а у меня почему то всё равно деление на ноль, покажи пожалуйста свой текст программы

Автор: Malice 24.01.2007 16:05

Вот оба варианта, оба у меня работают одинаково.



Прикрепленные файлы
Прикрепленный файл  pas_asm.ZIP ( 534 байт ) Кол-во скачиваний: 124

Автор: forum4uxa 24.01.2007 16:28

Цитата(Malice @ 24.01.2007 12:05) *

Вот оба варианта, оба у меня работают одинаково.

даа действительно работает smile.gif . Спасибо за помощь. а ты случаем не знаешь тут есть любители с драйверами работать, хочу получить советы от профов.

Автор: Malice 24.01.2007 16:33

Я думаю любители тут есть, задавай вопросы в соответствующий раздел и будет тебе счастье..

Автор: forum4uxa 24.01.2007 16:33

коллега можно у тебя поинтересоваться, ниже циклик, не знаешь случаем что такое $AFA
n:=23;
j[n]:=2;
for k[n]:=$AFA downto 9 do
if ((k[n] div 4)=3) or (k[n] mod 100=0) then j[n]:=j[n]*k[n]+k[n]*k[n] else j[n]:=j[n]+k[n]

Автор: hiv 24.01.2007 19:37

Цитата(forum4uxa @ 24.01.2007 12:33) *
что такое $AFA
$AFA=0AFA(шестнадцатеричка)=2810(в десятичной системе)