学习x86指令集的最简单/最佳方法?

时间:2010-03-18 14:54:03

标签: assembly x86 instruction-set

我想学习x86指令集架构。我不是要为x86学习程序集。我想了解机器代码宝贝。

原因是我想为x86编写汇编程序。然后我想编写一个编译成汇编的编译器。

我知道有Intel manuals和AMD手册涵盖了x86指令集。但那些非常大而且密集。

我想知道是否有一种更平易近人(可能是教程)的方法来学习x86指令集架构。

6 个答案:

答案 0 :(得分:18)

好吧,我不同意你的看法。 x86的复杂性被误解,因此被夸大了。我不是说这不复杂。肯定是这样但只有在想要编写一个完整的编译器或汇编器时才是这种情况。如果你只是想学习装配。它并不复杂。

让我们分解x86-64架构以证明我的观点。


<强>寄存器:

x86-64指定了很少的寄存器。究竟有多少?让我们列举一下

  • 16个通用寄存器(RAX,RBX,RCX,RDX,RSI,RDI,RBP,RSP + R8,R9,R10,R11,R12,R13,R14,R15)
  • 6个分段寄存器(CS,DS,SS,ES,FS,GS)
  • 64位RFlags&amp; 64位RIP
  • 8位80位浮点(x87)寄存器(FPR0-FPR7)别名为64位MMX寄存器(MM0-MM7)
  • 16个128位扩展媒体寄存器(XMM0-XMM7 + XMM8-XMM16)
  • 一些特殊/杂项寄存器,如控制寄存器(CR0到4),调试寄存器(DR0到3,加6和7),测试寄存器(TR4到7),描述符寄存器(GDTR,LDTR,IDTR)和我们几乎不需要关心的任务登记册(TR)。

alt text http://www.viva64.com/content/articles/64-bit-development/amd64_em64t/01-big.png


寻址模式:

如何引用任何内存位置?

来源:http://en.wikipedia.org/wiki/X86#Addressing_modes

32位或64位x86处理器上的32位地址大小的寻址模式可以通过以下公式汇总:

alt text

64位x86处理器上64位代码的寻址模式可以通过以下公式汇总:

alt text

RIP + [置换]


操作模式:

这些是它可以运作的模式:

  1. 真实模式
  2. 保护模式
    • 虚拟8086模式
  3. 长模式

  4. 指令集:

    你听到人们说它有一个大的指令集。好吧,有大约500-600条指令。但其中一些是相同的指令,只有很少的变化,如CMPS / CMPSB / CMPSW / CMPSD / CMPSQ。如果你将它们分组,就像这个数字一样,可以达到400条指令

    你觉得它非常大吗?然后我几乎没有问题。 C标准库有多少个函数? POSIX库有多少个函数?那么.NET&amp; Java的?多少课程&amp;他们有方法吗?我们必须知道所有的函数/方法/类吗?我们采用什么方法来学习这些库?

    从每个人那里学到一些。粗略地浏览所有这些。了解它们的存在并在需要时使用参考。

    我们可以在逻辑上将这些说明划分为以下类别:

    1. 通用指令
      • 基本数据处理(移动和复制)
      • 控制转移(跳转,呼叫,中断)
      • 算术&amp;逻辑指令(add,sub,和xor等。)
      • String&amp;面向比特的指令
      • 系统调用
    2. 系统说明
    3. x87浮点指令
    4. 64位媒体(MMX)说明
    5. 128位媒体(SSE)指令

    6. 多数民众赞成!!多数民众赞成你需要知道的。现在坦率地告诉我。那复杂吗?

      只需获得有关x86架构的汇编语言的好书。我个人建议“Assembly Language Programming in GNU/Linux for IA32 Architectures”作者:Rajat Moona,因为它的简短和简短。到了这一点。不浪费你的大部分时间。但它不包括X86-64。

      熟悉IA32 for x86-64后阅读http://csapp.cs.cmu.edu/public/1e/public/docs/asm64-handout.pdf

答案 1 :(得分:5)

在某些时候,你将不得不应对一些复杂性。 x86指令集很大。

但是,通过阅读旧CPU的文档,您可以使事情变得更加简单。英特尔和AMD似乎为每个子模型添加了数十条新指令。试着阅读Intel manual for the 80386,这个版本要小得多,但却涵盖了你将要使用的大部分内容。

我知道一本好书(旧书),但它是用法语写的。它被J.-M.称为“Programmation du 80386”。和M. Trio。我不确定它现在还在编辑(我差不多20年前买了它)。

答案 2 :(得分:2)

我会说跳到深水中并从那里开始。

首先编写一个简单的(C / ++)应用程序。 然后使用名为OllyDbg(http://www.ollydbg.de/)的史诗调试器。调试您的应用程序,看看编译器如何实现您的代码。检查循环。检查功能调用。检查API调用。检查内存操作。

通过这样做,您将真正了解如何做事。

我一直在用这种方式调试应用程序并学习汇编。你说你想了解机器代码,我认为没有更好的方法。

您也可以查看名为“crackme”的内容(google it)。 这将使您面临挑战,以测试您的技能。 一旦你掌控了你就会发现你想要知道的一切只是挖掘指令集手册。明白这点?用特定目标挑战自己。

祝你好运。这很不容易。

答案 3 :(得分:1)

如果您只是想了解数字和一些复杂性,例如Mod R / M字节及其背后的其他奇怪之处,您可能想尝试实现一个简单的8086仿真器。 (只是CPU)。我觉得这是一次有趣而有趣的经历。

http://www.ousob.com/ng/iapx86/是我在编写模拟器时使用的非常好的参考,并提供了一个非常好的操作码列表以及它出现的CPU版本,以及操作码的每个变体的十六进制操作码。

答案 4 :(得分:1)

我认为你不现实。 你sed:

  

我知道有英特尔   手册和AMD手册涵盖了   x86指令集。但那些是   非常大而密集。

...

  

我想   了解所有这些。也许我应该   从最简单的开始   最容易学习。

你问自己为什么有大而密的? 答案很简单! 如果我们只是寻找英特尔x86产品

  
      
  • 有:8086,8088,80186,80188和80286 16位CPU。
  •   
  • 有80386和80486与构建浮点协处理器32   位CPU。
  •   
  • 有:Pentium和Pentium MMX
  •   
  • 有:Pentium Pro,Pentium II和Pentium III
  •   
  • 有:Pentium 4 Pentium M,Pentium 5,Pentium 6,Celleron,   普雷斯科特
  •   
  • 有:Intel Core 2,Intel Core i7
  •   
  • 有:Intel Atom
  •   
  • 有:Sandy Bridge

  •   
  • 有16,32和64位架构

  •   
  • 浮点单元有几种不同的数学运算。
  •   
  • 有几种流式SIMD扩展。
  •   
  • 有几种受保护的CPU模型。
  •   

有......

在x86架构上有32年的R&amp; D。 我没提到AMD,VIA等等!

没有没有更快的方法!

答案 5 :(得分:1)

旧版本的NASM手册有一个很好的,简洁的参考,虽然他们所指的CPU只是最近的旧版本。这是我发现的随机副本。列出操作码(排列使得模式易于查看),并描述寻址模式编码:

http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html

我基本上只使用这些信息编写了一个运行时机器代码生成器(目标是486或更高),所以应该有足够的内容让你开始...