Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не могу понять в чём ошибка, ошибка# division by zero 
:(
    Опции темы
digitech
Дата 20.10.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 1.4.2007

Репутация: нет
Всего: 1



Не могу понять, что у меня здесь неправильно. Почему деление на ноль? Помогите разобраться. {Pascal пишет ошибку division by zero (деление на ноль)}

Код

; пример (a*c+b)/d  R=16
; ------------------------------------------------------------------
TITLE EX_2    ; заголовок\название программы
.MODEL LARGE  ; модель сегмента памяти
.DATA         ; сегмент данных
Extrn a:word, b:word, c:word, d:word, z:word   ; описание переменных
.code          ; сегмент кода
Public mega    ; директива описания общих имён
mega proc far       ; описание процедур
    mov ax,a
    mov cx,c
    mul cx
    mov bx,b
    add ax,bx
    mov dx,d
    div dx
    mov z,ax
ret                 ; возвращение в основную программу
mega endp           ; конец процедуры
end                 ; конец программы


! Этот код скомпилирован в *.obj и подключён в программу на паскале.

Это сообщение отредактировал(а) digitech - 21.10.2007, 00:09
PM MAIL   Вверх
ILyAHA
Дата 21.10.2007, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гламурный хакер
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 30.3.2007
Где: Ярославская обл. г.Рыбинск

Репутация: нет
Всего: 3



Есть такая чтука как отладчик. Попробуй им найти место где возьникает ошибка.
--------------------
<sсriрt>alert('xss')</sсriрt>
PM MAIL   Вверх
dumb
Дата 21.10.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



Цитата(ILyAHA @  21.10.2007,  11:50 Найти цитируемый пост)
Есть такая чтука как отладчик. Попробуй им найти место где возьникает ошибка.
тут и так очевидно, что деление на ноль происходит при делении:
Код
div dx
что означает, что d = 0
PM MAIL   Вверх
digitech
Дата 21.10.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 1.4.2007

Репутация: нет
Всего: 1



так откуда в dx берётся ноль, если значения 
a=5
b=10
c=2
d=2

Добавлено через 2 минуты и 10 секунд
Кстати, вот на всяк. случай код программы на паскале куда подкл. v17_2.obj
Код

program v17_2z;
uses crt;
{$L V17_2.obj}   {вкл. генерацию информации о локальных символах.}
 
{$F+}  {Задаем модель вызова, используемую для
последовательно компилируемых процедур}
var a,b,c,d,z: word;
procedure mega (var z:word); {вызов процедуры и присвоение
параметров переменной z}
external;  {(внешние) объявления позволяющие связывать друг с другом
компилируемые отдельно процедуры, написанные на ассемблере.}
 
begin
CLRSCR;
 
{ввод значений переменным}
Writeln('Введите a');
readln(a);
Writeln('Введите b');
readln(b);
Writeln('Введите c');
readln(c);
Writeln('Введите d');
readln(d);
{/ввод значений переменным}
 
z:=(a*c+b) div d;  {сам пример}
Writeln('Pascal ',z);   {вывод рез. реш. на паскале}
z:=0;                  {обнуляем переменную z}
mega(z);                {объявляем, что значением z будет реш. на asm}
Writeln('ASM    ',z);   {вывод результата реш. на asm}
READLN;              {пристанавливаем прог.}
end.
 
PM MAIL   Вверх
dumb
Дата 21.10.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



Цитата(digitech @  21.10.2007,  17:26 Найти цитируемый пост)
так откуда в dx берётся ноль
там не 0. у тебя получается не деление на 0, а переполнение при делении. при делении на 16-битный операнд делимым является пара регистров dx:ax(всего 32бита). в dx-старшее слово, в ax-младшее.
т.е. при d = 2, твой код выполняет такое деление: 2*65536+(5*2+10)/2. результат не умещается в 16-битный регистр и генерируется прерывание деления на 0.
Код

    xor dx,dx ; обнуляем старшее слово делимого
    mov сx,d
    div cx

PM MAIL   Вверх
digitech
Дата 21.10.2007, 20:16 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 1.4.2007

Репутация: нет
Всего: 1



Если можно, то маленькую поправочку внесу.
Не 
Код

xor dx,dx
, а 
Код

xor dh,dh

Именно таким способом у меня получилось, а то до этого тоже было division by zero.
А так, большое вам спасибо за подсказку, без этого бы задача моя осталась бы не решённой.

Только как теперь это объснить, потому что я задачку делаю с полным описанием. :-(

Это сообщение отредактировал(а) digitech - 21.10.2007, 20:36
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0456 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.