我真的只是开始学习汇编语言。我在Windows Vista上使用NASM汇编程序。
通常,当我开始学习一门新语言时,我会复制其他人的Hello World代码并尝试逐行理解。但是,我发现很难找到一个不引用其他库的Hello World程序!你看,如果它与整个附加代码库紧密相关,那么尝试理解代码的每一行都没有意义!
我想学习装配的原因之一是我几乎可以完全控制我写的程序。我不想依赖任何图书馆。
所以我的问题是:任何人都可以将NASM兼容的汇编代码提供给可以输出到Windows Vista控制台的完全独立的Hello World程序吗?
或者,我很欣赏可能需要库来告诉打印输出的节目(即Windows控制台)。除此之外,我不明白为什么要求任何库。我忽略了什么吗?
答案 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.dll
和ntdll.dll
个库(与您是否使用它们无关)。而且你必须使用它们,因为操作系统的低级接口取决于你的处理器及其版本(即在某些Windows更新后它可能会改变)。
答案 3 :(得分:0)
Windows的设计使得所有内容都在库中。最基本的库是Kernel32.dll,它包含用于写入和读取文件的功能以及其他非常基本的操作。 (写入控制台实际上只是写入特殊文件。)
在Linux上,基本的系统功能不在库中,而是在通过中断80访问的“系统调用”中。因此,在Linux上可以(并且很容易)编写一些相当高级的程序,而不是“图书馆“打电话。”
但是,您应该接受一些库。图书馆的重点是让您的生活更轻松。继续使用C标准库,以便您可以拥有一些基本的控制台和文件输入/输出。从那里你可能找不到任何你真正需要自己无法创作的图书馆的地方。