如何在不使用库的情况下创建汇编程序?

时间:2010-04-11 13:17:07

标签: assembly libraries nasm

我真的只是开始学习汇编语言。我在Windows Vista上使用NASM汇编程序。

通常,当我开始学习一门新语言时,我会复制其他人的Hello World代码并尝试逐行理解。但是,我发现很难找到一个不引用其他库的Hello World程序!你看,如果它与整个附加代码库紧密相关,那么尝试理解代码的每一行都没有意义!

我想学习装配的原因之一是我几乎可以完全控制我写的程序。我不想依赖任何图书馆。

所以我的问题是:任何人都可以将NASM兼容的汇编代码提供给可以输出到Windows Vista控制台的完全独立的Hello World程序吗?

或者,我很欣赏可能需要库来告诉打印输出的节目(即Windows控制台)。除此之外,我不明白为什么要求任何库。我忽略了什么吗?

4 个答案:

答案 0 :(得分:3)

Here是如何:

       .text
LC0:
        .ascii "Hello, world!\12"
.globl _main
_main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $4, %esp
        pushl   $-11
        call    _GetStdHandle@4
        pushl   $0
        leal    -4(%ebp), %ebx
        pushl   %ebx
        pushl   $14
        pushl   $LC0
        pushl   %eax
        call    _WriteFile@20
        movl    $0, %eax
        leave
        ret

但是你不会使用操作系统功能。不使用库(例如C库)的缺点是您将自己耦合到特定的操作系统。

答案 1 :(得分:1)

作为替代方案,您可以编写一个引导加载程序,直接通过视频内存将“Hello,World”打印到控制台。那么你和裸金属之间几乎没有任何东西。您可以找到the OSDev Wiki指向引导加载程序的说明。首先阅读该页面以获得对概念和想法的解释。然后按照Hello World Bootloader的外部链接进行操作。请注意,那里的教程使用BIOS(库)来打印消息。但是,您可以在OSDev Wiki上搜索有关如何在没有BIOS的情况下将消息打印到屏幕的信息,并进行必要的更改。


已编辑添加:

我强烈建议您为此活动使用某种虚拟化。除非你真的知道自己在做什么,否则不要弄乱硬盘上的引导扇区。

答案 2 :(得分:0)

Windows为所有程序加载kernel32.dllntdll.dll个库(与您是否使用它们无关)。而且你必须使用它们,因为操作系统的低级接口取决于你的处理器及其版本(即在某些Windows更新后它可能会改变)。

答案 3 :(得分:0)

Windows的设计使得所有内容都在库中。最基本的库是Kernel32.dll,它包含用于写入和读取文件的功能以及其他非常基本的操作。 (写入控制台实际上只是写入特殊文件。)

在Linux上,基本的系统功能不在库中,而是在通过中断80访问的“系统调用”中。因此,在Linux上可以(并且很容易)编写一些相当高级的程序,而不是“图书馆“打电话。”

但是,您应该接受一些库。图书馆的重点是让您的生活更轻松。继续使用C标准库,以便您可以拥有一些基本的控制台和文件输入/输出。从那里你可能找不到任何你真正需要自己无法创作的图书馆的地方。