阅读:2811回复:26
wxl_50685330,帮忙!
我用的是evc4.0,想在c中嵌入汇编,但是在__asm{}中使用寄存器r0到r15时,编译出错,说是没有声明这些寄存器,还有arm汇编指令它也不能识别,这是怎么回事呀?
wxl_50685330,帮帮我呀!拜托了! |
|
论坛版主
|
沙发#
发布于:2004-08-12 14:05
靠阿,真的不行啊:),原来我试过x86(编译时选择编译的指令,在build的configurations里面选)可以内嵌,今天我又试了试,mips,sh都可以,就是arm不行,是没做还是免费的他不给啊...
算了,兄弟,不行就没办法了:(,不内嵌可以不?用汇编写成一个函数,在要内嵌的地方调用,这样可以不?没办法:)我也只有这个办法了。哪位兄弟还有更好的??? |
|
板凳#
发布于:2004-08-12 20:47
wxl_50685330,我不会在在evc4.0中写汇编程序,听说很麻烦,要自己写头文件什么的,而且要写成宏的形式!唉,我上网找了好久了,都没有这方面的程序例子!:(自己不会写呀,evc开发包中也没有例程!:(
哇哇哇哇,这怎么办呀? |
|
论坛版主
|
地板#
发布于:2004-08-13 12:54
挺住,革命道路总是有起伏的喔,哈哈
这样,我给你一个arm汇编的框架,在这个框架中的头文件都是ce带的,你可以用pb带的armasm来编译,生成obj文件(也可以使用build来编译,最后都使用的armasm,这个compiler在$(_winceroot)\\SDK\\BIN\\I386下面)。你可以输出一些函数,然后在你的c代码中调用,这样可以代替内嵌汇编的功能,good luck! 其中的kxarm.h定义了使用的宏,在ce的$(_winceroot)\\PUBLIC\\COMMON\\SDK\\INC里面。 |
|
地下室#
发布于:2004-08-13 20:49
谢谢wxl_50685330!我明天去试试!:)
怎么给你加分呀?^!^ |
|
5楼#
发布于:2004-08-14 08:02
我没有装wince呀!!:(
|
|
6楼#
发布于:2004-08-14 16:34
wxl_50685330,我在你给我的文件中编写了一个加法函数,并用armasm编译得到add.o,我将add.o加入到evc4.0中的一个工程中,但是编译就出错了呀!
错误如下: tasm.obj : error LNK2019: unresolved external symbol "int __cdecl ADD(void)" (?ADD@@YAHXZ) referenced in function "long __cdecl WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YAJPAUHWND__@@IIJ@Z) emulatorDbg/tasm.exe : fatal error LNK1120: 1 unresolved externals |
|
论坛版主
|
7楼#
发布于:2004-08-16 12:41
你试试在你用这个函数的文件中申明extern func(),记得用include .obj,再试试 good luck
|
|
8楼#
发布于:2004-08-16 22:02
wxl_50685330,我用armasm编译得到的是*.o文件呀不是obj的!!:)
|
|
论坛版主
|
9楼#
发布于:2004-08-20 13:03
:)这两天有事,不知道你解决没?应该不会啊,build应该是调用armasm来汇编的,你能安wince .net 4.2吗?如果有用build可以编译出目标文件,你看看armasm的参数能不能调整输出文件格式
|
|
10楼#
发布于:2004-08-20 21:09
wxl_50685330,加上include也不行,编译的时候说这个文件是二进制的,是未确定的!!:(
我们头也不知道问谁了,他对我说,要在操作系统源码中嵌入汇编才行呀!! |
|
论坛版主
|
11楼#
发布于:2004-08-23 13:21
......等等,我想想:)
你们头说一定要嵌汇编?对于这个要求你建议他如果实在不行还是用汇编写函数,在需要调用的时候使用函数,这样效果和内嵌汇编是一样的,最多多了函数调用开销,如果这段代码不是非常敏感的话关系不大。如果调用频率太高以致函数调用开销显著的话,再想其他办法,比如找支持内嵌ARM汇编的编译器。 对于连接我可能说错了一点,用include xx.obj可能不对(不好意思),这样,你在工程里边加入这个obj文件,再build |
|
12楼#
发布于:2004-08-23 22:14
呵呵,你说的这种方法,我试过了,还是编译不通!:)
|
|
13楼#
发布于:2004-08-23 22:16
呵呵,我们头现在没有时间考虑这件事情了,现在又忙别的了,前几天还在催我,现在又不催了,又让我做别的东东了,说等到想到解决的方法再做!!!
|
|
论坛版主
|
14楼#
发布于:2004-08-24 12:59
好吧,等下次遇到这个问题我再看看怎么办,兄弟如果解决了也告诉大家一声,good luck
|
|
论坛版主
|
15楼#
发布于:2004-08-24 17:01
刚试验完,可以了,在project里选setting,切换到link后把xxx.obj加到object/library modules,然后在引用汇编函数的c文件里面用
extern "C" { extern function(); } 声明就可以用了 |
|
16楼#
发布于:2004-08-31 10:42
wxl_50685330,我按照你说的做了,但是还是不行呀! :(
|
|
17楼#
发布于:2004-08-31 10:44
wxl_50685330,是不是我编译得到的obj文件不对呀?给我一个正确的obj文件试试吧!:)
|
|
论坛版主
|
18楼#
发布于:2004-08-31 13:03
哇,还没弄好啊:),努力努力!
把obj文件放到c:\下(当然可在其他地方,但目录名字不要有空格),然后再evc里面选project->add to project->files,选中这个Obj文件,然后在你要引用的程序里面写: extern "C" { extern DWORD ReadMemRegBy32Bits(DWORD volatile* Addr); } 然后可以直接引用如下: DWORD data; data = ReadMemRegBy32Bits((volatile unsigned long *)0xa0022000); 这只是我测试的例子,你试好了自己改函数吧 |
|
19楼#
发布于:2004-08-31 21:44
呵呵,俺明天去试试看!!^!^
|
|
上一页
下一页