Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: математика, вычисления
Войти
Регистрация
Восстановить пароль
 
haseki
3 / 3 / 1
Регистрация: 02.11.2013
Сообщений: 164
1

Ошибка "divide by zero"

18.10.2015, 15:55. Просмотров 497. Ответов 3
Метки нет (Все метки)

Код программы:

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
Data SEGMENT                         ;Открыть сегмент данных
    A DW 16h                        ;Инициализировать 
    B DW -50                        ;переменные A, B, C, D, X
    C DW 1Bh
    D DB 3
    X DW ?
Data ENDS                             ;Закрыть сегмент данных
Ourstack SEGMENT Stack                ;Открыть сегмент стека
    DB 100h DUP (?)                  ;Отвести под стек 256 байт
Ourstack ENDS                         ;Закрыть сегмент стека
ASSUME CS:Code, DS:Data, SS:Ourstack  ;Назначить сегментные регистры
Code SEGMENT                          ;Открыть сегмент кодов
    Start: mov AX, Data              ;Инициализировать сегментный
           mov DS, AX                ;регистр DS
           xor AX, AX                ;Очистить регистр AX
           
           mov AL, D                 ;AL = 3
           mul C                     ;AX = C*D
           mov BX, AX                ;BX = C*D
           mov AL, 2                 ;AL = 2
           mul A                     ;AX = 2*A
            mov CX, AX                ;CX = 2*A
           mov DX, CX                ;DX = 2*A
           add DX, B                 ;DX = 2*A + B
           mov AX, BX                ;AX = C*D
           idiv DX                   ;Делим на (2А+В) (частное сохран. в AL)
           mov X, AX                 ;Сохранить результат в Х
 
           mov AX, 4C00h            ;Завершить программу
           int 21h                  ;с помощью DOS
Code ENDS                            ;закрыть сегмент кодов
    END Start                        ;Конец исходного модуля
При трассировке на команде idiv DX выдает ошибку деления на ноль.
Что не так в программе?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2015, 15:55
Ответы с готовыми решениями:

Ошибка "ntvdm cpu has encountered an illegal instruction"
Вот эта ошибка 16 bit ms-dos subsystem the ntvdm cpu has encountered an...

divide overflow. "заканал" уже.
Доброго времени суток! На каникулах решил заняться ассемблером :) вроде бы...

Есть строка. Нужно сделать так, чтобы "re" и "not" заменялись на "***".
Есть строка. Нужно сделать так, чтобы "re" и "not" заменялись на "***". Data...

Изъять слова, которые имеют префикс "re", "not", "be"
Заданы символьная строка. Слова и идентификаторы разделяются хотя бы одним...

Необходимо строку тип ""str1" "str2"",0 преобразовать в строку типа
Необходимо строку тип ""str1" "str2"",0 преобразовать в строку типа "str2",0...

3
Charles Kludge
Клюг
7645 / 3160 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
18.10.2015, 16:35 2
Цитата Сообщение от haseki Посмотреть сообщение
Что не так в программе?
DX используется командой idiv для хранения остатка, поэтому при делении на DX результат непредсказуем.
Идентификатор "C" является зарезервированным словом для многих трансляторов, поэтому переименовал в "C_".
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
;tasm/masm
.model  small
.data                          ;Открыть сегмент данных
    A DW 16h                        ;Инициализировать 
    B DW -50                        ;переменные A, B, C, D, X
    C_ DW 1Bh
    D DB 3
    X DW ?
.stack 
.code                             ;Открыть сегмент кодов
    Start: mov AX, @data              ;Инициализировать сегментный
           mov DS, AX                ;регистр DS
           xor AX, AX                ;Очистить регистр AX
           
           mov AL, D                 ;AL = 3
           mul C_                     ;AX = C*D
           mov BX, AX                ;BX = C*D
           mov AL, 2                 ;AL = 2
           mul A                     ;AX = 2*A
            mov CX, AX                ;CX = 2*A
           mov si, CX                ;si = 2*A
           add si, B                 ;si= 2*A + B
           mov AX, BX                ;AX = C*D
           idiv si                   ;Делим на (2А+В) (частное сохран. в AL)
           mov X, AX                 ;Сохранить результат в Х
 
           mov AX, 4C00h            ;Завершить программу
           int 21h                  ;с помощью DOS
    END Start                        ;Конец исходного модуля
1
haseki
3 / 3 / 1
Регистрация: 02.11.2013
Сообщений: 164
18.10.2015, 16:47  [ТС] 3
Charles Kludge, огромное спасибо, все понятно!
0
Mikl___
Автор FAQ
11975 / 6245 / 593
Регистрация: 11.11.2010
Сообщений: 11,303
20.10.2015, 03:47 4
Цитата Сообщение от haseki Посмотреть сообщение
idiv DX выдает ошибку деления на ноль
haseki,
ошибку деления на ноль вызовут также команды idiv ah/dx/edx/rdx и команды div ah/dx/edx/rdx
http://www.cyberforum.ru/assembler-articles/thread1005284.html http://www.cyberforum.ru/cgi-bin/latex.cgi?\to "Глава 10. АРИФМЕТИЧЕСКИЕ КОМАНДЫ" http://www.cyberforum.ru/cgi-bin/latex.cgi?\to"Команда DIV"/"Команда IDIV"
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2015, 03:47

Ошибка divide overflow
Как ни пытаюсь, никак не получается. masm model small .stack 100h .data...

Дана строка "ababab", из этого слова надо получить "aaa"
Собственно сабж. Дана строка "ababab", надо удалить буквы "b" и получить слово...

Заменить во вводимом тексте каждое слово "ЭВМ" словом "машина"
Здравствуйте. Поможете разобраться с ниже приведенной задачей: Заменить во...


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

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

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