gpt4 book ai didi

c++ - 何时在TriCore模拟器中加载操作数?

转载 作者:太空宇宙 更新时间:2023-11-04 14:32:46 25 4
gpt4 key购买 nike

这是我第一次在Stack Overflow上发帖,所以我希望我做得正确。 ;-)

我正在尝试开发TriCore模拟器,但无法决定何时加载指令的操作数的策略。 TriCore可能是一种相当晦涩的微控制器,因此让我对架构进行一些解释。

有两种类型的指令:16位和32位。它是16位还是32位,由最后一个字节中的位0决定;由于字节顺序是小尾数,因此它始终是内存中的第一个字节。没问题。

这两种指令类型具有几种操作码格式,14位表示16位,25位表示32位。操作码被分为两个单独的操作码字段,尽管大多数16位操作码字段只有一个操作码字段。第一个操作码字段在低8位中。它直接描述了用于16位指令的指令,对于许多32位指令,它描述了操作数编码,而第二个字段描述了实际指令(但是当然也有例外)。

我的计划是始终提取所有操作码字段(这有点烦人,因为第二个字段的位置对于所有指令格式都不相同),并将它们放到一个16位值中,该值将在函数指针表中使用。

根据此值,我想提取操作数。例如,当在32位指令中,第一个操作码是0x8B时,操作数是两个数据寄存器和一个9位常量。但是,有些例外确实很繁琐:

ADD.AADDSC.A指令均具有操作码1 == 0x01。但是ADD.A使用三个地址寄存器,而ADDSC.A使用两个地址寄存器,一个数据寄存器和一个编码到指令中的索引。

最后我的问题是:在执行指令之前在这样的架构中加载操作数是否完全可行?还是先调用指令函数并在那里提取操作数会更好?

对于任何有兴趣的人,说明手册在这里:http://www.infineon.com/dgdl/tc_v131_instructionset_v138.pdf?folderId=db3a304412b407950112b409b6cd0351&fileId=db3a304412b407950112b409b6dd0352

感谢您的提示!

顺便说一句:选择的语言是C或C ++。



(根据要求,我将想法插入了原始问题。)

好吧,我广泛考虑了我所拥有的不同选择,并且我认为我会同意以下内容。

我将整个过程分为两个部分:


程序分析和操作数提取
执行


在第一步中,将加载每条指令并将其对齐为32位。然后,将已加载的指令与一组位掩码进行比较,以确定正确的操作码,该操作码不仅告诉我最后必须执行什么操作,而且还告诉我如何加载操作数。在特定于地址模式的函数中,操作数被加载到指针中。指令立即数将根据需要进行存储。

这归结为类似于以下的结构:

struct instruction_t {
int32_t **operands;
int32_t *immediates;
};


这将基本上分配给每条指令(最大的缺点:内存消耗。对于最坏的情况(具有64位指针),我计算了大约40个字节,这意味着通常只有4位字节(仅16位指令)的程序会最后占用大约80 MB的内存。另一方面,我认为执行速度可能会相当快)。

使用这种方法,我便能够一次实现每条指令,因为操作数的加载方式无关紧要,而且用同一组操作数执行同一条指令的行为就像在真实机器上一样。执行代码仅意味着通过选择正确的结构并相应地调用指令函数来加载正确的操作数集。

我知道还有其他方法-我特别喜欢动态重新编译。但是随后,该系统变得非常复杂,具有不同的片上组件和I / O映射的寄存器,这无论如何都会增加大量的样板代码。

对于我的方法,我将不胜感激。也许您知道更好的方法?

谢谢!

最佳答案

(将我的方法转移到原始问题上。)

关于c++ - 何时在TriCore模拟器中加载操作数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10488171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com