Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 原始图灵机上操作的汇编语言等价物是什么?_Assembly_Turing Machines_Von Neumann - Fatal编程技术网

Assembly 原始图灵机上操作的汇编语言等价物是什么?

Assembly 原始图灵机上操作的汇编语言等价物是什么?,assembly,turing-machines,von-neumann,Assembly,Turing Machines,Von Neumann,如果您采用以下原始图灵机定义: …无限的内存容量 以无限形式获得的 标出来的带子 分成正方形,每个正方形上都可以打印一个符号。随时 有 机器中的一个符号;它被称为扫描符号。机器 可以改变 扫描的符号及其行为部分取决于 符号,但是 磁带上其他位置的符号不会影响 机器。然而, 磁带可以在机器中来回移动,这是 其中一个 机器的基本操作。磁带上的任何符号都可能 所以 终将有一局。(图灵1948年,第61页) 如果您想将这些操作映射到能够解释汇编/二进制指令的处理器上完成的操作,那么将映射哪些操作 (我知

如果您采用以下原始图灵机定义:

…无限的内存容量 以无限形式获得的 标出来的带子 分成正方形,每个正方形上都可以打印一个符号。随时 有 机器中的一个符号;它被称为扫描符号。机器 可以改变 扫描的符号及其行为部分取决于 符号,但是 磁带上其他位置的符号不会影响 机器。然而, 磁带可以在机器中来回移动,这是 其中一个 机器的基本操作。磁带上的任何符号都可能 所以 终将有一局。(图灵1948年,第61页)

如果您想将这些操作映射到能够解释汇编/二进制指令的处理器上完成的操作,那么将映射哪些操作

(我知道这个问题中固有的图灵机器到冯·诺依曼机器的跳跃)

一种无限大的存储容量,以一条无限大的带的形式获得,该带被标成正方形,每个正方形上都可以打印一个符号

我们称之为int数组<代码>整数[]符号

在任何时候,机器中都有一个符号;它被称为扫描符号

(在CPU级别,这被称为“主存储器”或在现代系统中称为“程序段”)

机器可以改变扫描的符号

它的行为部分是由这个符号决定的

(在CPU级别,这是“执行指令”。没有操作代码告诉它这样做;这正是CPU所做的。)

但磁带上其他地方的符号不会影响机器的行为

那里没什么可做的

但是,磁带可以在机器中来回移动,这是机器的基本操作之一


(在CPU级别,这是JMP操作代码的处理)

阅读您编写的内容,我想说您只需要:

  • 直接递增指令(添加到当前磁带位置)
  • 间接递增指令(用于移动磁带)
  • 响应当前磁带位置值的操作
例如,在类似ARM的程序集中,如果您在磁带上有包含地址的R0,则只需要

ADDS r0, r0, #1 ;moves the tape forward
ADDS r0, r0, #-1 ;moves the tape backwards
ADDS [r0], [r0], #1 ;increments the value 'pointed by' the tape
ADDS [r0], [r0], #-1 ;decrements the value 'pointed by' the tape
然后,分支在当前符号假定某些值的情况下执行操作

BEQ Somewhere

这或多或少就是Brainfuck的工作原理。

因为图灵机完全由磁带上的阿尔法赌注定义和读取磁带的状态机决定,所以将语言变成一个表格是最有意义的

让我们调用状态Qn,即从磁带读取的Alfabet字符Ai。机器从传输表an确定下一个状态,并将Ao写入磁带,并沿D:L/R方向移动

然后,可以通过写入其

QnAi->QmAoD

维基百科的添加程序将成为

QbA0 -> QbA1R
QbA1 -> QbA1R
Q0A- -> Q0A-L
Q1A0 -> QrA-L
Q1A1 -> QaA-L
Q1A- -> QrA-L 
a表示接受状态,r表示拒绝状态。这是一个非常简洁易读的过渡矩阵表示

当然,这是假设磁带上的内容被解释为数据,但没有任何东西可以阻止任何人创建转换矩阵,使statemachine解释磁带上的指令

要实现这一点,左边有一个元组,右边有一个三元组,因此这将映射到二维数组中的查找以读取三元组。使用磁带上字符的#位移动状态并将它们粘在一起。乘法(确定,另一个移位操作)为三元组腾出空间,并将其用作表中的偏移量来读取三元组


如果在三元组中找到数据,则在状态寄存器中写入新状态,在磁带上写入字符,并使用inc减量,或者在没有数据的情况下停止。这在汇编中应该很有趣。

我不确定这是否100%正确,但它会是这样的:

  • 图灵机头(在给定时间“扫描”符号的头)将与指令指针等效
  • 因此,指令提取和解码阶段等同于对扫描符号的解释
  • 执行将被表示为一个更复杂的TM操作序列。让我们进行内存写入,例如:将头移到给定的内存位置,将数据从寄存器移动到位置,回到IP地址所登记的位置并增加它。
请注意,头部移动控制相当于流量控制指令,即JMP及其兄弟

还要注意的是,寄存器是经典TM的重要补充。它们可以表示为磁带上的特殊单元(或单元集)或单独的实体。有关详细信息,请参阅


最后,值得一提的是,虽然这对冯·诺依曼体系结构非常有效,但哈佛体系结构使用两个不同的磁带,一个用于说明,一个用于数据。

如果这是作业,请标记为作业。8年前完成的大学-这只是出于兴趣。
  ++inxSym;
  --inxSym
   inxSym +=10;
 // etc.
ADDS r0, r0, #1 ;moves the tape forward
ADDS r0, r0, #-1 ;moves the tape backwards
ADDS [r0], [r0], #1 ;increments the value 'pointed by' the tape
ADDS [r0], [r0], #-1 ;decrements the value 'pointed by' the tape
BEQ Somewhere
QbA0 -> QbA1R
QbA1 -> QbA1R
Q0A- -> Q0A-L
Q1A0 -> QrA-L
Q1A1 -> QaA-L
Q1A- -> QrA-L