如何在x86汇编程序中执行C程序?

时间:2014-03-19 21:54:26

标签: c assembly operating-system

我是这个装配场景的新手,我正在阅读有关创建简单操作系统的教程:http://mikeos.berlios.de/write-your-own-os.html因为我真的不想图out assembly是一种在汇编代码中间可以执行C代码的方法。

如果你可以请一步一步说明如何执行这项工作,因为我是初学者。如果有帮助的话,我正在运行Ubuntu 13.10。

编辑

我认为不清楚。我想要做的是在汇编程序的中间,它停止执行汇编命令,而是开始运行一个C文件,其中包含我想在我的操作系统上使用的实际代码,例如scanf和printf函数。

我遇到了一些麻烦。如果你能提供一个指向教程的链接,那就是让我有一个hello world操作系统。我可以从那里编辑C代码,并在我的路上,谢谢!

1 个答案:

答案 0 :(得分:1)

好的,一步一步的说明,它们可以在任何平台上运行,这很好,因为你没有指定你所使用的平台:

1)获取C编译器,在本例中我将使用gcc。

2)编写一个调用你要调用的函数的c函数:

  #include <stdio.h>
   void somefunc (void)
   {
       int i = 0;

       printf("%d\n", i);
   }

3)用gcc -S编译。请注意,如果您不喜欢语法,则可以使用gcc -S masm = intel。如果没有这个,你最终会得到at&amp; t语法,如下所示。

4)这会输出与源文件同名的汇编代码,扩展名为.s,在这种情况下,使用32位mingw:

    .file   "call_func.c"
    .section .rdata,"dr"
LC0:
    .ascii "%d\12\0"
    .text
    .globl  _somefunc
    .def    _somefunc;  .scl    2;  .type   32; .endef
_somefunc:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $40, %esp
    movl    $0, -12(%ebp)
    movl    -12(%ebp), %eax
    movl    %eax, 4(%esp)
    movl    $LC0, (%esp)
    call    _printf
    leave
    ret
    .def    _printf;    .scl    2;  .type   32; .endef

5)看看编译器做了什么,并在汇编代码中做同样的事情。在这种情况下,printf的参数按从右到左的顺序被压入堆栈,因为它在Windows上使用stdcall。另请注意,c函数以下划线开头,这是典型的。

6)到达你不想再这样做的地步,然后查找你的平台的调用约定,然后你就会知道如何去做。假设您使用的是x86或amd64,合理的起点是the wikipedia page on x86 calling conventions