Форум «Всё о Паскале» _ Ассемблер _ помогите, почему выдаёт ошибку деление на ноль?
Автор: 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 {; в начало цикла}
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;" в начале код зацыклился так же как и паскалевский. Значит задание выполнено верно. Если все же есть сомнения, то можно просто откомпилировать паскалевский вариант и выдернуть из дизасма то, что получится. Тогда будет точно 1 в 1.
Автор: forum4uxa 21.01.2007 0:46
Цитата(Malice @ 19.01.2007 11:48)
После того ка я поставил "i:=57; k:=19;" в начале код зацыклился так же как и паскалевский. Значит задание выполнено верно. Если все же есть сомнения, то можно просто откомпилировать паскалевский вариант и выдернуть из дизасма то, что получится. Тогда будет точно 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 он когда нибудь расциклится????
даа действительно работает . Спасибо за помощь. а ты случаем не знаешь тут есть любители с драйверами работать, хочу получить советы от профов.
Автор: 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]