学习汇编 – 我应该从32位还是64位开始?
我真的想学汇编。 我非常擅长c / c ++,但是希望能够更好地理解更低级别的情况。
我意识到,汇编相关的问题之前已经被问到,但我只是寻找一些特定于我的情况的方向:
我正在运行Windows 7,并且对我应该如何开始使用程序集进行混淆。 我是否必须从x64开始,因为我正在运行Windows 7? 有人说“先从32位开始” – 我该怎么做呢? 我的操作系统与编写“32”或“64”位程序集的能力有什么关系? 事实上,'n bit'组件是什么意思,其中n是一个数字?
编辑:
以下是一些帮助我开始assembly的链接; 其他刚刚入门的人可能会发现他们有帮助。 我将继续更新这个列表,因为我继续我的程序集:)
注意:正如我一直在学习,我决定把重点放在用masm32编程。 所以下面的大部分资源都是关注的。
- x86 标记wiki (初学者指南,参考手册,ABI文档等)。
- www.masm32.com
- X86大会WikiBook
- X86反汇编WikiBook (很好理解一些约定,以及如何将高级代码翻译成汇编的基础知识)
- WinAsm IDE (与masm32很好地搭配)
- 简介:Windows汇编 (所有代码示例均适用于masm32)
- 中断列表
- 汇编教程 (非常适合帮助理解核心概念)
- x86汇编指南
-
Agner Fog的软件优化资源 ,包括一些关于在不同平台(Windows与Linux / OS X)上调用约定的好东西,以及大量关于如何有效地完成特定事情的例子。 对于初学者来说不是很好,但是对于中级到高级的读者来说非常好。
(对于英特尔和AMD处理器的每条指令,他也有详细的性能信息,对于严格的性能微型优化非常有用。有些初学者可能想看看其中的一些,开始思考CPU如何工作,以及为什么你可以做一些而不是另一个。)
当人们提到32-bit
和64-bit
程序集时,他们正在讨论你将使用哪一个指令集 – 在英特尔案例中,有时也被称为Ia32
和x64
,我Ia32
你在问这个问题。 在64位的情况下还有很多,所以从32位开始可能不错。 您只需确保将32位汇编器的程序汇编到32位二进制文件中即可。 Windows将仍然知道如何运行它。
我真正推荐的用于组装入门的东西是用简单的指令集来处理的。 去学习MIPS组装 – spim
模拟器是伟大的,易于使用。 如果你真的想直接进入英特尔汇编程序世界,写一个自己的C程序来调用你的程序集。 做一个“真正的节目”的所有设置和拆解是一个大混乱,你甚至不能在那里开始。 所以,只需在其中编写main()
的C封装器,然后将其与编写汇编代码的对象文件进行编译和链接即可。
请不要习惯在C代码中编写内联汇编 – 这是一个代码可移植性的噩梦,没有理由。
您可以下载所有Intel 64和IA-32架构软件开发人员手册以开始使用。
我在1977年开始编写程序集,采用了长途径:在为PDP DEC-8 / E编写具有OS / 8和8k内存的程序之前,先学习基本操作(和,或者,不要)和八进制math。 这是在1977年。
从那以后,我发现了一些关于如何学习我不熟悉的架构的技巧。 有几个:8080/8085 / Z80,x86,68000,VAX,360,HC12,PowerPC和V850。 我很less编写独立程序,它通常是与通常用C语言编写的其他系统链接的函数。
所以首先我必须能够连接到需要学习parameter passing,堆栈布局,创build堆栈帧,参数位置,局部variables位置,丢弃堆栈帧,返回值,返回和堆栈清理的软件的其余部分。 最好的办法是编写一个函数,调用C中的另一个函数,并检查编译器生成的代码清单。
为了学习汇编语言本身,我编写了一些简单的代码,查看编译器生成的内容,并在原始debugging器中单步执行。 我有指令集手册附近,所以我可以查找指令,我不确定。
除了之前提到的堆栈处理之外,了解一个好东西是编译器如何生成机器代码,给定一个高级语言结构。 一个这样的序列是如何将索引数组/结构转换成指针。 另一个是循环的基本机器码序列。
那么什么是“原始debugging器”? 对我来说,它是一个debugging器,它是简单开发包的一部分,并不会像Visualdebugging器那样保护我不受硬件的影响。 在其中我可以轻松地在源代码和程序集debugging之间切换。 它也从开发IDE中快速启动。 它没有三千个function,更可能是三十个,而那些是99.9%的时间。 开发包通常是安装程序的一部分,您可以点击一次许可证批准,一次用于批准默认设置(当有人考虑过并为您完成这项工作时,您是否喜欢它?),最后一次安装。
我有一个最喜欢的x86-32(IA-32)简单的开发环境,那就是OpenWatcom。 你可以在openwatcom.orgfind它。
我对x86-64(AMD64)相当陌生,但过渡看起来非常简单(很像从x86-16转换到x86-32),并带有一些额外的噱头,如附加寄存器r8到r15,主寄存器是64位宽。 我最近碰到了XP / 64,Vista / 64和7/64的开发环境(可能也适用于服务器操作系统),它被称为Pelles C(pellesc.org)。 它由瑞典的一个Pelle Orinius编写和维护,从我花了几个小时的时间,我可以说它注定要成为我最喜欢的x86-64。 我试过了Visual Express软件包(他们安装了这么多的垃圾 – 你知道之后需要做多less卸载吗?超过20个),还试图从一个地方获得gcc来使用IDE(eclipse或其他的东西) )从另一个。
一旦你走到这么远,你遇到了一个新的架构,你将能够花一两个小时看着生成的列表,之后,非常了解其他架构类似。 如果索引和循环结构看起来很奇怪,可以查看生成它们的源代码,也可以查看编译器优化级别。
我想我应该警告你一旦掌握了它,你会注意到在附近的办公桌,咖啡机,会议,论坛和其他许多地方,会有人等着嘲笑你,嘲笑如果你对自己有兴趣,就会向你提出不完整的报价,并给出无知或无能的build议。 为什么他们这样做我不知道。 也许他们自己是组装程序员,他们也许只知道OO(C ++,C#和Java),根本就不知道汇编程序是什么。 或许他们“认识”的人(或者他们的一个朋友知道的)“真的很好”的人可能在论坛上阅读过某些东西,或者在会议上听到过某些东西,因此可以传达一个绝对的真理,为什么组装是完全浪费时间。 在这里有很多他们在计算器。
获得IDA专家。 这是与assembly工作的蜜蜂膝盖。
我个人没有看到32位和64位之间的差异。 这不是关于位而是指令集。 当你谈论assembly时,你会谈论指令集。 也许他们暗示着32位指令集更适合学习。 但是,如果这是你的目标,我build议Donald Knuths关于algorithm的书籍 – 他们按照7位指令集程序教授algorithm:D
对于可移植性问题,我build议您不要使用内联汇编,而要学习如何使用编译器内在函数 – 这将是非embedded式优化的最佳优化。 :d
但希望更好地了解更低级别的情况
如果你真的想知道在x86 / x64处理器/系统上的更低级别的事情,我真的build议从基础开始,即286/386实模式代码。 例如,在16位代码中,你不得不使用内存分割这是一个重要的概念来理解。 今天的32位和64位操作系统仍然以实模式启动,然后切换到相关模式之间。
但是如果你对应用/algorithm开发感兴趣,你可能不想学习所有的底层操作系统的东西。 相反,您可以从x86 / x64代码开始,具体取决于您的平台。 请注意,32位代码也可以在64位Windows上运行,但不是相反。