Помощь - Поиск - Пользователи - Календарь
Полная версия: помогите, почему выдаёт ошибку деление на ноль?
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
ne_ass
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
В ассемблерном примере деление на ноль у тебя возникает, из-за того, что переменным i и k ты не задал начальных значений.
Более того в том примере, где ты показал как должно быть, цикл получается бесконечный. Ибо после нескольких проходов по телу цикла значения i и k становятся 57 и 17493 и более не меняются. Переменная i не меняется совсем!
forum4uxa
Цитата(hiv @ 18.01.2007 14:37) *

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



А ты не можешь подсказать где именно ошибка???
hiv
Цитата(forum4uxa @ 18.01.2007 20:10) *

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

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

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

а всё же... почему возникает ошибка: ДЕЛЕНИЕ НА НОЛЬ , ведь значения указываем, все регистры чего нить содержат, что за дела-то?
Malice
После того ка я поставил "i:=57; k:=19;" в начале код зацыклился так же как и паскалевский. Значит задание выполнено верно. smile.gif
Если все же есть сомнения, то можно просто откомпилировать паскалевский вариант и выдернуть из дизасма то, что получится. Тогда будет точно 1 в 1.
forum4uxa
Цитата(Malice @ 19.01.2007 11:48) *

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

а можешь акценировать внимание на "дизасм" , а то я уже и незнаю, что и делать...Если не трудно можешь объяснить, а то уже начинает поднаедать сидеть 3 сутки над этой задачкой, заранее благодарен.
Malice
Цитата(forum4uxa @ 20.01.2007 20:46) *

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

Вот здесь посмоти, я ответил уже:
как это будет выглядеть в Паскале?
Asm
Код
cmp dx, 5{; сравниваем остаток}
        jnz @label2{; если не равен 5 - то на label2}

jnz - переход если результат не ноль
мне кажется здесь нужно использовать JNE
Malice
Цитата(Asm @ 20.01.2007 23:17) *

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

Одно и тоже, суть - проверка флага ZF.
forum4uxa
и всё таки получилось у кого???
Malice
Ты узнал у препода на счет данного тебе цыкла ? Он виснет. Его менять нельзя. На асме делается тоже самое. В чем проблема ? Что должно получится ?
forum4uxa
Цитата(Malice @ 23.01.2007 15:49) *

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

препод сказал что всё нормально, поломай типа головку.
Asm
hiv,а есть вероятность что при заданных значениях i и k он когда нибудь расциклится????
hiv
Цитата(Asm @ 24.01.2007 0:57) *

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

даже при четырехбайтовом целом k - вероятность 0%
Malice
Цитата(Asm @ 24.01.2007 0:57) *

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

как это будет выглядеть в Паскале?
forum4uxa
Цитата(Malice @ 24.01.2007 9:35) *

Друг, а ты её запускал? работала?
Malice
Цитата(forum4uxa @ 24.01.2007 11:18) *

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

Конечно. Да. С i=19, k=57.
forum4uxa
Цитата(Malice @ 24.01.2007 11:36) *

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

а у меня почему то всё равно деление на ноль, покажи пожалуйста свой текст программы
Malice
Вот оба варианта, оба у меня работают одинаково.
forum4uxa
Цитата(Malice @ 24.01.2007 12:05) *

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

даа действительно работает smile.gif . Спасибо за помощь. а ты случаем не знаешь тут есть любители с драйверами работать, хочу получить советы от профов.
Malice
Я думаю любители тут есть, задавай вопросы в соответствующий раздел и будет тебе счастье..
forum4uxa
коллега можно у тебя поинтересоваться, ниже циклик, не знаешь случаем что такое $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
Цитата(forum4uxa @ 24.01.2007 12:33) *
что такое $AFA
$AFA=0AFA(шестнадцатеричка)=2810(в десятичной системе)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.