gcc汇编和汇编

问题描述:

我想用gcc创建一个可执行文件。我有两个文件virtualstack.c(由下面的C代码组成)和stack.s,它由用AT & T语法编写的intel x86汇编代码(见C代码下面)组成。我的命令行命令是gcc -c virtualstack.c -s stack.s,但我得到两个错误(stack.s中的第3行) - missing symbol name in directiveno such instruction _stack_create。我以为我已经正确地声明了C语言中的函数,前缀为下划线(_)。我会非常感谢任何意见。gcc汇编和汇编

C代码:

#include <stdio.h> 
#include <stdlib.h> 

extern void stack_create(void); 

int main(void) 
{ 
stack_create(); 

return 0; 
} 

汇编代码:

.global _stack_create 
    .type, @function 

_stack_create 
pushl %ebp 
movl $5, %esp 
movl %esp, ebp 
movl $21, %edx 
pushl %edx 
+1

第二个'_stack_create'后面需要冒号。我不知道'.type'是否正确,但不需要。顺便说一句,把5移到'esp'就是在问问题。 – 2013-02-10 11:31:06

+0

@alexey frunze。谢谢你:)现在我对结肠感到愚蠢。我应该看到那一个。没有.type编译。我仍然需要看看它是否可执行。也感谢esp警告。 – stian 2013-02-10 11:45:02

+0

好。我删除了.type,@function。我发现gcc创建独立的对象文件。我试着写gcc -o vs virtualstack.c -s stack.s。我相信应该创建一个vsout文件(可执行文件)。然后我得到未定义的参考在main()中的stack_create - 有什么想法为什么? – stian 2013-02-10 12:05:05

我将试图解释你的方法如何调查此类案件。

1)编译器为你工作总是个好主意。所以,让我们开始与代码(可以称之为assemble.c):

#include <stdio.h> 
    #include <stdlib.h> 

    /* stub stuff */ 
    void __attribute__ ((noinline)) 
    stack_create(void) { } 

    int 
    main(void) 
    { 
     stack_create(); 
     return 0; 
    } 

现在编译它gcc -S -g0 assemble.c成汇编。 stack_create功能组装到(您的结果可能会有所不同,所以请自行按照我的指示):

.text 
    .globl stack_create 
    .type stack_create, @function 
stack_create: 
    pushq %rbp 
    movq %rsp, %rbp 
    popq %rbp 
    ret 
    .size stack_create, .-stack_create 

2)现在,所有你需要的是利用这个模板,并与你的东西填满它:

.text 
    .globl stack_create 
    .type stack_create, @function 
stack_create: 
    pushq %rbp 
    movq %rsp, %rbp 

    ;; Go and put your favorite stuff here! 
    pushl %ebp 
    movl $5, %esp 
    movl %esp, ebp 
    movl $21, %edx 
    pushl %edx 
    ... etc ... 

    popq %rbp 
    ret 
    .size stack_create, .-stack_create 

并且当然可以将它分开.s文件,比如stack.s。

3)现在让我们一起编译。从assemble.c中删除存根的东西,并编译一切为:

gcc assemble.c stack.s 

我没有错误。我相信你也不会有任何错误。

主要教训:千万不要尝试在汇编程序中编写像段,函数标签等细节。编译器会更好地知道如何去做。改用他的知识。