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