Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
devnull
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 4
1

Деление знаковых чисел с выводом ошибки "Деление на ноль"

29.03.2010, 13:29. Просмотров 2608. Ответов 2
Метки нет (Все метки)

Собственно поставили передо мной задачу - написать прогу деления двух чисел, причем что бы учитывался знак, и помимо всего прочего при делении на ноль выводилось сообщение об ошибке (что то типа "Divizion by zero").

Вот не могу разобраться как это осуществить в уже ранее созданной программе которая складывает числа. Может кто что посоветует?
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
.model small
 .data
input1 db 0dh,0ah,'Enter first number  : $'
input2 db 0dh,0ah,'Enter second number : $'
output db 0dh,0ah,'Sum = $'
output2 db 0dh,0ah,'Error'
 
buf label byte  ; прием строки с клавиатуры
max db 20  ; максимальная длина строки
len db 0  ; реальная длина введенной строки
string db 20 dup (?) ; собственно сама строка
 
 .code
 .startup
 
Get_First:
 lea dx, input1 ; строка проглашения
 call GetNum  ; введем число в AX
 jc Get_First ; повторим, если ошибка
 mov bx, ax  ; сохраним
 
Get_Second:
 lea dx, input2
 call GetNum
 cmp ax,0
 jc Get_Second
 add ax, bx  ; сложим с первым
 
 lea dx, output ; строка Sum=
 call PrintNum ; выведем число
 
 mov ah, 0  ; ждем нажатие на клавишу
 int 16h
 
 mov ax,4c00h ; конец работы
 int 21h
 
PrintNum proc  ; вывод числа из AX
 push ax
 mov ah, 9
 int 21h  ; вывод строки (из DX)
 pop ax
 
 test ax, ax  ;проверим на знак
 jns form_str ;для положительного на вывод
 push ax  ;для отрицательного выводим - и меняем знак
 mov al,'-'  ;знак -
 int 29h
 pop ax
 neg ax  ;меняем знак числа на +, теперь оно положительное
 
form_str:
 mov bx, 10  ; будем делить на 10
 xor cx, cx  ; счетчик цифр
div_loop:   ; цикл получения десятичных разрядов
 xor dx, dx  ; подготовимся для очередного деления
 div bx  ; в dx остаток - очередной десятичный разряд
 push dx  ; сохраним в стеке (от младшего к старшему)
 inc cx  ; посчитаем все это
 test ax, ax  ; проверим на наличие еще десятичных разрядов
 jnz div_loop ; продолжим далее...
 
pr_loop:   ; цикл вывода десятичных цифр-символов
 pop ax  ; востановим очередной разряд (от старшего к младшему)
 add al, '0'  ;  символ цифры
 int 29h  ; вывод
 loop pr_loop  ; по всем цифрам
 
 ret
PrintNum endp
;
GetNum proc   ; преобразование сроки в число
 push bx
 mov ah, 9
 int 21h  ; приглашение ввести строку
 lea dx, buf
 mov ah, 0ah
 int 21h  ; вводим строку
 
 xor di, di  ; здесь будем накапливать число
 mov cl, 0  ; флаг знака
 mov ch, 0  ; количество цифр
 xor bx, bx  ; очередной знак (для сложения со словом)
 lea si, string ; числовая строка
get_num_loop:
 lodsb   ; очередная цифра
; проверим на разделители
 cmp al, 0dh
 je num_end_found ; конец ввода
 cmp al, ' '
 je num_end_found
 cmp al, 9
 je num_end_found
; минус может быть олько один и в первой позиции! 
 cmp al, '-'
 jne cmp_num
 test ch, ch  ; были ли введены цифры?
 jnz set_c  ; были - ошибка - минус не в первой позиции!
 test cl, cl  ; был ли уже введен минус?
 jnz set_c  ; был - ошибка - можно только один!
 mov cl, 1  ; пометим отрицательное число
 jmp get_num_loop ; на анализ следующего символа
cmp_num:
 cmp al, '0'  ; цифра?
 jb set_c  ; фигушки - не цифра! 
 cmp al, '9'
 ja set_c
 
 inc ch  ; считаем цифры
 and al, 0fh  ; цифра -> число (30h-39h -> 0-9)
 mov bl, al  ; сохраним (bh=0)
 mov ax, 10  ; умножим на 10 
 imul di  ; предыдущее значение
 test dx, dx  ; больше cлова - ошибка!
 jnz set_c
 add ax, bx  ; добавим сохраненный разряд
 jc set_c  ; больше  слова - ошибка!
 js set_c  ; больше 32767 - ошибка!
 mov di, ax  ; сэйвим
 jmp get_num_loop ; на анализ следующего символа
 
num_end_found:   ; встретили разделитель
 test ch, ch  ; что-то было?
 jz set_c  ; не было числа (например, был введен один минус)
 test cl, cl  ; число отрицательное?
 jz get_num_ret
 neg di  ; дополнительный код отрицательного числа
get_num_ret:
 mov ax, di  ; результат сэйвим в ax
 pop bx
 clc   ; все гут
 ret
set_c:
 pop bx
 stc   ; ошибка
 ret
GetNum endp 
 
 end ;финита =)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2010, 13:29
Ответы с готовыми решениями:

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

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

Деление с выводом на экран
Здравствуйте! Мне нужно поделить 2 числа на ассемблере. Но при делении частное записывается в...

деление чисел
xor dx,dx mul num1 mul num1 add ax,num1 mov bx,ax mov ax,num1 mov cx,35 ...

Деление чисел
Вообщем задание заключается в том, что ввести 2 числа с клавиатуры и разделить их, а потом вывести...

2
airyashov
69 / 74 / 0
Регистрация: 15.12.2008
Сообщений: 302
30.03.2010, 08:36 2
Оригинальное условие, только никогда не сработает
Assembler
1
2
 cmp ax,0
 jc Get_Second
заменить
Assembler
1
 add ax, bx  ; сложим с первым
на
Assembler
1
2
 cwd
idiv bx  ; dx:ax/bx
0
Кобелев Андрей
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 3
13.04.2010, 16:20 3
как реализовать это деление без сравнения числа с нулем, а с отслеживанием прерывания при делении на ноль, и если оно есть то вывести ошибку на экран
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2010, 16:20

Деление больших чисел
здравствуйте. есть число X, где каждая цифра представляется в виде одного байта с лева направо...

Умножение и деление чисел
Здравствуйте уважаемые форумчане. По ходу выполнения задания возник вопрос. Есть у нас пример...

Деление двоичных чисел
x = 00010111, y = 11001010 Надо разделить х на y в двоичной системе. Есть ли у кого программа,...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru