Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 14.05.2019
Сообщений: 22
1
TASM

Возникает ошибка "Деление на ноль", когда на ноль ничего и нигде не делится

09.06.2019, 11:19. Показов 2786. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написал программу, которая выводит на экран координаты клика мыши.
Assembler
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
SSEG    segment stack       
        db 256 dup(0)
SSEG    ends
 
DSEG    segment         
        mess   db 'Privet',0dh,0ah,'$'
        mess2  db 'Privet and ty for click!!!',0dh,0ah,'$'
        x_coord dw ?
        y_coord dw ?
        snake dw ?
        
DSEG    ends
 
CSEG    segment         
        assume cs:CSEG,ds:DSEG,ss:SSEG
begin:
        mov ax,DSEG 
        mov ds,ax       
                      
        mov ah,09h                       
        mov dx,offset mess      ;privet
 
        mov ax,13h
        int 10h
        
        
        
        ;int 21h    
        
        mov ax,00h              ;initialyze mouse
        int 33h
        mov ax,01h              ;show kursor
        int 33h
        
        mov ax,cs               ;mov adr of cs
        mov es,ax               ;to ex, for offset handler
        mov ax,000ch            ;set handler
        mov cx,0002h            ;event - lcm
        mov dx,offset click_handler
        int 33h 
        
        
        mov ah,01h              ;WAIT
        int 21h 
        
        mov ax,000ch            ;delete handler
        mov cx,0000h            ;event -  none
        int 33h
        
        mov ah,01h              ;WAIT
                int 21h                              
                mov ah,4ch              ;prog ENDS
                int 21h 
                         
click_handler:
        mov ax,DSEG             ;for exe
                mov ds,ax               ;for exe
        
        ;push dx                    !!!!!!!!
        ;mov dl,02h               !!!!!!!!
        ;xor ax,ax                  !!!!!!!!
        ;mov ax,cx                 !!!!!!!!
        ;div dl                        !!!!!!!!
        ;mov cx,ax                 !!!!!!!!
        ;pop dx                      !!!!!!!!
        
        
        mov x_coord,cx
        mov y_coord,dx
        
        mov ax,x_coord
        call far ptr print_num
        mov ax,y_coord
        call far ptr print_num
        
 
        retf
        
print_num proc far
        mov si,10
        mov ax,ax               ;FIRST LOAD IN AX
        mov cx,0
a:      
        mov dx,0
        div si
        add dx,'0'
        push dx
        inc cx
        cmp ax,0
        jnz a
aa: 
        pop dx
        mov ah,02h
        int 21h
        loop aa
        mov dl,0ah
        int 21h
 
        retf
print_num endp      
        
CSEG    ends        
end begin
Если убрать кусок кода, выделенный комментарием и восклицательными знаками, то программа работает полукорректно: Выводит удвоенную координату x и верную координату y.
При добавлении куска кода программа начинает работать очень странно: теперь в левой части экрана координата x выводится верно, но только до значения 255. Если кликнуть на часть экрана, которая находится правее программа "ломается". В отладчике при клике в этой области выдает ошибку: divided by zero.
Помогите пожалуйста найти проблему
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2019, 11:19
Ответы с готовыми решениями:

Возникает деление на ноль
Здравствуйте, по непонятным для меня причинам возникает "деление на ноль" и программа не может...

Сделать, чтобы при попытке деления на ноль, выводилось сообщение: «Деление на ноль»
Создайте консольное приложение. В нем реализуйте нахождение значения выражения 1/(x+n), где n –...

Тригонометрическая функция: деление на ноль, если ничего не вводить в TextBox
Function ArcSin(X As Double) As Double ArcSin = Atn(X / Sqr(-X * X + 1)) End Function ...

Деление на ноль (хотя я не делю на ноль)
.model small .stack 300h .data tabw dw -1135h,2326h dw 2A76h,0458h tabb dw 16h,9ah dw...

ошибка деление на ноль
пишет деление на ноль program l4; const eps=0.1 var i,zn,a,znak,z:integer; ...

2
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
09.06.2019, 11:40 2
Лучший ответ Сообщение было отмечено keldranace как решение

Решение

Цитата Сообщение от keldranace Посмотреть сообщение
При добавлении куска кода программа начинает работать очень странно: теперь в левой части экрана координата x выводится верно, но только до значения 255.
И это естественно. Команда div генерирует прерывание от деления на 0 не только при делении на 0, но и еще если частное не влезает в тот регистр куда должно помещаться. Ты у себя в коде использовал такое div , что частное - байт. Максимальное значение байта 255. Максимальное значение байта 255. Как только результат деления координаты на 2 становился больше 255 команда div генерировала прерывание по делению на 0, поскольку частное не влезало в байт.

Добавлено через 2 минуты
Цитата Сообщение от keldranace Посмотреть сообщение
div dl !!!!!!!! ;
mov cx,ax !!!!!!!!
Ты кстати командой div dl получаешь в al частное, а в ah остаток. А потом конкатенацию всего этого засовываешь в cx якобы это координата деленная пополам. А это частное к которому приставлен остаток.

Добавлено через 53 секунды
Тупо почитай что на что делит div и куда сует результаты в двух случаях - когда делитель байт и когда делитель слово. Тебе надо было использовать вариант когда делитель - слово. Тогда и частное - слово и любая координата на экране в него влезет.

Добавлено через 1 минуту
А вообще весь тобой закомментированный кусочек заменяется на одну команду
shr cx,1
и никакого тебе деления на ноль. Потому-что сдвиг беззнакового на бит вправо это и есть деление на два.
4
0 / 0 / 0
Регистрация: 14.05.2019
Сообщений: 22
09.06.2019, 11:57  [ТС] 3
Спасибо тебе огромное.
Ведь и все вроде знаю, и команду shr, и то, как div ведет себя в зависимости от размера делителя, но когда дело доходит до практики то все забывается.
Не знаю, что бы делал без тебя
0
09.06.2019, 11:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2019, 11:57
Помогаю со студенческими работами здесь

Ошибка - деление на ноль
День добрый! возникла у меня проблемка очередная( есть формула с двумя переменными обоим...

Деление на ноль - ошибка
Ребята, помогите пожалуйста. я уже запарился, что ему надо?? Это только часть программы, но на...

Ошибка деление на ноль
в конкретном случае (a>1/a) при а= 0 естественно ошибка деление на ноль, как этого избежать??? ...

Ошибка: деление на ноль
Помогите исправить ошибку, не пойму, где и почему program sr1; var a,v,b,pi,w,f,p: real; begin...

Ошибка - деление на ноль
Здравствуйте, возникла ошибка в примере по оценке точности интеграла по методу трапеций, никак...

Ошибка деление на ноль
Что нужно исправить в этой процедуре, чтобы не было деления на ноль ? Procedure...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru