什么是“最纯粹的”汇编语言或汇编语言?

时间:2013-02-03 09:18:23

标签: assembly x86 x86-64

在过去一周左右的时间里,我一直在尝试在64位Windows 7计算机上学习x86汇编语言,以便更加深入地了解计算机的运行方式。

不幸的是,由于许多汇编程序允许使用高级构造和宏以及包含预编写的代码,因此我的进展很少。这不是问题,直到我意识到我能找到的关于这个主题的所有文档和教程都坚持使用这些抽象,拐杖和混淆,这打破了我想要学习真正低级语言的整个目的。

所以现在我正在寻找一种“纯粹”的汇编程序或语言,一种没有高级汇编语言的膨胀和残余,并且尽可能接近机器代码。

4 个答案:

答案 0 :(得分:2)

看看NASM。

NASM有许多更高级别的辅助函数和宏,您可以定义,但您完全可以避免使用它们。

然而,您可能遇到的一个问题是汇编语言编译为字节,但操作系统基本上不运行字节,它们运行程序。因此,你几乎肯定要乱用一些更高级别的结构,以说服你最终决定生成PE文件(Windows)或ELF文件(Linux)的任何汇编程序。

答案 1 :(得分:1)

直接在十六进制编辑器中编写x86机器代码。

这完全可能,我已经做过很多次了。但是你很快就会知道那些"抽象,拐杖和混淆的价值,特别是当你必须手动重新计算第1000次跳跃偏移时......

答案 2 :(得分:1)

有几个级别的“纯粹”。例如,当您使用特定的操作系统时,您必须使用其API来进行输入/输出,内存分配等。这些API调用以不同的方式提供 - 其中一些很容易,其中一些不那么容易。 / p>

例如,如果您正在使用Windows,则必须从系统DLL导入函数。但功能导入不能被视为“汇编编程”。

这些函数的调用约定是C / C ++ / HLL,因此,您必须使用此调用约定,而不是更像汇编。

因此,您首先需要操作系统,这对于程序集友好。我建议32位Linux - 它使用int $ 80并注册参数传递,这样你就可以专注于汇编语言了。

这是一个非常简单的“hello world”示例,用FASM编写。正如您所看到的,开销非常小,并且不涉及任何宏:

format ELF executable
entry _start

segment readable executable
_start:

        mov     eax, 4
        mov     ebx, 1
        mov     ecx, msg
        mov     edx, msg_size
        int     $80

        mov     eax, 1
        xor     ebx, ebx
        int     $80


segment readable writeable
msg db 'Hello world!',$0a
msg_size = $ - msg

当然,您需要一些Linux系统调用手册。 Linux x86 Asm Software Development Kit正是您所需要的。

答案 3 :(得分:0)

对于纯汇编代码,您可以查看一些基本的hello world引导程序。引导加载程序不依赖于操作系统调用,而是直接调用bios。您可以将此基本教程作为示例http://viralpatel.net/taj/tutorial/hello_world_bootloader.php来查看。这是16位汇编。