c++ asm 类封装汇编的小实验(解决了)

软件和网站开发以及相关技术探讨
回复
jianyue
帖子: 57
注册时间: 2007-11-29 0:10

c++ asm 类封装汇编的小实验(解决了)

#1

帖子 jianyue » 2008-05-16 14:31

有哪位高手可以帮我看看
很少代码而已
加起来单词才一两百字,行数几十行而已
看看在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) 已下载 72 次
上次由 jianyue 在 2008-05-19 7:12,总共编辑 1 次。
头像
nobrain
帖子: 808
注册时间: 2005-08-25 13:58
来自: ustc
联系:

#2

帖子 nobrain » 2008-05-16 23:01

最后连接的时候不要直接用ld,用g++
g++会帮你做许多事情
爱喝真猪奶茶的夜鸣猪
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
联系:

#3

帖子 laborer » 2008-05-16 23:04

把汇编函数入口名称改为_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
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
联系:

#4

帖子 laborer » 2008-05-16 23:07

另外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
jianyue
帖子: 57
注册时间: 2007-11-29 0:10

#5

帖子 jianyue » 2008-05-17 10:44

谢谢!
回去试验一下!
追求IT的自由,追求人生自由!
jianyue
帖子: 57
注册时间: 2007-11-29 0:10

#6

帖子 jianyue » 2008-05-17 10:53

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的自由,追求人生自由!
jianyue
帖子: 57
注册时间: 2007-11-29 0:10

#7

帖子 jianyue » 2008-05-18 9:56

laborer 写了:把汇编函数入口名称改为_Z11bubble_sortPii

你运行nm implementation.o就知道应该用什么名字了。
谢谢你的知道,的确学到 东西,很有用。
但是如截图所示,如何解决??虽然我知道是找不到拉。但是如何写程序,以及应该如何编译才能弄到名字相同,
貌似我上文中写到extern "C" 的做法,没有用,得到截图所示:
附件
编译以后,链接的信息。
编译以后,链接的信息。
追求IT的自由,追求人生自由!
回复