Поиск:

Ответ в темуСоздание новой темы Создание опроса
> интерфейс с языками высокого уровни, help! 
:(
    Опции темы
Zealot
Дата 9.3.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток, уважаемые программисты!
Я хочу задать вам вопрос, который вам, возможно, покажется тривиальным:

используя асм в языках высшего уровня (pascal, C++, etc.) у меня возникла проблема:

если есть процедура, например,
procedure MyProc(a, b, c, d: real); stdcall;
с параметрами типа real (8 байт, число с плавающей запятой) и мне нужно её вызвать из встроенного асма, то я пишу /например/:
asm
push 0.0
push 1.35
push 45.0
push 0.0
call MyProc
end
то возникает проблема: я передаю в стэк 16 байт, а процедура запрашивает 32! Далее классические виндовские ошибки в духе access violation и т. д.

если делаю так:

asm
push 0
push 0.0
push 0
push 1.35
push 0
push 45.0
push 0
push 0.0
call MyProc
end

то всё прекрасно, в стэке 32 байта. Вроде всё OK, но, ставлю бряки в теле процедуры, и вижу, что процедура приняла не те значения!

Подскажите пожалуста, как передать в стэк числа с плавающей запятой!

P. S.
и ещё, вопрос на засыпку:
как определить, какого типа данные в регистре? (byte, char, real, etc.)

заранее благодарю, Zealot
PM MAIL   Вверх
oleg1973
Дата 9.3.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


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

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



а может компилер просто не понимает что 45.0 есть число с точкой?
Цитата

как определить, какого типа данные в регистре? (byte, char, real, etc.)

никак )
все зависит от "интерпритации"
к примеру , AL=0х65
это может быть или просто число или символ ascii "A" )



--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
e-moe
Дата 14.3.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 3.8.2004
Где: Украина, Донецк

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



Ассемблер кодирует вещественные числа не так как Паскаль.
из-за этого может быть ошибка. В ВР/ТР real выглядит так:

Код

   4.3. Вещественные числа (числа с плавающей запятой). 
   На ПЭВМ имеется несколько типов  вещественных чисел, 
различающихся количеством разрядов, отведенных для ман-
тиссы и порядка числа. Мы будем рассматривать тип real.
   Тип real - это двоичное число, занимающее 6 байт па-
мяти.  Нумерация  разрядов   0, 1, 2, ... , 47.  Первые
пять байтов занимает мантисса числа, шестой  байт - так
называемая характеристика. Нулевой бит отведен для зна-
ка  числа  ("0" - "+", "1" - "-"). Отрицательные  числа
изображаются в прямом коде.
   Характеристика -  это  преобразованный  определенным
образом порядок числа.
   Порядок вещественного числа может быть положительным
и отрицательным. При использовании порядка  непосредст-
венно  для изображения числа  необходимо  отвести  один
разряд для обозначения знака  порядка. Тогда  для  цифр
самого порядка, размещаемого в одном байте, будет отве-
дено 7 разрядов. Поскольку порядок - это  целое  число,
то его отрицательные значения, как и для типа  integer,
будут представлены в дополнительном коде. В этом случае
диапазон изображения порядка составляет
                   - 128 .. 127.
   При таком способе изображения порядка в процессе об-
работки вещественных чисел нужно было бы  часто  произ-
водить преобразование порядка из прямого кода  в допол-
нительный и обратно, что требовало бы определенных  за-
трат машинного времени. Чтобы ускорить процесс обработ-
ки числа, делают смещение порядка  путем  добавления  к
его значению числа 128. Смещенный порядок, который  на-
зывают также характеристикой, это

     r = p + 1000 0000  = p + 80   = p + 128  .
                      2         16          10

   Характеристика всегда положительная  и изменяется  в
диапазоне  0 .. 255.

   Если   - 128 <= p < 0,   то    0 <= r <  128;
если               p = 0,   то         r =  128;
если          0 <  p <=127, то   128 < r <= 255.

   Максимальной характеристике  r = 255   соответствует
порядок  p = 127,  минимальной характеристике  r = 0  -
порядок  p = -128.  При  этом  получаем  соответственно
максимальное и минимальное значения вещественного  чис-
ла:
                      127          37
        Xmax  = 1 * 2     ў 1 * 10   ;
                      -128        -129         -38
        Xmin  = 0,1 * 2     = 1 * 2     ў 1 * 10   .

   В нормализованной  двоичной  мантиссе  первая  цифра
всегда равна единице. Для экономии памяти  эта  единица
не записывается, т.е. при размещении вещественного чис-
ла в памяти его мантисса изображается сдвинутой на один
разряд влево. При чтении вещественного числа  из памяти
в процессор эта единица восстанавливается.

   Пример.
                                        3
         687,25   = 2AF,4  = 0,2AF4 * 16  =
               10        16
                           12                       10
= 0, 0010 1010 1111 0100 *2  =  0,1010 1011 1101 * 2


   Здесь  порядок  p = 10, характеристика  r = 10 + 128 
 = A + 80   = 8A  .
         16     16

   Сдвинутая мантисса имеет вид

                   0,010 1011 1101

   Учитывая, что для мантиссы в формате real  отводится
пять байтов, получим
                     2B D0 00 00 00 8A .

   Для отрицательного числа достаточно записать единицу
в нулевой разряд, что эквивалентно добавлению  значения
8 к первой цифре положительного числа. Тогда  для числа
 - 687,25  будем иметь
                    AB D0 00 00 00 8A .



+ прочти статейку про Асм + паскаль на моем сайте
http://labinskiy.googlepages.com/
(рекомендую старую версию статьи)
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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