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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2012, 21:55   #1
GridView
Новичок
Джуниор
 
Регистрация: 16.12.2012
Сообщений: 4
По умолчанию VS2010 + asembler(вычисление гиперб. арктангенса)

Всем доброго времени суток. Сам с ассемблер не работаю так как нет надобности (пишу под .Net, в частности C#).
Знакомая попросила помочь с написанием лабы по асму.
Задача: Вызывать из C++, asm метод(функцию) в которой описать логику вычисления гиперболического арктангенса.
За пару часов дошел до следующего
1) подключил asm файл к консольному проекту на C++
2) описал логику вычисления в asm файле
Код:
.MODEL small  

.Data    

  	extrn _result:dword  
  	dnum   dd 0  
	dinc   dd 0  
	ddiv   dd 0  
	dln   dd 0  
.CODE    

        public  _hsin  

_hsin proc  

        push bp   	 
	mov  bp,sp	 			

        ;определение знака числа и его сохранение в переменной========
	finit           	;инициализация стеков
	fld    dword ptr[bp+4]	;помещаем src в st(0)
	fst    ds:dnum		;копируем его в переменную dnum
	fld1			;помещаем 1 в ST(0), сдвигая предыдущее в st(1)
	fadd   st(0),st(1)    ;прибавить 1 к числу
	fst    ds:dinc
	;==============================================================
	finit			;инициализация стеков
	fld    ds:dnum		;помещаем (dnum) исходное число в st(0)
	fld1			;помещаем 1 в ST(0), сдвигая предыдущее в st(1)
	fsub   st(0),st(1)		;вычитаем из 1 исходное число
	fst    ds:ddiv
	;call   exponentK	;вычисляем e(x)
	;fst    dexpx		;сохраняем e(x) в переменной dexpx
	;==============================================================
	finit			;инициализация стеков
	fld     ds:dinc		;помещаем (dinc) исходное число в st(0)
	fld     ds:ddiv		;помещаем (ddiv) исходное число в st(0) => ddiv = st(0) dinc = st(1)
	fdiv    st(1),st(0) ;делим st(1) на st(0), рез-т в st(1)
	fxch    st(1)       ;меняем местами st(0) и st(1)
	FLD1				;помещаем 1 в ST(0), сдвигая предыдущее в st(1)
	FLD     st(1)       ;нужный рез-тат в st(0)
	FYL2X				;Проц вычисляет логарифм по основанию 2.
	fxch    st(1)       ;меняем местами st(0) и st(1)
	FLDLN2				;Затем нужно полученное значение умножить на натуральный логарифм от 2. 
	FMUL	st(1), st(0);И получим натуральный логарифм от исходного числа.
	fst    ds:dln
	;=============================================================	
	finit			    ;инициализация стеков
	FLD1      
	FLD1
	fadd  st(1), st(0)
	fld     ds:ddiv
	fxch  st(1)
	fdiv  st(1), st(0)  
	fxch  st(1)
	fst     ds:_result		;копируем рез-т из st(0) в перемен. result
	mov  	sp,bp	
        pop 	bp
        ret 
_hsin endp

end
при попытке компилирования с++ проекта получаю ошибку
"error LNK1190: invalid fixup found, type 0x0001"

В проекте возвращаемый параметр _result принимается как float.
Код:
extern "C" float hsin(float,float);   
extern "C" float _result;
С помощью гугла понял что ошибка далеко не специфична и может иметь n-ое количество самых разных причин.
Помогите пожалуйста найти решение?

ЗЫ: система 32-битная
GridView вне форума Ответить с цитированием
Старый 17.12.2012, 00:17   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

кстати, гугл говорит, что это от того, что кто-то пользуется 32-битным компиляторм на 16-битном коде.

все что нужно сделать это поднять эту мурзилку с 16-бит до 32-бит.

Последний раз редактировалось f.hump; 17.12.2012 в 00:22.
f.hump вне форума Ответить с цитированием
Старый 17.12.2012, 00:21   #3
GridView
Новичок
Джуниор
 
Регистрация: 16.12.2012
Сообщений: 4
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
кстати, гугл говорит, что это от того, что кто-то пользуется 32-битным компиляторм на 16-битном коде.
Да есть такой вариант причины. А не ткнете чем различается 16-битном коде и 32 битный код, типы данных наверное везде одинаковы? Спасибо
GridView вне форума Ответить с цитированием
Старый 17.12.2012, 00:29   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

модель - flat
ко всем регистрам приставку е. (bp -> ebp)


я особо не вникал, но тут явное злоупотребление finit.
f.hump вне форума Ответить с цитированием
Старый 17.12.2012, 07:16   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

GridView
и еще поменяй .MODEL small на .MODEL flat, stdcall а перед строкой .MODEL flat, stdcall поставь .386
Mikl___ вне форума Ответить с цитированием
Старый 17.12.2012, 19:23   #6
GridView
Новичок
Джуниор
 
Регистрация: 16.12.2012
Сообщений: 4
По умолчанию

спасибо это вроде помогло, но
Код:
Error	1	error LNK2019: unresolved external symbol __hsin  
Error	2	error LNK2001: unresolved external symbol _result	 
Error	3	error LNK2019: unresolved external symbol __result referenced in function __hsin@0
говорят что надо подключить lib-ы, но я бы понял если б то были параметры внешних библиотек, а тут внутренние объявленный в *.asm и *.cpp параметры или их надо как то слинковать по особенному?
Спасибо.
GridView вне форума Ответить с цитированием
Старый 18.12.2012, 17:04   #7
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

имена .asm и .cpp одинаковые? если да, то надо либо в настойках masm подкорректировать имя obj файла для output. либо разные имена дать .asm и .cpp, чтобы cpp.obj не делал override asm.obj.

кстати, где _result определен?
f.hump вне форума Ответить с цитированием
Старый 18.12.2012, 21:57   #8
GridView
Новичок
Джуниор
 
Регистрация: 16.12.2012
Сообщений: 4
По умолчанию

Имена разные.
Result определен тут(asm):
Код:
extrn _result:dword
И тут(cpp):
Код:
extern "C" float hsin(float,float);   
extern "C" float result;
GridView вне форума Ответить с цитированием
Старый 20.12.2012, 16:08   #9
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Код:
extrn _result:dword
это декларация внешнего имени, для определения нужно выбросить extern либо в asm либо в сpp. stdcall в модели, означает что ко всем именам с публичной видимостью будет добавлена приставка _. так что тут два варианта либо убрать public в декларациях, либо убрать _ в именах, я так думаю.

Код:
extern "C" float result;

____________


public result
.Data    

  	result dword 0  
  	dnum   dd 0  
	dinc   dd 0  
	ddiv   dd 0  
	dln   dd 0  
.CODE    

; public  _hsin  

_hsin proc

Последний раз редактировалось f.hump; 20.12.2012 в 16:14.
f.hump вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
asembler денис николюк Помощь студентам 1 18.12.2010 16:12
Вычисление арктангенса через ряд Тейлора. С++. chibbis Помощь студентам 1 23.12.2009 11:48
вывод на печать asembler udjal Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 10.11.2007 14:32