![]() |
|
|
![]()
|
|
| Molkov Alexandr |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 3.6.2003 Репутация: нет Всего: нет |
Приветствую знатоков!
Может быть у меня вопрос не в топик но дело в том, что я выполняю лабораторную работу на ассемблере с использованием вставки ассемблерного кода в функцию(процедуру) языка Turbo Pascal. В процедуру передаются параметры байты и переменная-результат, которая должна содержать итоги вычислений получается вещественного типа. Пример: Procedure Do_ASM_Reshenie(a,b,c,i:byte; var Rez:Double);Assembler; В теле ассемблерной вставки идут вычисления, в которых происходит умножение, сложение и, что самое главное деление! В результате получается вещественное число, в челой части которого может содержаться максимальное значение, равное 652800 в десятичном формате. Поэтому я решил выделить под результат тип Double. Так вот, проблема в том что я не могу вернуть в тело программы паскаля вещественное значение, т.е. присвоить языком ассемблера результат переменной Rez. Помогите, пожайлуста, кто чем сможет, жду советов! |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Вернуть double можно через @Result:
Но зачем тебе double, когда можно и long ? ;) -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| Molkov Alexandr |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 3.6.2003 Репутация: нет Всего: нет |
Прошу прощения!
Я забыл сказать, что это выполняется на ассемблере под процессор 80186, под DOS. Т.е. я хочу сказать, что никаких макрокоманд использовать нельзя, всё нужно делать простыми командами(mov,add,div). Сам я специально ассемблер не изучал, просто немного самостоятельно поковырял, команды и операторы запомнил и вот вояю! А о приведённых выше командах fild и fstp я ничего не знаю. PS: А разве в Паскале сущестует тип Long (к тому же вещественный)? Насколько я знаю в Паскале есть только LongInt(Long Integer - Длинное ЦЕЛОЕ)! Это сообщение отредактировал(а) Molkov Alexandr - 4.6.2003, 11:18 |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Написал две подпрограммы - как раз для случая без сопроцессора. fild и fstp -- это команды сопроцессора (смотри ключ $N+). Но в твоем случае все же лучше юзать long. real у Паскаля без сопроцессора - 6 байт:
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| Molkov Alexandr |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 3.6.2003 Репутация: нет Всего: нет |
OK! Большое спасибо!
И ещё один вопросик в догонку: В книжке Питера Абеля вычитал пример о том как нужно складывать двойные слова(т.е. сначало младшие слова операндов, а потом старшие с учётом переноса). В моей программе вычисления идут подобным образом и в результате у меня получается в AX-старшее слово целой части результата, в DX-младшее слово целой части результата, а в BX - остаток от деления(либо всё это в стеке). Так вот я, по своей наивности, думал, что последовательно их закину в переменную и всё будет хорошо. А в жизни всё оказывается гораздо сложнее Может быть есть какой-нибудь совет в этом направлении? |
|||
|
||||
| Chingachguk |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Разумеется, формат чисел real(double, float..etc) - чисел с плавающей точкой - отличается от формата целых чисел. Если целое число представляется как разложение числа по степеням двойки (для word степени от 0-ой до 15-ой, например), то вещественные числа представляются иначе: в общем случае они состоят из трех частей: знака (как правило - старший бит числа), экспоненты (для настоящих real-чисел из 4-х байт - смотри сопроцессор Intel - это один байт) и мантиссы. Грубо говоря, число в вещественном формате записывется также разложением по степеням двойки (коэффициенты и есть мантисса), но со степени, равной экспоненте:
Число=(-1)^(Знаковый_Бит) x ( 2^(Экспонента) x (Старший_Бит_Мантиссы) + 2^(Экспонента-1) x (Следующий_Бит_Мантиссы) + ... ) Для real-чисел экспонента вроде бы равна ((Биты 30..23) - 127). Вообще об этом можно почитать у Зубкова С.В. в его книге по ассемблеру. Я недавно ее находил в интерненте. Очень полезная книга ;) Все эти проблемы совершенно отсутствуют при программировании сопроцессора (на ассемблере):
Т.е. я не вижу деталей формата и все работает ;) Это сообщение отредактировал(а) Chingachguk - 5.6.2003, 09:18 -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
| Molkov Alexandr |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 3.6.2003 Репутация: нет Всего: нет |
А как можно к вещественному числу прибавить байт без использования команд сопроцессора?
Т.е. , например, A=0,5 и нужно А=А+AL? |
|||
|
||||
| Chingachguk |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Для этого нужно разобраться в формате вещественных чисел, причем именно в том формате, который использует Паскаль. Посмотрим, что за машинный код сгенерит он, если мы напишем простую программу:
Скомпиллируем ее на диск (COMPILE->Destination Memory->Destination Disk), посмотрим исполнимый код (td.exe test.exe):
Ну а что делает подпрограмма сложения (6791:078A) ? Зайдем в нее:
Вызывается еще одна подпрограмма. Зайдем и в нее:
Немного сложновато, ты не находишь ? ;) Варианты: - Сделай лучше сам; - Позови подпрограмму Паскаля для сложения; - Используй целые числа в программе - нафига тебе real -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||||
|
|||||||||
| Molkov Alexandr |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 3.6.2003 Репутация: нет Всего: нет |
Ну и ну!
Вызвать подпрограмму Паскаля я не могу, т.к. по условию задачи нужно в программе реализовать вычисления в двух процедурах(функциях): одна на Паскале, другая на Ассемблере, и, в результате, сравнив ответы этих процедур дать себе оценку(если результаты равны - значит молодец и всё правильно сделал, а если нет - иди изучай Ассемблер). Вот я пока и изучаю! Насчёт использования челых чисел в программе: по условию нужно просчитать сумму ((a+1/b)*c*i) для i от 1 до 4, где a,b,c,i определить как переменные типа байт, а результат - исходя из задания. (см. мой аватар) В связи с тем, что в условии используется деление(1/b), то соответственно результат не может быть целым числом! Это сообщение отредактировал(а) Molkov Alexandr - 6.6.2003, 10:04 |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
1. Если ты делаешь вычисление 1/b, говоришь при этом, что сопроцессор использовать нельзя, то как ты это делаешь ? Через целочисленное деление ? ( div или idiv ) Если так, то через одну операцию деления тебе не получить вещественное число, ибо целочисленное деление возвращает в одном регистре (ax,al...) целое от деления, а в другом - остаток, те:
Делим 27 на 5: mov ax,27 mov bl,5 div bl В результате al=5, ah=2. А не 27/5=5.4 2. Если ты все же делаешь деление вручную, т.е. например реализуя что-то вроде алгоритма деления в столбик, т.е.:
то тебе придется точно также для того, чтобы вернуть результат в виде вещественного real, разобраться в нем. Это не так уж и сложно: посмотри, что я писал про мантиссу и экспоненту. Ведь это всего лишь разложение по степеням двойки. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
![]()
|
| Правила форума "Asm: Общие вопросы" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |