С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
10 / 10 / 5
Регистрация: 30.12.2010
Сообщений: 379

Почему то вылетает ошибка о делении на ноль

06.01.2012, 06:44. Показов 1154. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброй ночи, сегодня программированием занимался много, поэтому вопросов тоже много. Почему то вылетает ошибка о делении на ноль в нижеприведенном коде. Задание:
Простые делители. Задано натуральное
число N. Найти и напечатать все его простые делители.
С комментариями я явно переборщил, но пускай будет побольше чем непонятно. Код:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
uses crt;
label one,two;
var
q,w,e,n,r:integer;
sisla:string;
function strg(aaa:integer): string;
var bbb:string;
begin
 str(aaa,bbb);
 strg:=bbb;
end;
begin
writeln('N:');
readln(n);
{
bx-timer1
cx-timer2
ax-otveti
 
}
asm
 mov bx,0         {bx это счетсик 1 цикла}
 one:                 {repeat}
  inc bx             {счетчик увеличивается на1}
  mov ax,n        {ax-у присваевается число N}
  xor dx,dx        {обнуляю dx}
  div bx              {проверяю с остатком ли число получившееся при n/текущий счетчик} 
  test dx,0       {если остаток не 0 т. е. число bx не является множетелем n, то обратно на метку one}
  JnE one    
{а если является то:}
  mov cx,0   {cx это счетчик для второго цикла} {этот цикл проверяет, является ли делитедь n "простым" числом}
  mov ax,bx  
  two:            {repeat}
   inc cx         {счетчик увеличивается на 1}
   push ax      {запоминаются ax и cx}
   push cx
   mov cx,2     {в cx кладется 2}
   xor dx,dx    {обнуляю dx}
   div cx          {делю проверяемый делитель на 2}
   pop ax        {вывожу из память ax и cx}
   pop cx
   CMP dx,0   {если разделилось с остатком то число простое}
   JE one
  CMP cx,n   {если счетчик_2 не достиг лимита то обратно, в начало 2-го цикла} 
  JnE two
  mov q,bx    {в q переменную которая и делитель n и простое число}
  push ax      {сохраняю регистры (pushad - popad почему то не работают)}
  push bx
  push cx
  push dx
  end;
   sisla:=sisla+strg(q); {прибавляю к числам тот делитель}
  asm
  pop ax
  pop bx
  pop cx
  pop dx
 CMP bx,n {если счетчик_1 не достиг лимита, то в начало цикла}
 JnE one
end;
writeln(sisla);
readln;
end.
Подскажите пожалуйста, что не так? Только это надо именно на ассемблере под паскалем, на чистом паскале нельзя.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.01.2012, 06:44
Ответы с готовыми решениями:

Почему при делении единицы на два выводится ноль?
double percentload = 1 / 2; label1.Text = Convert.ToString(percentload); Простите, пожалуйста, за глупый вопрос, но всё...

Почему при делении целых чисел получается ноль?
Почему у меня выводит 0. Я уже голову сломал. объясните, пожалуйста #include <iostream> using namespace std; int main() { ...

DivideByZeroException. При делении на ноль ошибка не показывается
При делении на ноль ошибка не показывается, подскажите что я неправильно делаю. double a=2, b=3, c=4, a1=0, b1=0, c1=0, p; ...

2
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
06.01.2012, 11:21
Assembler
1
2
3
4
5
6
7
8
9
  push ax      {запоминаются ax и cx}
   push cx
   mov cx,2     {в cx кладется 2}
   xor dx,dx    {обнуляю dx}
   div cx          {делю проверяемый делитель на 2}
   pop ax        {вывожу из память ax и cx}
   pop cx
   CMP dx,0   {если разделилось с остатком то число простое}
   JE one
это лучше заменить на
Assembler
1
2
test ax,1
JE one
и если сохраняете регисты в стек, то восстанавливать их нужно в обратном порядке:
Assembler
1
2
3
4
5
push ax
push cx
...
pop cx
pop ax
1
 Аватар для zzzyyyxxx
768 / 312 / 11
Регистрация: 27.05.2011
Сообщений: 703
06.01.2012, 11:42
alexcoder, и ниже, то же самое со стеком, но даже если это подправить, то при попадании на первое деление bx достигает 0 и всё слетает...

Илья01, сделай сначала на паскале, а там перевести в асм будет проще...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.01.2012, 11:42
Помогаю со студенческими работами здесь

Нужно сделать чтобы при делении на ноль, выводило На ноль делить нельзя, введите другое число
Я сделал, на ноль то он не делит, но когда ввожу другие значение, то там тоже выводится Делить на ноль нельзя, хотя вводил вовсе не ноль...

Почему при делении на ноль получаем "бесконечность"
double? y = null, v = 0, w = 1.5; y = w / v; Вычитал, что при вычислении значения переменной y выполняется деление на ноль,...

Отследить прерывание при делении на ноль
как реализовать деление чисел без сравнения делителя с нулем, а с отслеживанием прерывания при делении на ноль, и если оно есть то вывести...

Бесконечное значение при делении на ноль
Что это означает допустимое бесконечное значение при делении на ноль? var1 = (var2 != 0) && (var3 / var2 > 2); Здесь в...

Вывод ошибки при делении на ноль
Есть у меня программка, не выводится сообщение о делении на ноль Вот код: private void button1_Click(object sender, EventArgs e) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru