我正在研究汇编编程,因此我决定尝试在软件中实现"virtual microprocessor",它具有寄存器,标志和RAM,可以使用变量和数组实现 . 但是因为我想模拟 only the most basic behavior of any microprocessor ,我想创建一个只有基本指令的汇编语言,只有那些没有它的指令它不能实现像这样的指令 .
我可以想象一些指令(我相信)必须始终以任何汇编语言存在,例如MOV移动字节和JP将指令指针发送到另一个地址 .
你能建议一套最基本和最基本的装配说明吗?谢谢!
8 回答
控制结构包括没有语言的基本特征 . 这意味着您的语言必须对两个变量提供算术运算;然后允许程序根据操作的结果更改程序计数器 - 即分支 - . 通常,关键操作是SUB,用于从另一个操作数中减去一个操作数 . 您允许分支机构的条件是:
结果为零;
结果大于零;
结果小于零 .
无条件,即无条件分支
您还需要移动数据的说明:LOAD和STORE,比方说 .
任何程序都需要这三个条件及其相应的分支(或跳过,这是另一种方式) . 不仅如此,只是这三个简单的操作加上数据移动指令,足以在除I / O之外的程序中执行 anything . 如果你想,并给予一个合作的内存组织,你可以使用LOAD,STORE,ADD,SUB和三个条件分支重写Linux .
PDP-8是一个比这更强大的机器:它有一个rich set of eight instructions,包括I / O.
HTH
最少的指令集需要no instruction或者zero instruction . 我不知道他们是否已进入真实设备,但one instruction set computer has been implemented 并在carbon nanotubes computers和MAXQ中成功运行 .
然而,IMO的体系结构应该足够"fast"(或者与其他体系结构相比,不需要像OISC那样的任何指令) to be considered useful .
计算机最基本的指令类型是数据移动,逻辑/算术运算和分支 . 对于算术运算,只需_499793就足够了 . 对于逻辑,我们可以只用
NOR
或NAND
计算任何函数,因此只需要一个 . 对于跳跃,我们需要一条jump on "<="
或jump on "<"
指令 . 可以通过add / sub模拟数据移动 . 像这样,我们可以使用2位来编码3个操作码(add
,nand
,jump on "<="
)并留下一个用于将来的扩展 . 但由于它没有加载/存储指令,因此它必须使用大型寄存器文件并直接从该文件而不是内存处理数据,或者指令必须能够将内存用作操作数 .如果需要更高的速度然后加载/存储,可以添加更多的逻辑和分支指令,将操作码空间增加到3位 . 指令集可以是:
加载
商店
添加
和
也没有
跳跃不到
平等跳跃
您可能还想查看图灵完整性 .
http://en.wikipedia.org/wiki/Turing_completeness
http://c2.com/cgi/wiki?TuringComplete
What is Turing Complete?
这意味着语言足以计算可以计算的任何东西 .
使用仅包含
SOB:
减去1和分支的最小指令集,您可以很好地生存 . 整个程序可以用这个来编写 .Look at commercial implementations
最好的答案可能是看现有的商业实施 .
任何未经商业销售的东西都可能没用 .
What is the definition of an instruction?
例如,我可以根据解压缩的硬件实现制作一条实现解压缩算法的指令,这当然是解压缩的最有效机器 .
它是否具有商业吸引力?不太可能,但是比这个极端情况有更多细微差别的案例,答案可能会随着现有竞争对手的技术和市场需求而变化,以使事情变得更糟 .
Possible reasons why very small Turing complete ISAs may be inefficient
他们所拥有的一些指令非常复杂,并且每次调用它们都会产生很大的成本,例如:你不能做某些流水线优化
代码密度非常小,这意味着:
性能可能受指令提取的约束
不适合具有小ROM内存的嵌入式设备
值得注意的OISC实施
分析那些有更具体答案的人会很有意思 .
movfuscator
https://github.com/xoreaxeaxeax/movfuscator
仅使用
mov
x86指令编译C代码,以非常具体的方式显示单个指令就足够了 .图灵完整性似乎已在一篇论文中得到证实:https://www.cl.cam.ac.uk/~sd601/papers/mov.pdf subleq
以前在名字中提到过 .
https://github.com/hasithvm/subleq-verilog Verilog,Xilinx ISE .
https://github.com/purisc-group/purisc Verilog和VHDL,Altera . 也许该项目有一个clang后端,但我不能使用它:https://github.com/purisc-group/purisc/issues/5
http://mazonka.com/subleq/sqasm.cpp | http://mazonka.com/subleq/sqrun.cpp基于C的汇编程序和模拟器 .
另见:https://esolangs.org/wiki/Subleq
See also
https://softwareengineering.stackexchange.com/questions/230538/what-is-the-absolute-minimum-set-of-instructions-required-to-build-a-turing-comp/325501
令人惊讶的是,有一个像one instruction set computer这样的东西 .
嗯,这是一个非常广泛的主题 . 我想你需要熟悉Random Access Machine . 我很难说这个非常基本的微处理器应该支持哪些指令 . 例如:可以通过加法运算来模拟减法和乘法 . 如果微处理器支持跳转和条件指令,则可以通过添加负数来进行乘法运算 .
从理论上讲,单指令计算机是可能的 . 但是在实际硬件上,您至少需要4个 . 假设只有内存架构(没有用户可访问的寄存器) .
MOV mem1 mem1 - 将存储单元mem1的内容复制到存储单元mem2,保持mem1不变
NAND mem1 mem2到mem3-在mem1和mem2的数据之间执行按位逻辑NAND,并将结果写入mem3
BITSHIFTR mem1 mem2 mem3- bitshift右侧mem1 mem2位置的数据并将输出写入mem3
JMPcond mem1 mem2 - 测试mem1的最低有效位,如果为真(1)跳转到mem2
现在它不会超快,它会疯狂地占用内存带宽,但它可以用来实现任意指令集的虚拟机 . 此外,还存在某些编程限制,例如需要在所有起始数据中编程,或者至少是仅将LSB设置为1的存储器位置 . 硬件外设必须使用DMA进行I / O访问,如果在哈佛架构程序不会直接访问像指针这样的东西 .