当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 7 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : c++ asm 类封装汇编的小实验(解决了)
帖子发表于 : 2008-05-16 14:31 

注册: 2007-11-29 0:10
帖子: 57
送出感谢: 0 次
接收感谢: 0 次
有哪位高手可以帮我看看
很少代码而已
加起来单词才一两百字,行数几十行而已
看看在linux上C++类如何封装汇编

主要是编译运行不会
文件结构应该没有大问题吧?

如果可以的话帮我写个makefile,或者教我如何编译运行,我那个写有错误
我是为了测试C++类封装汇编而写的,后面还要用面向对象的方法写个小型操作系统
麻烦帮帮忙
我的编译方法是nasm -f elf header.asm
g++ -c implementation.cpp -o implementation.o
g++ -c main.cpp main.o
ld main.o implementation.o header.o -o test
大概是这样的,我只会这样,但是不成功

的确使用nm查看每个文件所需要依赖的外部链接,然后参照这些需要的链接,将header.asm的几个标号(在外部链接来看是函数)改成同名就行,最后的生成继续用g++,不要用ld就行啦,但是不明白的是再.h声明的函数,它的外部链接名竟然跟函数名一样,编译器没有为它加上参数与重载信息,这样就很奇怪,我本来认为它会加上的,所以在.asm文件的标号名都添上"_","@8"等的信息,这就是链接出错的原因啦。姑且不管它为什么没有为函数添加编译信息,那是编译器的事情。


附件:
C++ asm project.rar [1.86 KiB]
被下载 50 次


最后由 jianyue 编辑于 2008-05-19 7:12,总共编辑了 1 次
页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2008-05-16 23:01 
头像

注册: 2005-08-25 13:58
帖子: 808
地址: ustc
送出感谢: 0 次
接收感谢: 0 次
最后连接的时候不要直接用ld,用g++
g++会帮你做许多事情


_________________
爱喝真猪奶茶的夜鸣猪


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2008-05-16 23:04 
头像

注册: 2005-10-25 11:15
帖子: 1016
送出感谢: 0 次
接收感谢: 1
把汇编函数入口名称改为_Z11bubble_sortPii

你运行nm implementation.o就知道应该用什么名字了。


_________________
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2008-05-16 23:07 
头像

注册: 2005-10-25 11:15
帖子: 1016
送出感谢: 0 次
接收感谢: 1
另外makefile的格式不完全对,有gcc那几行之前要有tab。


_________________
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2008-05-17 10:44 

注册: 2007-11-29 0:10
帖子: 57
送出感谢: 0 次
接收感谢: 0 次
谢谢!
回去试验一下!


_________________
追求IT的自由,追求人生自由!


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2008-05-17 10:53 

注册: 2007-11-29 0:10
帖子: 57
送出感谢: 0 次
接收感谢: 0 次
laborer 写道:
把汇编函数入口名称改为_Z11bubble_sortPii

你运行nm implementation.o就知道应该用什么名字了。


有点懂得拉。
在迅雷笔试题看到这道题:
.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?

  首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。

  通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数

  extern "C"是连接申明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的,来看看C++中对类似C的函数是怎样编译的:

  作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:

  void foo( int x, int y );

  该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。

  _foo_int_int 这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。


_________________
追求IT的自由,追求人生自由!


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2008-05-18 9:56 

注册: 2007-11-29 0:10
帖子: 57
送出感谢: 0 次
接收感谢: 0 次
laborer 写道:
把汇编函数入口名称改为_Z11bubble_sortPii

你运行nm implementation.o就知道应该用什么名字了。


谢谢你的知道,的确学到 东西,很有用。
但是如截图所示,如何解决??虽然我知道是找不到拉。但是如何写程序,以及应该如何编译才能弄到名字相同,
貌似我上文中写到extern "C" 的做法,没有用,得到截图所示:


附件:
文件注释: 编译以后,链接的信息。
nm.png
nm.png [ 22.18 KiB | 被浏览 589 次 ]



_________________
追求IT的自由,追求人生自由!
页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 7 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译