我是这个装配场景的新手,我正在阅读有关创建简单操作系统的教程:http://mikeos.berlios.de/write-your-own-os.html因为我真的不想图out assembly是一种在汇编代码中间可以执行C代码的方法。
如果你可以请一步一步说明如何执行这项工作,因为我是初学者。如果有帮助的话,我正在运行Ubuntu 13.10。
编辑我认为不清楚。我想要做的是在汇编程序的中间,它停止执行汇编命令,而是开始运行一个C文件,其中包含我想在我的操作系统上使用的实际代码,例如scanf和printf函数。
我遇到了一些麻烦。如果你能提供一个指向教程的链接,那就是让我有一个hello world操作系统。我可以从那里编辑C代码,并在我的路上,谢谢!
答案 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。