如果出于安全原因我想学习装配,我应该从哪里开始?我想如果我想避免错误,最好的办法就是知道你在做什么。如果我将有符号整数转换为无符号整数会发生什么。一旦我收到一条奇怪的错误消息,即变量未正确对齐。当时我不知道对齐是什么。
1 回答
我的两分钱
除非你觉得汇编很有趣并且有很多时间,否则我建议你只学习这些东西:有符号数是如何表示的,浮点数是如何表示的以及什么是数据对齐。
我强烈建议您学习汇编,因为它非常吸引人,但我承认对于初学者来说,有目的地学习它是一项巨大的努力。
学习汇编不是学习指令列表,实际上没有必要记住这样的列表。学习汇编意味着学习计算机工作方式的各个方面,从硬件数据表到操作系统的实现方式。
这么多的资料,列个清单都难,更别说学了!
我十几岁的时候就开始学习装配,因为我对它很着迷,除了知识之外没有其他目的。我这样做(并且这样做)是为了好玩,这让事情变得简单,我没有最后期限。那时我有足够的时间一次次学习拼图的各个部分,最终得到了我希望的对整个事物的完整看法。
我花了几天时间研究一个在我做一个更大的项目时突然出现的一个单一的、平庸的、小的方面。
这是你必须得到的行为,如果你开始忽略细节,一切都会变得模糊。
始终对幕后发生的事情进行快速的心理追踪,并写下您的疑虑。
稍后调查这些疑问并用您的注释和发现编写一个文本文件。
以下几点试图为您提供一条可遵循的道路。
我假设您对汇编语言本身和系统编程不感兴趣(所以我跳过向您推荐这本古老但强制性的书:汇编语言的艺术)。
我还假设您拥有 IA32e 架构(即 Intel 或 AMD 处理器)。
1. 阅读文档(需要时间)
阅读英特尔手册。
第一次你可能会停在第一本手册的第 7 章,但要尽快回来完成阅读。
使用NASM作为汇编程序。
您将需要一个链接器,在 Linux 上使用 GCC,在 Windows 上使用 CL(随 Visual Studio 提供,Express 版是免费的)。
不要使用 C 运行时或任何即读即用的库。
学习Linux API。
学习Windows API。
学习Linux ABI。
学习Windows ABI。
查找在线(不完整、糟糕的)教程,以实际了解其工作原理。
了解如何正确编写函数序言和结语以及如何使用堆栈。
多多练习。编写简单的愚蠢程序。
了解这些操作系统的系统调用是如何工作的,在引导过程中做了什么,如何解析符号和加载库。
在线搜索 C 编程练习并在汇编中进行,而不使用 C 运行时。
使用 C 运行时再次执行它们。
2. 大量使用编译器。
用 C 编写测试程序,看看它是如何实现的。
做假设-检验-论文循环。
始终牢记 C 标准所说的内容,因为它在编译器决策中起着重要作用,并且您无法从反汇编中推断出它。