c - 如何从 x86 汇编程序中执行 C 程序?

标签 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)获取一个 C 编译器,在本例中我将使用 gcc。

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

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

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

3) 使用 gcc -S 编译。注意,如果您不喜欢 at&t 语法,可以使用 gcc -S masm=intel。如果没有它,您最终会得到 at&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 .

关于c - 如何从 x86 汇编程序中执行 C 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22518955/

相关文章:

c - 带字符串的链表

c# - 使用 Interop 处理字节顺序的标准是什么?

assembly - 在 x86 Assembly 中使用 PC 扬声器播放声音

operating-system - 虚拟内存耗尽时会发生什么

在这个C练习中纠正我的想法

c - 循环内的 OpenMP 同步

assembly - 在 UWP 应用程序中使用汇编(语言)?

assembly - 在 MIPS 中,什么是 HI 和 LO

android - 如何在 AOSP 源代码中添加预建应用程序(系统应用程序)

c - 当想要将某些内容写入文件时,在操作系统级别会发生什么?