assembly 任何汇编语言被认为有用的最低指令集是什么?

vohkndzv  于 11个月前  发布在  其他
关注(0)|答案(9)|浏览(156)

我正在学习汇编程序设计,所以我决定尝试在软件中实现一个“虚拟微处理器”,它有寄存器,标志和RAM,用变量和数组实现。但是因为我想模拟任何微处理器的最基本行为,我想创建一个汇编语言,只有基本的指令,我的意思是,有汇编语言可以做乘法和交换寄存器值等,但这些操作不是基本的,因为你可以用更简单的指令来实现它们。我不想实现这样的指令。
我可以想象一些指令(我相信)在任何汇编语言中都必须存在,比如 MOV 移动字节,JP 发送指令指针到另一个地址。
你能建议一套最基本和最重要的组装说明吗?谢谢!

qoefvg9y

qoefvg9y1#

控制结构包含了语言的基本特征,没有这些特征就没有语言。这意味着你的语言必须提供两个变量的算术运算;然后允许程序根据运算结果改变程序计数器--也就是说,到分支。通常,关键的运算是减法,从一个操作数减去另一个操作数。允许分支的条件是:
1.结果为零;
1.结果大于零;
1.结果小于零。
1.无条件,即分支无条件
您还需要指令来移动数据:比如说LOAD和STORE。
这三个条件及其相应的分支不仅如此,仅仅这三个简单的操作加上数据移动指令,就足以在程序中做除了I/O之外的任何事情。如果你愿意,并且有一个合作的内存组织,你可以重写Linux,只使用LOAD,STORE,ADD,NULL,和三个条件分支。
PDP-8是一台比这台强大得多的机器:它有一个rich set of eight instructions,包括I/O。
HTH

yqkkidmi

yqkkidmi2#

令人惊讶的是,有一个one instruction set computer这样的东西。

yruzcnhs

yruzcnhs3#

最少的指令集需要no instructionzero instruction。我不知道它们是否已经进入真实的设备,但one instruction set computer (OISC)已经实现,并在carbon nanotubes computersMAXQ上成功运行。
事实上,x86也可以用作OISC架构,因为 * 它可以用一个mov * 做任何事情,因为它已经是proved to be Turing-complete了。甚至还有一个名为movfuscator的编译器可以将有效的C代码编译成一个只有MOV的程序。(或仅XOR、XOR、ADD、XADD、ADC、SBB、AND/OR、PUSH/POP、1位移位或CMPXCHG/XCHG中的任一种)。参见Why is mov turing complete?
然而,在我看来,一个架构 * 应该足够“快”*(或者与其他架构相比,一个任务不需要太多的指令,比如OISC)才能被认为是有用的
计算机最基本的指令类型是数据移动,逻辑/算术运算和分支。对于算术运算,只需一个add/subtract就足够了。对于逻辑,我们可以计算任何函数,只需一个NORNAND,因此只需要一个。对于跳转,我们需要一个jump on "<="jump on "<"指令。数据移动可以通过add/sub来模拟。这样,我们可以使用2位来编码3个操作码(addnandjump on "<="),并留下一个用于将来的扩展。但由于这没有单独的 * 加载/存储指令 *,因此它必须直接对大型寄存器文件而不是内存进行操作,或者指令必须能够使用内存作为操作数。
如果需要更快的速度,则可以添加更多的逻辑、分支指令以及可能的加载/存储,从而将操作码空间增加到3位。指令集可以是:
1.负载
1.店
1.添加
1.和
1.也不
1.跳上少于
1.等跳
add可以实现左移,但右移比较复杂,因此您可能还希望添加右移,以简化一些常见操作

7kqas0il

7kqas0il4#

嗯,这是一个非常广泛的主题。我想你需要熟悉Random Access Machine。我不是Maven,但很难告诉这个非常基本的微处理器应该支持哪些指令。例如:减法和乘法可以通过加法运算来模拟。乘法是可能的,如果微处理器支持跳转和条件指令,减法是可能的,通过添加负数。

vecaoik1

vecaoik15#

你可以用一个只包含SOB:减1和分支的最小指令集来生存,整个程序都可以用它来写。

mm9b1k5b

mm9b1k5b6#

查看商业实现

最好的答案可能是查看现有的商业实现。
任何没有商业销售的东西都可能没有用。

指令的定义是什么?

例如,我可以根据unzip的硬件实现,编写一条实现unzip算法的指令,这当然是解压缩最有效的机器。
然而,它在商业上有吸引力吗?不太可能,因为硬件可能过于专业化,不值得开发成本。
但还有比这个极端情况更微妙的情况,答案可能会随着现有竞争对手的技术和市场需求而变化,使情况变得更糟。
最后,“高效硬件”意味着:

  • 取一组基准,为每个基准分配一个重要性权重
  • 编写解决这些基准的最佳软件
    非常小的图灵完备ISA可能效率低下的可能原因
  • 它们仅有的几条指令非常复杂,每次调用时都会产生很大的开销,例如,您无法进行某些流水线优化
  • 代码密度非常小,这意味着:
  • 性能可能受到指令提取的限制
  • 不适合ROM内存小的嵌入式设备

OISC实现

分析这些问题以得到更具体的答案将是有趣的。

movfuscator

https://github.com/xoreaxeaxeax/movfuscator
Toy C compiler for x86,它只使用mov x86指令,以非常具体的方式表明单个指令就足够了。
图灵完备性似乎已经在一篇论文中得到了证明:https://www.cl.cam.ac.uk/~sd601/papers/mov.pdf

subleq

教育OSIC,以前在https://stackoverflow.com/a/9439153/895245中提到过,但没有名称:

标签:https://esolangs.org/wiki/Subleq

参见

https://softwareengineering.stackexchange.com/questions/230538/what-is-the-absolute-minimum-set-of-instructions-required-to-build-a-turing-comp/325501

ddhy6vgd

ddhy6vgd7#

从理论上讲,单指令计算机是可能的。然而在真实的硬件上,你至少需要4个。假设是一个只存储器的体系结构(没有用户可访问的寄存器)。
MOV mem 1 mem 2-将内存位置mem 1的内容复制到内存位置mem 2,使mem 1保持不变
与非mem 1 mem 2至mem 3-在mem 1和mem 2处的数据之间执行逐位逻辑与非,并将结果写入mem 3
BITSHIFTR mem 1 mem 2 mem 3-将mem 1 mem 2位置的数据右移,并将输出写入mem 3
JMPcond mem 1 mem 2-测试mem 1的最低有效位,如果为真(1),则跳转到mem 2
现在它不会超级快,它会疯狂地消耗内存带宽,但它可以用来实现任何任意指令集的虚拟机。此外,还有一些编程限制,比如需要在所有启动数据中编程,或者至少是一个只有LSB设置为1的内存位置。硬件外设必须使用DMA进行I/O访问,如果在哈佛体系结构上实现,程序将不能直接访问指针之类的东西。

xcitsw88

xcitsw888#

你可能还想看看图灵完备性。
http://en.wikipedia.org/wiki/Turing_completeness
http://c2.com/cgi/wiki?TuringComplete
What is Turing Complete?
这意味着一种语言足以计算任何可以计算的东西。

atmip9wb

atmip9wb9#

实际上,你所需要的只是翻转一下然后跳跃。跳跃甚至不需要有条件。
FlipJump Languageesolangs page)是一种编程语言,它有一条指令,即:翻转一位,然后跳转
指令a;b转换为not *a; jump b
这可能会让你感到惊讶,但是使用这种语言,你可以实现任何东西。
完全披露,我早在2021年就创建了这门语言,当时的想法是创建最小的编程语言。从那以后,我一直支持它,并为该语言创建了一个经过充分测试的标准库,以及易于使用的汇编程序+解释器(github)。

相关问题