我觉得处理32位PowerPC汇编代码非常舒服,但在尝试理解x86代码时我完全迷失了.ARM,MIPS,Sparc等其他常见架构是否比x86指令集更容易?
好吧,大多数RISC都非常相似,所以如果你很了解PPC,那么过渡到ARM,MIPS或SPARC都会很容易.我实际上先学习了SPARC然后能够在几个小时内获得MIPS和PPC.
使x86如此混乱的事情并不是它的汇编语言,而是处理器的设计.人们倾向于挂断电话:
分段存储器寻址 - 所有这些ds,cs,es寄存器:它们是什么意思,它们如何与索引寄存器组合以形成完全解析的存储器地址?实际上有三种不同的方式,所以你正在学习一堆不同的模式.
非正交指令集 - 某些指令仅适用于某些寄存器,其他指令具有重叠的含义,有些东西看起来应该很快但速度很慢等等.
寄存器存储器架构 - x86设计为具有少量(命名)寄存器,因此每个操作码通常具有一个作为寄存器的参数和另一个作为存储器地址的参数.这与PPC的加载存储库不同,后者的内存操作是显式的.由于堆栈指针往往会反弹很多,这可能很难找出实际使用的变量!
痉挛堆栈指针 - 大多数PPC调用约定你在进入函数时只移动一次堆栈指针然后在返回时移动一次,通常x86代码将在整个地方进行ping push
和pop
ping.你最终会计算推送和弹出以找出你的堆栈指针所在的位置,这总是让我头疼.
因此,为了适应x86,分而治之:选择其中一个点,了解它是如何工作的,然后继续下一个.首先学习调用约定可能有所帮助,因为这将使引用堆栈指针的所有其他指令更有意义.