当前位置:  技术问答>linux和unix

急啊!mingw gcc 3.4.5 下,在C语言main函数中,调用汇编程序中定义的函数始终出错!

    来源: 互联网  发布时间:2016-05-08

    本文导语:  小弟,用GCC 3.4.5定义了一个main函数,并在这个main函数中调用两个在汇编文件中定义的函数,但是始终给出以下错误信息(环境:windowsxp + eclipse + cdt + mingw) as -osrcfunction.o ..srcfunction.s ..srcfunction.s: Assembler messa...

小弟,用GCC 3.4.5定义了一个main函数,并在这个main函数中调用两个在汇编文件中定义的函数,但是始终给出以下错误信息(环境:windowsxp + eclipse + cdt + mingw)
as -osrcfunction.o ..srcfunction.s
..srcfunction.s: Assembler messages:
..srcfunction.s:0: Warning: end of file not at end of a line; newline inserted
..srcfunction.s:4: Error: bad or irreducible absolute expression
..srcfunction.s:4: Error: junk at end of line, first unrecognized character is `,'
..srcfunction.s:5: Error: bad or irreducible absolute expression
..srcfunction.s:5: Error: junk at end of line, first unrecognized character is `,'
..srcfunction.s:6: Warning: unexpected storage class 0
Build error occurred, build is stopped

main.c源代码:
#include 
#include 

extern void mywrite(int,char *,int );
extern int myadd(int ,int ,int *);

int main(){
char buf[1024];
int a,b,res;
char *mystr = "Calculating...n";
char * emsg = "Error in adding n";

a = 5;b = 10;
mywrite(1,mystr,strlen(mystr));
if(myadd(a,b,&res)){
sprintf(buf,"The result is %dn",res);
mywrite(1,buf,strlen(buf));
}else{
mywrite(1,emsg,strlen(emsg));
}

return 0;
}

function.s源代码:
SYSWRITE = 4
.global mywrite,myadd
.def
.type mywrite ,@function
.type myadd,@function
.endef
.text
mywrite:
pushl %ebp
movl %esp,%ebp
pushl %ebx
movl 8(%ebp),%ebx
movl 12(%ebp),%ecx
movl 16(%ebp),%edx
movl $SYSWRITE,%eax
int $0x80
popl %ebx
movl %ebp,%esp
popl %ebp
ret

myadd:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%eax
movl 12(%ebp),%edx
xorl %ecx,%ecx
addl %eax,%edx
jo 1f
movl 16(%ebp),%eax
movl %edx,(%eax)
incl %ecx
1: movl %ecx,%eax
movl %ebp,%esp
popl %ebp
ret

makefile源代码:
makefile:

all: CallAssembleFunction
clean:
    -rm main.o function.o CallAssembleFunction
function.o: function.s
            as –o function.o function.s
            as -v
        CallAssembleFunction: main.o  function.o
            gcc –o CallAssembleFunction main.o function.o
        main.o: main.c
            gcc –o main.o  main.c
 

|
7.95 .type
This directive is used to set the type of a symbol. 

COFF Version
For COFF targets, this directive is permitted only within .def/.endef pairs. It is used like this: 

     .type int

This records the integer int as the type attribute of a symbol table entry. 

ELF Version
For ELF targets, the .type directive is used like this: 

     .type name , type description

This sets the type of symbol name to be either a function symbol or an object symbol. There are five different syntaxes supported for the type description field, in order to provide compatibility with various other assemblers. The syntaxes supported are: 

       .type ,#function
       .type ,#object
     
       .type ,@function
       .type ,@object
     
       .type ,%function
       .type ,%object
     
       .type ,"function"
       .type ,"object"
     
       .type  STT_FUNCTION
       .type  STT_OBJECT

在windows下用mingw生成coff格式的文件,因此
.type mywrite ,@function 
.type myadd,@function 
这两行根本不需要,可以注释掉

此外,你要在C文件中调用S文件里的函数,.s文件中的mywrite和myadd必须改为_mywrite和_myadd,即加上下划线。

    
 
 

您可能感兴趣的文章:

  • minGW编译带fork函数的问题?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 国内哪里有mingw,http://www.mingw.org那里下不了mingw
  • 专门为MinGW所设计的IDE Visual Mingw
  • mingw+msys+mingw32ce make错误
  • MinGw 编译问题
  • 新手提问:刚下载了Mingw的部分packge,怎么安装呢?
  • Mingw Developer Studio
  • MinGW
  • 有人在LINUX下安装过mingw吗
  • backtrace-mingw
  • 在WIN系统下如何使用MINGW和GTK?
  • mingw中怎么加载动态链接库管理命令
  • MinGw编译gnutls
  • mingw编译DLL的问题
  • 跨平台编译环境 MinGw
  • 关于mingw和msys编译的问题?
  • 移动开发 iis7站长之家
  • eclipse cdt mingw 不能开发C语言
  • 在linux下用eclipes结合cdt的IDE是否还要mingw做编译器?
  • BCBX DEV-C++ MinGW
  • MinGW的MSYS DTK怎么找不到二进制安装文件?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3