Assembly 什么是“;最纯净的&x201D;汇编语言还是汇编语言?

Assembly 什么是“;最纯净的&x201D;汇编语言还是汇编语言?,assembly,x86,x86-64,Assembly,X86,X86 64,在过去一周左右的时间里,我一直在尝试在64位Windows7机器上学习x86汇编语言,以便更深入地了解计算机的运行方式 不幸的是,我没有取得什么进展,因为许多汇编器允许使用高级构造和宏,并包含预编写的代码。这不是一个问题,直到我意识到我能找到的关于这个主题的所有文档和教程都坚持使用这些抽象、拐杖和混淆,这违背了我想要学习一门真正低级语言的全部目的 因此,现在我正在寻找一种“纯”汇编程序或语言,它没有高级汇编语言的臃肿和粗糙,并且尽可能接近机器代码。直接在十六进制编辑器中编写x86机器代码 这是完

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

不幸的是,我没有取得什么进展,因为许多汇编器允许使用高级构造和宏,并包含预编写的代码。这不是一个问题,直到我意识到我能找到的关于这个主题的所有文档和教程都坚持使用这些抽象、拐杖和混淆,这违背了我想要学习一门真正低级语言的全部目的


因此,现在我正在寻找一种“纯”汇编程序或语言,它没有高级汇编语言的臃肿和粗糙,并且尽可能接近机器代码。

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


这是完全可能的,我已经做过很多次了。但是,您很快就会了解这些“抽象、拐杖和混淆”的价值,尤其是当您必须第1000次手动重新计算跳转偏移量时……

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

这是完全可能的,我已经做过很多次了。但是,您很快就会了解这些“抽象、拐杖和混淆”的价值,特别是当您必须第1000次手动重新计算跳转偏移量时……

看看NASM

NASM有很多高级助手函数和宏,您可以定义它们,但是您完全可以自由地避免使用它们

然而,您可能遇到的一个问题是汇编语言编译成字节,但操作系统基本上不运行字节,而是运行程序。因此,为了说服最终使用的汇编程序生成PE文件(Windows)或ELF文件(Linux),您几乎肯定必须处理一些更高级别的构造

NASM有很多高级助手函数和宏,您可以定义它们,但是您完全可以自由地避免使用它们


然而,您可能遇到的一个问题是汇编语言编译成字节,但操作系统基本上不运行字节,而是运行程序。因此,为了说服最终使用的汇编程序生成PE文件(Windows)或ELF文件(Linux),您几乎肯定必须处理一些更高级别的构造。例如,当您使用特定的操作系统时,您必须使用它的API来进行输入/输出、内存分配等。此API调用通过不同的方式提供—有些简单,有些不那么简单

例如,如果您在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系统调用手册。这正是你需要的

有几个级别的“纯”。例如,当您使用特定的操作系统时,您必须使用它的API来进行输入/输出、内存分配等。此API调用通过不同的方式提供—有些简单,有些不那么简单

例如,如果您在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系统调用手册。这正是你需要的

对于纯汇编代码,您可以查看一些基本的hello world引导加载程序。引导加载程序不依赖于操作系统调用,而是直接依赖于bios调用。您可以以本基础教程为例。这是16位汇编。

对于纯汇编代码,您可以查看一些基本的hello world引导加载程序。引导加载程序不依赖于操作系统调用,而是直接依赖于bios调用。您可以以本基础教程为例。这是16位汇编。

这不是一个有用的答案。从编写指令(没有额外的东西)跳到编写机器代码是一个很大的过程,在这种情况下完全没有必要。OP想要理解底层。。。。。我还能说什么呢?我一点也不怀疑这些结构的价值。它们很有用,但我想了解计算机如何在这些结构下真正运行。我宁愿用更高级的语言创建一个虚拟的汇编程序,而不是用纯十六进制代码来编写。在我看来,几乎任何汇编程序都可以做你想做的事情。你需要的是一个不使用任何“拐杖”的教程。不幸的是,我不知道有什么可以推荐的(在十六进制编辑器中编写一个程序的成本是最低的,除非你真的想在0和1中编写。完全不同意TJ。如果你想尽可能低并且仍然有效率,那么这个答案是正确的。如果用户的目标是学习,这并不是完全没有必要的。我