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

mud*_*dge 12 x86 assembly instruction-set

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

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

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

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

cla*_*aws 21

好吧,我不同意你的看法.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和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)我们几乎不需要关心.

替代文字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位地址大小的寻址模式:

替代文字

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

替代文字

RIP + [位移]


操作模式:

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

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

指令系统:

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

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

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

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

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

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

只需获得有关x86架构的汇编语言的好书.我个人建议" 使用GNU/Linux for IA32架构进行汇编语言编程 "作者:Rajat Moona,因为它的简短而且非常重要.不浪费你的大部分时间.但它不包括X86-64.

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


Tho*_*nin 5

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

但是,通过阅读旧版CPU的文档,可以使事情大大简化。英特尔和AMD似乎向每个子模型添加了数十条新指令。尝试阅读80386英特尔手册,该手册虽然尺寸较小,但却涵盖了您将要使用的大部分内容。

我知道一本好书(老),但是是法文。它被J.-M称为“ Programmation du 80386”。和M. Trio。我不确定现在它是否仍在编辑(我将近20年前买了我的)。