首页 文章

要学习汇编 - 我应该从32位还是64位开始?

提问于
浏览
51

我真的很想学习装配 . 我非常擅长c / c,但希望更好地了解较低级别的情况 .

我意识到之前已经提出了与装配相关的问题,但我只是在寻找一些特定于我的情况的方向:

我正在运行Windows 7,我对如何开始使用汇编感到困惑 . 我是 have 从x64开始,因为我'm running windows 7? Some people have said '以32位开始' - how do I go about doing this? What does my operating system have to do with my ability to write assembly for ' 32 ' or ' 64 ' bit. In fact, what does ' n位'汇编平均值,其中n是数字?


编辑:

以下是一些帮助我开始组装的链接;刚刚入门的其他人可能会发现它们很有帮助 . 随着我继续组装之旅,我将继续更新此列表:)

注意:正如我一直在学习的那样,我决定专注于使用masm32进行编程 . 因此,以下大多数资源都集中于此 .

(他还为英特尔和AMD CPU的每条指令提供了详细的性能信息,非常适合严格的性能微优化 . 一些初学者可能想要了解其中的一些内容,开始考虑CPU的工作原理,以及为什么你可以做一些事情方式而不是另一种方式 . )

4 回答

  • 22

    当人们引用 32-bit64-bit 汇编时,他们会使用 - 在英特尔情况下它们有时也被称为 Ia32x64 ,我认为你将程序与32位汇编程序组装成32位二进制文件 . Windows仍然知道如何运行它 .

    我真正推荐的汇编开始是一个简单的指令集来处理 . 去学习MIPS assembly - spim模拟器很棒且易于使用 . 如果您真的想直接进入英特尔组装世界,请为自己写一个小程序,为您调用程序集程序;做'real program'的所有设置和拆解是一个很大的混乱,你甚至无法在那里开始 . 所以只需在其中编写一个带有 main() 的C包装器,然后使用编写汇编代码所得到的目标文件进行编译和链接 .

    请不要养成在C代码中编写内联汇编的习惯 - 这是代码可移植性的噩梦,并且没有理由这样做 .

    您可以下载所有Intel 64 and IA-32 Architectures Software Developer's Manuals以开始使用 .

  • 35

    我在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或其他东西) )来自另一个人 .

    一旦你走到这一步,你就会遇到一个新的架构,你可以花一两个小时看一下生成的列表,之后就可以知道它类似的其他架构了 . 如果索引和循环结构看起来很奇怪,你可以查看生成它们的源代码,也可以查看编译器优化级别 .

    我想我应该警告你,一旦掌握了它,你会注意到在附近的办公桌,咖啡机, Session ,论坛和许多其他地方会有人等着嘲笑你,取笑你,因为你对集会感兴趣,给你不完整的引用并给出不知情/不称职的建议 . 为什么他们这样做我不知道 . 也许他们自己都是失败的汇编程序员,也许他们只知道OO(C,C#和Java),并且根本没有关于汇编程序的线索 . 也许他们“知道”(或他们的朋友知道的)“非常好”的人可能已经在论坛上阅读了某些内容或在 Session 上听到了某些内容,因此可以提供关于为什么装配完全浪费的绝对真理时间 . stackoverflow中有很多这些 .

  • 3

    得到IDA pro.这是蜜蜂膝盖与组装工作 .

    我个人认为32位和64位之间没有太大区别 . 它不是关于位而是指令集 . 当你谈论汇编时,你谈论指令集 . 也许他们暗示32位指令集更好地学习 . 然而,如果这是你的目标,我建议唐纳德克努斯在算法方面的书籍 - 他们根据7位指令集汇编教授算法:D

    对于可移植性问题,我建议您不要使用内联汇编来学习如何使用编译器内在函数 - 它将是非嵌入式优化的最佳优化 . :d

  • 0

    但希望更好地了解较低级别的情况

    如果你真的想知道x86 / x64处理器/系统上较低级别的所有内容,我真的建议从基础知识开始,即286/386实模式代码 . 例如,在16位代码中,您被迫使用内存分段,这是一个需要理解的重要概念 . 今天的32位和64位操作系统仍然以实模式启动,然后切换到相关模式之间/之间 .

    但是如果你对应用程序/算法开发感兴趣,你可能不想学习所有低级操作系统的东西 . 相反,您可以立即开始使用x86 / x64代码,具体取决于您的平台 . 请注意,32位代码也将在64位Windows上运行,但不是相反 .

相关问题