Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在x86汇编程序中执行C程序?_C_Assembly_Operating System - Fatal编程技术网

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

如何在x86汇编程序中执行C程序?,c,assembly,operating-system,C,Assembly,Operating System,我不熟悉这个组装场景,我正在阅读一篇关于创建简单操作系统的教程:http://mikeos.berlios.de/write-your-own-os.html 因为我真的不想知道程序集,所以有一种方法,在汇编代码的中间,它可以执行C代码。 如果你能给我一步一步的指导,说明如何执行,因为我是初学者。我正在运行Ubuntu13.10,如果这有帮助的话 编辑 我很抱歉说得不清楚。我想做的是在一个汇编程序的中间,因为它停止执行程序集命令,而是开始运行一个C文件,它有我想在我的操作系统上使用的实际代码,比

我不熟悉这个组装场景,我正在阅读一篇关于创建简单操作系统的教程:http://mikeos.berlios.de/write-your-own-os.html 因为我真的不想知道程序集,所以有一种方法,在汇编代码的中间,它可以执行C代码。 如果你能给我一步一步的指导,说明如何执行,因为我是初学者。我正在运行Ubuntu13.10,如果这有帮助的话

编辑 我很抱歉说得不清楚。我想做的是在一个汇编程序的中间,因为它停止执行程序集命令,而是开始运行一个C文件,它有我想在我的操作系统上使用的实际代码,比如SCANF和Primtf函数。
我遇到了一些麻烦。如果你能提供一个链接到一个教程,让我知道我有一个hello world操作系统。我可以编辑C代码从那里,我的方式,谢谢

好的,一步一步的说明,它们适用于任何平台,这很好,因为您没有指定您所在的平台:

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

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

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

       printf("%d\n", i);
   }
5) 看看编译器做了什么,在汇编代码中做同样的事情。在本例中,printf的参数按从右到左的顺序推送到堆栈上,因为它在Windows上使用stdcall。还要注意,c函数以下划线开头,这是典型的


6) 到了你不想再这样做的地步,然后查找你平台的调用约定,然后你就会知道怎么做了。假设您使用的是x86或amd64,一个合理的起点是。

是否要调用完全不同的程序?或者只是一些用C实现的函数,但在您当前的程序中?没有任何东西可以执行C代码,它在运行之前被编译成汇编。您是否试图从C代码中获取程序集?您忽略了一个要点:如果您正在编写操作系统,您可以用C编写(大部分),但不能依赖“正常”标准库:
printf
scanf
工作需要操作系统实际执行IO,因此,如果没有操作系统执行此任务,则无法使用它们。许多其他C库函数也是如此。
    .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