1

从字面上看,我才刚刚开始寻求学习汇编语言。我在 Windows Vista 上使用 NASM 汇编程序。

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

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

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

或者,我很欣赏可能需要一个库来告诉 pogram WHERE 打印输出(即 Windows 控制台)。除此之外,我看不出为什么需要任何库。我忽略了什么吗?

4

4 回答 4

3

方法如下

       .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 库)的缺点是您将自己耦合到特定的操作系统。

于 2010-04-11T13:24:50.103 回答
1

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


编辑添加:

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

于 2010-04-11T13:40:17.310 回答
0

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

于 2010-04-11T13:29:37.980 回答
0

Windows 的设计使得一切都在库中。最基本的库是Kernel32.dll,它包含了读写文件的函数以及其他非常基本的操作。(写入控制台实际上只是写入一个特殊文件。)

在 Linux 上,基本系统函数不在库中,而是在通过中断 80 访问的“系统调用”中。因此,在 Linux 上,可以(并且非常容易)编写一些相当高级的程序而无需任何“库”调用一点也不。

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

于 2010-04-11T13:54:11.240 回答