跳过模拟器中的指令
Skipping Instructions in emulator
因此,我在 C 语言中为 MSP440 模拟了一条名为 IFcc 的额外指令,其中 cc 是条件。它的工作原理是,如果条件为真,则执行 'true instructions',并跳过 'false instructions',如果条件为假,反之亦然。该指令有两个参数,TC 是条件为真时要执行的指令数,FC 是条件为假时要执行的指令数。
以下是汇编代码的示例:
CMP &ALPHA,&BETA
IFEQ 2,2 ; Execute the first and second instructions if ALPHA = BETA
; or the third and fourth instructions if ALPHA BETA
MOV #0,&ALPHA ; Executed if ALPHA = BETA
MOV #1,&BETA ; Executed if ALPHA = BETA
MOV &BETA,&ALPHA ; Executed if ALPHA ≠ BETA
ADD #1,&ALPHA ; Executed if ALPHA ≠ BETA
我想不通的是如何忽略不应执行的指令。程序集本身不会更改为使用分支,因为 IFcc 指令的要点是消除分支的必要性。如有任何帮助,我们将不胜感激。
我不认识那个指令,这是你在模拟器中发明的指令吗?
假设是这样
msp430 指令集是可变字长的,所以如果您希望逻辑简单地说执行或不执行接下来的两条指令,您必须指定指令,但直到每个指令的第一个字被解码为知道那是多少个字,但这并不重要,你放入一个计数器并计算指令的数量,只是不要执行管道的执行或回写阶段。
归根结底,您在这里所做的只是条件分支或非条件分支,这条指令有何不同?不冲洗管道与冲洗管道?谁说 current/modern 设计中的分支会冲洗管道,如果分支足够近且管道足够深,则设计中可能会进行优化,不冲洗和重新填充,而是继续前进和跳过(对于分支向前移动少量单词的非常常见的情况)。
最简单的就是分支,将pc设置为跳过指令后的单词,你应该已经在分支中实现了,但是ASSEMBLER应该负责计算指令中有多少个单词接下来的 N 条指令。在一种情况下,跳过两条指令可能是跳过两个字(将 4 添加到 pc),或者它可能在其他地方意味着跳过两条指令意味着跳过 5 个字。就像您指定标签的分支的实现一样,汇编程序负责进行多次传递并最终计算标签在指令流中的位置的偏移量。这基本上意味着使它成为一个带有标签的分支。
如果你不想让它成为一个带有标签的分支,那么你必须假装执行接下来的 N 条指令,直到你对它们进行足够的解码以知道它们有多少字宽并跳过那么多字,重复要跳过的指令数。运行时没有其他方法可以做到这一点。
事实证明,我需要通过在内存写入函数周围设置一些条件来防止指令写回内存。根据 IFcc 设置的机器状态(无条件、真条件、假条件),它将写入内存或被阻止写入 ememory
因此,我在 C 语言中为 MSP440 模拟了一条名为 IFcc 的额外指令,其中 cc 是条件。它的工作原理是,如果条件为真,则执行 'true instructions',并跳过 'false instructions',如果条件为假,反之亦然。该指令有两个参数,TC 是条件为真时要执行的指令数,FC 是条件为假时要执行的指令数。 以下是汇编代码的示例:
CMP &ALPHA,&BETA
IFEQ 2,2 ; Execute the first and second instructions if ALPHA = BETA
; or the third and fourth instructions if ALPHA BETA
MOV #0,&ALPHA ; Executed if ALPHA = BETA
MOV #1,&BETA ; Executed if ALPHA = BETA
MOV &BETA,&ALPHA ; Executed if ALPHA ≠ BETA
ADD #1,&ALPHA ; Executed if ALPHA ≠ BETA
我想不通的是如何忽略不应执行的指令。程序集本身不会更改为使用分支,因为 IFcc 指令的要点是消除分支的必要性。如有任何帮助,我们将不胜感激。
我不认识那个指令,这是你在模拟器中发明的指令吗?
假设是这样
msp430 指令集是可变字长的,所以如果您希望逻辑简单地说执行或不执行接下来的两条指令,您必须指定指令,但直到每个指令的第一个字被解码为知道那是多少个字,但这并不重要,你放入一个计数器并计算指令的数量,只是不要执行管道的执行或回写阶段。
归根结底,您在这里所做的只是条件分支或非条件分支,这条指令有何不同?不冲洗管道与冲洗管道?谁说 current/modern 设计中的分支会冲洗管道,如果分支足够近且管道足够深,则设计中可能会进行优化,不冲洗和重新填充,而是继续前进和跳过(对于分支向前移动少量单词的非常常见的情况)。
最简单的就是分支,将pc设置为跳过指令后的单词,你应该已经在分支中实现了,但是ASSEMBLER应该负责计算指令中有多少个单词接下来的 N 条指令。在一种情况下,跳过两条指令可能是跳过两个字(将 4 添加到 pc),或者它可能在其他地方意味着跳过两条指令意味着跳过 5 个字。就像您指定标签的分支的实现一样,汇编程序负责进行多次传递并最终计算标签在指令流中的位置的偏移量。这基本上意味着使它成为一个带有标签的分支。
如果你不想让它成为一个带有标签的分支,那么你必须假装执行接下来的 N 条指令,直到你对它们进行足够的解码以知道它们有多少字宽并跳过那么多字,重复要跳过的指令数。运行时没有其他方法可以做到这一点。
事实证明,我需要通过在内存写入函数周围设置一些条件来防止指令写回内存。根据 IFcc 设置的机器状态(无条件、真条件、假条件),它将写入内存或被阻止写入 ememory