混合c和组装。在终端没有打印

时间:2014-05-04 08:57:10

标签: c assembly compilation linker nasm

我在这里写的是一个简单的代码:

 printf.asm

 [EXTERN main]
 section .text
 global _start     
 _start:
       call main
       add esp, 8
       mov eax, 1
       xor ebx, ebx
       int 80h

和main.c

#include <stdio.h>

 int main()
 {
     char* str = "print from C :\\)";
     printf("%s", str);
 }

我编译代码如下:

nasm -g -f elf printf.asm -o printf.o

gcc -c -o main.o main.c

ld -o printf printf.o main.o -lc -I/lib/ld-linux.so.2

并运行:

./printf

在终端上没有打印。为什么?

当我使用以下命令ld -Ttext 0x1000 -o printf printf.o main.o -lc -I/lib/ld-linux.so.2进行链接时,它会显示&#34; Killed&#34;串。如何解决这个问题?

成功获得的代码只是在printf函数中添加了换行符:printf("%s\n", str);。谢谢大家,问题解决了。

3 个答案:

答案 0 :(得分:2)

您试图在没有首先执行C启动代码的情况下调用main()。你不应该这样做。基本上,C启动在跳转到main()之前初始化堆栈和变量存储。

您可以从main()调用汇编语言代码,因为这允许启动首先执行其操作。

答案 1 :(得分:1)

你正在编写_start你自己这是一个libc启动函数。这就是你无法正确链接代码的原因。否则你不应该触摸_start否则你将破坏libc。 要在main之前运行代码,您可以使用''属性((构造函数))''(它是gcc功能,并且在其他编译器中不可用)。

答案 2 :(得分:0)

NASM入口点的混合源以这种方式工作(在我的64位Linux上为32位):

<强> printf.asm:

global _start
extern main
extern fflush

section .text
 _start:
    call main

    push 0                      ; fflush (stdout)
    call fflush
    add esp, 4

    mov ebx,0                   ; exit code, 0=normal
    mov eax,1                   ; exit command to kernel
    int 0x80                    ; interrupt 80 hex, call kernel

<强>的main.c

#include <stdio.h>

extern int main (void)
{
    char* str = "print from C :\\)\n";
    printf("%s", str);
    return 0;
}

<强>构建

nasm -felf32 -oprintf.o printf.asm
gcc -c -m32 -omain.o main.c
ld -I/lib32/ld-linux.so.2 -lc -m elf_i386 -o printf printf.o main.o

我想你可以管理32位Linux的变化: - )