代码之家  ›  专栏  ›  技术社区  ›  sigjuice

哪个32位/64位CPU架构具有最简单的指令集?

  •  6
  • sigjuice  · 技术社区  · 16 年前

    我觉得处理32位PowerPC程序集代码非常舒服,但是在试图理解x86代码时,我完全迷失了方向。其他常见的架构(如ARM、MIPS、SPARC等)是否比x86指令集更容易?

    9 回复  |  直到 9 年前
        1
  •  10
  •   Crashworks    16 年前

    嗯,大多数RISC非常相似,所以如果你很了解PPC,那么转换到ARM、MIP或SPARC将是一个很好的选择。我实际上是先学了SPARC,然后在几个小时内学会了MIPS和PPC。

    使x86如此混乱的不是它的汇编语言,而是处理器的设计。人们往往会挂断电话:

    • 分段内存寻址——所有这些DS、CS、ES寄存器:它们是什么意思,它们如何与索引寄存器组合以形成完全解析的内存地址?实际上 不同的发生方式,所以你学习了很多不同的模式。
    • 非正交指令集——一些指令只与某些寄存器一起工作,其他指令具有重叠的含义,有些东西看起来应该很快,但实际上很慢,等等。
    • 寄存器内存体系结构——X86的设计目的是拥有很少的(命名的)寄存器,因此每个操作码通常有一个参数是寄存器,另一个参数是内存地址。这与PPC的负载存储架构不同,后者的内存操作是显式的。由于堆栈指针经常反弹,因此很难确定真正使用的是哪个变量!
    • spastic stack指针——大多数PPC调用约定都要求您只移动堆栈指针 一旦 在输入函数时,然后 一旦 返回时,通常x86代码为 push ing和 pop 到处都是乒乓球。最后你会计算出推和弹出的次数,找出堆栈指针指向的位置,这总是让我头疼。

    所以,为了适应x86,分而治之:选择其中一个点,学习它是如何工作的,然后继续下一个点。首先学习调用约定可能会有所帮助,因为这将使引用堆栈指针的所有其他指令更有意义。

        2
  •  4
  •   mP.    16 年前

    如果没有“简单”的定义,我相信大多数人都会同意x86指令集对于主流流行的CPU来说是最糟糕的。

    如果要编写一个在设计指令集时应该遵循的良好或最佳实践的列表,x86将是所有相反的一个很好的例子。

    • 不是正交的,不是所有寄存器的功能都相同。
    • 专用寄存器数量有限-导致堆栈操作过多。
    • 讨厌的前缀操作符。
        3
  •  3
  •   devio    16 年前

    我想你应该给“简单”下定义。

    我宁愿从正交性的角度来判断机器语言(意思是:指令的任何部分都可以被替换,并且仍然可以给出有效的指令)

    • 命令(ADD、SUB、MUL、DIV)

    • 参数(寄存器、内存、文字)

    • 参数大小(字节、字、长、浮点)

    • 参数顺序一致(源x源->目标,或目标lt;-源x源)

    以及指令的能力/复杂性

    • 可用寄存器数

    • 索引寻址

    • 隐式/显式参数

    以及其他。

    也许您应该举例说明与其他体系结构相比,您认为x86的哪些部分“不容易”,以及原因。

        4
  •  3
  •   Sam Harwell    16 年前

    ARM,从某个人的角度来说,这是在编写汇编程序的最后阶段。这里是 Architecture Reference Manual 开始吧。

    编辑:出于某种原因,我认为你的意思是机器代码格式。x86程序集很容易-将其组装为机器代码…不太容易。

        5
  •  3
  •   Martin v. Löwis    16 年前

    我认为你正在经历的现象是第二汇编语言(再次)很难学习(我假设在你开始学习PPC的时候,那时候学习PPC也是很困难的)。你熟悉的新架构越多,它就越容易——在某个时候,你会 享受 找到一些您以前从未见过的体系结构(MIS)特性。

    第二个体系结构的问题是,您还不清楚什么是通用实践,什么是第一个体系结构特有的。因此,您希望某些事情在x86上的处理方式与在PPC上的处理方式相同,而事实上,x86有自己的(甚至可能更优雅)处理方式。

        6
  •  3
  •   Federico klez Culloca    16 年前

    我学会了手臂组装,发现它非常容易和强大。我不认为擦鞋的动作和这样的事情令人困惑。至少因为我先学了ARMASM,然后我读了一些关于x86 ASM的东西。

    我发现x86上缺少的大多数功能都是ARM的优势,例如多寄存器存储/读取和条件执行。pl.us,我发现有这么多寄存器非常有用。

    我认为这是通常的“宗教战争”RISC对CISC,ARM对x86。imho过于主观,不可能成为一个普遍的原则。例如,Martin v.L_¶wis发现ARM没有长腿,而我发现它比x86更优雅。

    我还试了一下微控制器ASM(德州仪器公司的仪器,不记得确切的型号名称),发现它很不合适,而其他许多人可能会发现它是“完美的”ASM。

        7
  •  2
  •   old_timer    16 年前

    挽臂而行。在做了20多年的软件工程师之后,我每天都为各种平台编写汇编程序,但从不需要编写x86汇编程序。一部分是因为它很糟糕,另一部分是因为我永远不会嵌入x86,所以我只运行带有x86和C的台式机/笔记本电脑,或者你想在Linux/Windows上运行的任何东西都是低级别的。

        8
  •  2
  •   Community Mohan Dere    8 年前

    魔鬼的拥护者捍卫x86架构

    我不会为 MS x86 assembler itself, but see here 我的意见。(你可能想和GNU一起去,可能是通过 Cygwin 当然,寄存器的缺乏,大多数寄存器的特殊用途,以及整件事情的奇怪的、扭曲的、非正交的组织,似乎代表了一个经典。 别这样做 例子。哦,等等,那就是那些没有人想要或曾经真正使用过的史诗般复杂的极其复杂的功能呢?你知道分割单元吗?

    关于学习的困难,我认为 乐趣 要编写x86程序集,尽管我不能完全理解这是为什么。没有一个指令集体系结构真的那么复杂,所以我认为你可以用相当小的工作量理解x86,尽管我同意它肯定比RISC ISA有更多的元素。但它是 乐趣 ,一些异常细分的寄存器,一些其他特殊用途的寄存器,以及一些指令格式,但大多使用相同的1.5地址格式。

    回到防守:

    关于缺少寄存器 :这最终没关系。即使是 RISC 体系结构最终 register renaming 尽管他们有大量的体系结构注册,他们仍然需要更多的性能。因此,x86可能更好,因为每个人都会得到大量自动重命名的,但x86只需要保存少量的arch寄存器。

    关于复杂ISA :Intel一直在处理这一问题,一开始使用蛮力高级处理技术(286当时速度相当快),今天通过翻译:RAM中的x86操作码被转换为 micro-ops 因为它们被读取到缓存中,从而将CPU核心与x86隔离!如今,x86是一种“指令压缩”方案,只是一种随着CPU读取程序代码而分解的编码。有些东西他们分割指令,有时他们结合连续的,有时他们只是翻译它们。

        9
  •  0
  •   David C. Bishop    9 年前

    也许值得一看 RISC-V .

    它是一个开放源码指令集,设计为易于实现,并对现实硬件有用。

    它被设计成模块化和可扩展的,“核心”指令集只处理整数,比如浮点是扩展。

    它支持32位、64位甚至128位指令。还有一个16位的“压缩”变体(尽管目前正在开发中)。默认情况下,您会得到32个寄存器。

    这里是 specs .

    还有不错的软件支持。例如linux、gcc、qemu。

    目前有多个不同供应商的实施正在进行中,并且正在看到来自 Google, HP and Oracle . 芯片和FPGA有开源设计。

    当然,如果你从职业生涯的角度来看,RISC-V在这一点上还处于起步阶段。但由于它是开放的,它可以相当快地增长。

    推荐文章