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

Ошибка "divide by zero" - Assembler

18.10.2015, 15:55. Просмотров 449. Ответов 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 выдает ошибку деления на ноль.
Что не так в программе?
http://www.cyberforum.ru/assembler-math/thread1193783.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2015, 15:55
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка "divide by zero" (Assembler):

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

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

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

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

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

3
Charles Kludge
Клюг
7641 / 3156 / 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
11369 / 5912 / 534
Регистрация: 11.11.2010
Сообщений: 10,933
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
Привет! Вот еще темы с решениями:

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

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

Ошибка при линковке: "LNK1561: entry point must be defined"
.386 .model flat .code start: mov eax,2 add eax,3 end start в консоли...

Ошибка компиляции "Erorr during creation C:\... /TINY 111112.obj"
TITLE EX_PROG PAGE ,132 STACK SEGMENT PARA STACK 'STACK' ...


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

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

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