Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2012, 14:25   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Использую только процессор. Нужно любыми путями получить как можно более точное значение величины, обратной введенной с клавиатуры. С одной стороны, если использовать таблицу в памяти, то все ок. Но интересней проиграть в точности, но реализовать без таблиц. Функция div дает 25089 при делении 200 на 102 (все десятичное). Почему так, откуда это? Диапазон значений, на которые можно делить: от 20 до 200 c шагом 2 ([20:2:200]). Может есть округление? Но точность немаловажна, хоть какая-то, то есть я не хочу лишней методической погрешности.

Скажите хоть, что с DIV происходит?

Последний раз редактировалось Stilet; 24.01.2012 в 09:03.
Krasi вне форума Ответить с цитированием
Старый 24.01.2012, 05:05   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

С div происходит ровно то, что и должно происходить. Как написали, так и происходит. Ошибка в 34-ой строке.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 24.01.2012, 07:53   #3
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Ну ок. Выкладываю код Само собой, можно проверить все подозрения, но я пока долго думаю. у меня любые числа от 0 до 255 при перемещении в bx должны быть в пределах регистра bl. Или нет?
...Посмотрел, все ок, но после деления регистр bx не изменяется, а в регистре ax оказывается 3232h. Это как?
Изображения
Тип файла: jpg Безымянныйdiv.jpg (48.1 Кб, 122 просмотров)

Последний раз редактировалось Krasi; 24.01.2012 в 08:00.
Krasi вне форума Ответить с цитированием
Старый 24.01.2012, 08:53   #4
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

А, ну так теперь конечно всё понятней стало. Ошибка здесь:
Безымянныйdiv.jpg

Вообще если вы хотите, чтобы вам нормально отвечали, учитесь уже нормально задавать вопросы. Процессор не работает с числами с плавающей точкой, он целочисленный. И команда div тоже целочисленная. Чтобы научить процессор делить числа и получать флоат, надо самому разработать весь этот функционал. А что вы сейчас делаете, совсем непонятно. Кстати, инструкция div никак не использует регистр ebx.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 24.01.2012, 09:11   #5
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Ну я пока понимаю так, что div делит содержимое ax на значение любого другого 8битного регистра. В ах помещается целая часть, а в bl - остаток. Так, вроде, написано здесь: http://osinavi.ru/asm/div.html. То есть я ожидаю деление с остатком.
Ну ладно, а как тогда преобразовать число для деления, или что сделать? Сопроцессор добавлять не могу. В крайнем случае можно сделать таблицу обратных чисел, но интереснее обойтись вычислением.
Krasi вне форума Ответить с цитированием
Старый 24.01.2012, 09:30   #6
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
Ну я пока понимаю так, что div делит содержимое ax на значение любого другого 8битного регистра. В ах помещается целая часть, а в bl - остаток.
Неправильно понимаете.

Цитата:
Usage: DIV src
Modifies flags: (AF,CF,OF,PF,SF,ZF undefined)
Unsigned binary division of accumulator by source. If the source
divisor is a byte value then AX is divided by "src" and the quotient
is placed in AL and the remainder in AH. If source operand is a word
value, then DX:AX is divided by "src" and the quotient is stored in AX
and the remainder in DX.

F6 /6 DIV r/m8 Unsigned divide AX by r/m8
F7 /6 DIV r/m16 Unsigned divide DX:AX by r/m16; AX
F7 /6 DIV r/m32 Unsigned divide EDX:EAX by r/m32 doubleword
Цитата:
Сопроцессор добавлять не могу.
А чего, не по фен-шую, что-ли? Ну тогда изучайте представление чисел в формате флоат. И дальше пишите свои функции деления.
А сейчас у вас полная каша. Вы путаете числа с плавающей точкой и целые числа. Ещё раз повторю, команда div целочисленная, и результатом от деления 250 на 102 будет 2, а остаток при этом будет равен 46. Но число 2,4509803921568627450980392156863 вы командой див напрямую никак не получите.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 24.01.2012, 09:53   #7
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Не совсем, но борьба противоположностей в программе уже есть. Минимальный режим, я ХОЧУ его, я буду страстно лудить ножку за ножкой в его объятьях. А почему на дисплее получается каша? 10000/210=47 и 130 остается. Почему при этом при делении 10000/200 все норм? И результат = 50.

Последний раз редактировалось Krasi; 24.01.2012 в 10:04.
Krasi вне форума Ответить с цитированием
Старый 24.01.2012, 10:05   #8
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
А почему на дисплее получается каша? 10000/210=47 и 130 остается.
А сколько должно оставаться?

Цитата:
В крайнем случае можно сделать таблицу обратных чисел, но интереснее обойтись вычислением.
Кстати, покажите ка эту таблицу. Очень мне интересно посмотреть на ваше видение "обратных чисел".
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 24.01.2012, 13:48   #9
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Цитата:
А сколько должно оставаться?
Столько и должно. Ну если бы оставалось, а у меня там десятки тысяч. То есть даже если я вывожу не тот регистр, в нем все равно умеренное число. Где я еще слаб?

Таблицу можно представить, например, так, если сопоставлять последний байт адреса или с f+1, или f:
f = [10:1:100] (в оригинале надо обратные числа от этих значений, но потом их надо разделить на два по задумке программы, поэтому я сразу пишу в RAM результат)

0500h:0000h 0000 0000 0000 0000 0000 0064 0053 0042 ;10:2:14
0500h:0010h 003E 0037 0032 ____ ____ ____ ____ ____ ;16:2:31
___________________________________ ______________
0500h:0320h 0000 0000 0000 0000 0000 005B 004C 0042 ;11:2:15
___________________________________ ______________

Физический адрес:
0500Ah соответствует f = 10, 0500Bh - тоже;
0500Ch соответствует f = 12, 0500Dh - тоже.
0500Ah + 50*16 = 0532A.
0532Bh соответствует f = 11, 0500Ch - тоже;
0532Dh соответствует f = 13, 0500Eh - тоже.

В моем случае не нужно работать с дробными значениями, я программирую таймер. Мне в любом случае нужно будет преобразовать это в мкс, хотя можно взять и большую разрядность, но я обхожусь пока этой и произвожу деление так: T = 1000/f = 1000/11 = 91 = 5Bh.

А есть хоть какое-нибудь вообще решение без обращения к памяти?

Последний раз редактировалось Krasi; 24.01.2012 в 13:56.
Krasi вне форума Ответить с цитированием
Старый 24.01.2012, 15:59   #10
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
Столько и должно. Ну если бы оставалось, а у меня там десятки тысяч. То есть даже если я вывожу не тот регистр, в нем все равно умеренное число. Где я еще слаб?
Всё там же. В 34-ой строке.

Цитата:
В моем случае не нужно работать с дробными значениями, я программирую таймер.
Если не нужно работать с дробными значениями, то зачем вы пытаетесь с ними работать? Да и название темы конечно намекает на то, что с дробными числами работать не надо.

f = [10:1:100] - это что такое, если конечно это не составляет такого же огромного секрета, как и ваша секретная программа.

P.S.
Вы либо совершенно не умеете формулировать свои мысли. Либо вы находитесь на недосягаемой для меня высоте знаний и я просто не понимаю о чём вы рассуждаете.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
возвести число x в степень y Imbire Паскаль, Turbo Pascal, PascalABC.NET 6 31.10.2011 09:40
Перевести из C++ в ASM 777user777 Фриланс 5 04.01.2011 00:01
Отрицательное число в дробную степень n4ela Общие вопросы C/C++ 7 31.10.2010 00:02
"Число в p-ичной системе счисления. Перевести число в q-ичную систему" и не только :) Zinder Паскаль, Turbo Pascal, PascalABC.NET 4 10.04.2010 14:20
Возвести в степень b некоторое число a Михаил70 Общие вопросы Delphi 3 09.09.2009 16:10