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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2009, 19:03   #1
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию cbrt(negative) FPU

Доработать программу считающую куб корень. Надо чтобы нормально работала при отрицательных числах.
пример cbrt(-8) = -2

в st(0) лежит ответ после вычисления cbrt(n)
идея такая. В процесссе вычислений постоянно работаем с модулем n, затем в конце загружается n и проверяется. Если оно отрицательное, то у ответа меняется знак. У меня вышло что-то такое, но не работает

Код:
...
; st(0) = cbrt(n)
     fld qword ptr [esp+4] 
     fldz
     fcom st(1)
     jb invert
     fxch st(2)
     ret

invert:
     fxch st(2)
     fchs
     ret

Последний раз редактировалось NiCola999; 03.12.2009 в 21:12.
NiCola999 вне форума Ответить с цитированием
Старый 03.12.2009, 21:31   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

нолик в стеке наверно мешает, а вообще как можно понять фразу ?
Цитата:
У меня вышло что-то такое, но не работает
кстати есть команда ftst - сравнивает st(0) с нулем.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 03.12.2009 в 21:36.
Goodwin98 вне форума Ответить с цитированием
Старый 03.12.2009, 22:00   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Цитата:
кстати есть команда ftst - сравнивает st(0) с нулем.
спасибо за команду

Код:
n3: .double 3

_cbrt:
	  fld1
          fld qword ptr n3
          fdivp

	  fld qword ptr [esp+4]
          fabs
	  fyl2x

	  fld st(0)

	  push eax
	  fstcw [esp]
	  or word ptr [esp], 0xc00
	  fldcw [esp]
	  pop eax

	  frndint  
	  fsubr st(0),st(1)
	  f2xm1
	  fld1
	  faddp
	  fscale
          fxch st(1)
  	  fstp st	  

          fld qword ptr [esp+4]
          ftst
          jb invert
          fxch st(1)
  	  ret  

invert:         
         fxch st(1)
         fchs
         ret
Не переходит в invert

Последний раз редактировалось NiCola999; 03.12.2009 в 22:09.
NiCola999 вне форума Ответить с цитированием
Старый 03.12.2009, 22:12   #4
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

А где у вас тут сохраняется исходное число или хотя бы его знак ?
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 03.12.2009, 22:22   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

не знаю как сохранить знак, просто в конце вычислений cbrt(n) загружаю аргумент функции n и смотрю отрицательное оно или нет, если да, то меняю знак у cbrt(n)
NiCola999 вне форума Ответить с цитированием
Старый 03.12.2009, 22:43   #6
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Я малость ошибся насчет ftst... но попробуйте так сравнивать
Код:
	ftst
	fnstsw ax
	and ah,41h
	jnz invert
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 03.12.2009, 23:14   #7
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

работает, спасибо. А что ты сделал? Загрузил в ax слово состояния и при каком-то значении флагов and дает 0
Код:
SW 0000000001000001
                        1000001
10 бит проверка какого-то условия, а вот 15 не совсем понял
NiCola999 вне форума Ответить с цитированием
Старый 03.12.2009, 23:28   #8
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Цитата:
Сообщение от http://pblog.ru/?p=241
Слово состояния SW отражает общее состояние устройства FPU. Регистр слова состояния FPU, по сути, является аналогом регистра флагов центрального процессора.
..............
• СО - СЗ (биты 8, 9, 10, 14) - являются битами кода условия, отмечают результаты команд сравнения, проверки и анализа. Основное назначение этих бит - определение условий перехода. Они похожи на арифметические флаги в регистре EFLAGS. Командой FSTSW АХ их значения можно занести в регистр АХ, а командой SAMF скопировать их из регистра АХ в биты флагов EFLAGS в следующем порядке: СО ->CF, С2 -> PF, СЗ ZF.
Т.е. тут проверяются как бы CF и ZF.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 03.12.2009, 23:30   #9
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

ясно, спасибо
NiCola999 вне форума Ответить с цитированием
Старый 04.12.2009, 08:16   #10
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

с какой радости такой переход будет работать
Код:
         ftst
          jb invert
у сопроцессора свои флаги
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
e^x в FPU NiCola999 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 19 21.11.2009 23:16
работа с FPU NiCola999 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 14 04.11.2009 00:01