Assembly 原始图灵机上操作的汇编语言等价物是什么?
如果您采用以下原始图灵机定义: …无限的内存容量 以无限形式获得的 标出来的带子 分成正方形,每个正方形上都可以打印一个符号。随时 有 机器中的一个符号;它被称为扫描符号。机器 可以改变 扫描的符号及其行为部分取决于 符号,但是 磁带上其他位置的符号不会影响 机器。然而, 磁带可以在机器中来回移动,这是 其中一个 机器的基本操作。磁带上的任何符号都可能 所以 终将有一局。(图灵1948年,第61页) 如果您想将这些操作映射到能够解释汇编/二进制指令的处理器上完成的操作,那么将映射哪些操作 (我知道这个问题中固有的图灵机器到冯·诺依曼机器的跳跃) 一种无限大的存储容量,以一条无限大的带的形式获得,该带被标成正方形,每个正方形上都可以打印一个符号 我们称之为int数组<代码>整数[]符号 在任何时候,机器中都有一个符号;它被称为扫描符号 (在CPU级别,这被称为“主存储器”或在现代系统中称为“程序段”) 机器可以改变扫描的符号 它的行为部分是由这个符号决定的 (在CPU级别,这是“执行指令”。没有操作代码告诉它这样做;这正是CPU所做的。) 但磁带上其他地方的符号不会影响机器的行为 那里没什么可做的 但是,磁带可以在机器中来回移动,这是机器的基本操作之一Assembly 原始图灵机上操作的汇编语言等价物是什么?,assembly,turing-machines,von-neumann,Assembly,Turing Machines,Von Neumann,如果您采用以下原始图灵机定义: …无限的内存容量 以无限形式获得的 标出来的带子 分成正方形,每个正方形上都可以打印一个符号。随时 有 机器中的一个符号;它被称为扫描符号。机器 可以改变 扫描的符号及其行为部分取决于 符号,但是 磁带上其他位置的符号不会影响 机器。然而, 磁带可以在机器中来回移动,这是 其中一个 机器的基本操作。磁带上的任何符号都可能 所以 终将有一局。(图灵1948年,第61页) 如果您想将这些操作映射到能够解释汇编/二进制指令的处理器上完成的操作,那么将映射哪些操作 (我知
(在CPU级别,这是JMP操作代码的处理)阅读您编写的内容,我想说您只需要:
- 直接递增指令(添加到当前磁带位置)
- 间接递增指令(用于移动磁带)
- 响应当前磁带位置值的操作
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%正确,但它会是这样的:
- 图灵机头(在给定时间“扫描”符号的头)将与指令指针等效
- 因此,指令提取和解码阶段等同于对扫描符号的解释
最后,值得一提的是,虽然这对冯·诺依曼体系结构非常有效,但哈佛体系结构使用两个不同的磁带,一个用于说明,一个用于数据。如果这是作业,请标记为作业。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