问题标签 [instruction-set]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - Tilera 和 SSE 中“缺少”算术指令。操作是如何完成的?
我浏览了Tilera 指令集,发现它只有加、减、乘、除和移位。没有提到根,权力,日志等。
我还注意到 SSE(所有口味)没有后面提到的说明。
Tilera 和 SSE 都是为基于数学的处理而设计的,例如视频编码,所以这让我很好奇。
在这种情况下(Tilera 和 SSE [不包括常规标量操作])如何执行这些操作之一?
c++ - 何时在 TriCore 仿真器中加载操作数?
这是我在 Stack Overflow 上的第一篇文章,所以我希望我做得正确。;-)
我正在尝试开发 TriCore 仿真器,但无法决定何时加载指令操作数的策略。TriCore 可能是一种相当不起眼的微控制器,所以让我稍微解释一下架构。
有两种类型的指令,16 位和 32 位。是16位还是32位,由最后一个字节的位0决定;由于字节顺序是小端,它始终是内存中的第一个字节。那里没问题。
这两种指令类型有几种操作码格式,14 种用于 16 位指令,25 种用于 32 位指令。操作码分为两个独立的操作码字段,尽管大多数 16 位的操作码只有一个操作码字段。第一个操作码字段在低 8 位;它直接描述了 16 位指令的指令,对于许多 32 位指令,它描述了操作数编码,而第二个字段描述了实际指令(当然也有例外)。
我的计划是始终提取所有操作码字段(这有点烦人,因为第二个字段的位置对于所有指令格式都不相同)并将它们放在一起成一个 16 位值,该值将用于函数指针表.
根据这个值,我想提取操作数。例如,当在 32 位指令中第一个操作码是0x8B
时,操作数是两个数据寄存器和一个 9 位常量。但是,也有一些非常乏味的例外情况:
ADD.A
andADDSC.A
指令都有操作码 1 0x01
== 。但是ADD.A
使用三个地址寄存器,而ADDSC.A
使用两个地址寄存器,一个数据寄存器和一个索引,编码到指令中。
最后我的问题是:在执行指令之前在这样的架构中加载操作数是否可行?还是先调用指令函数并在那里提取操作数会更好?
对于任何感兴趣的人,指令集手册在这里:http ://www.infineon.com/dgdl/tc_v131_instructionset_v138.pdf?folderId=db3a304412b407950112b409b6cd0351&fileId=db3a304412b407950112b409b6dd0352
感谢您的任何提示!
顺便说一句:选择的语言是 C 或 C++。
(应要求,我将我的想法插入到我原来的问题中。)
好吧,我广泛考虑了我拥有的不同选择,我想我会解决以下问题。
我将整个过程分为两个部分:
- 程序分析和操作数提取
- 执行
在第一步中,每条指令都被加载并对齐到 32 位。然后将加载的指令与一组位掩码进行比较,以确定正确的操作码,它不仅告诉我最终必须执行什么,还告诉我如何加载操作数。在特定于地址模式的函数中,操作数被加载到指针中;指令立即数根据需要存储。
这归结为类似于以下的结构:
这将基本上分配给每条指令(最大的缺点:内存消耗。我为这种最坏情况(使用 64 位指针)的结构计算了大约 40 个字节,这意味着通常只有 16 位指令的 4 MB 程序将最终占用大约 80 兆内存。另一方面,我认为执行速度可能相当快)。
使用这种方法,我可以只实现每条指令一次,因为我的操作数如何加载并不重要——另外,使用相同的操作数集执行相同的指令就像在真实机器上一样。代码的执行仅意味着通过选择正确的结构并相应地调用指令函数来加载正确的操作数集。
我知道还有其他方法——我特别喜欢动态重新编译。但是这个系统相当复杂,具有不同的片上组件和 I/O 映射寄存器,无论如何都会添加大量样板代码。
我非常感谢对我的方法的一些评论。也许您知道更好的方法?
谢谢!
arm - 什么是 ARM Thumb 指令集?
在“ARM11TechnicalRefManual”第 1-34 节的“Thumb 指令集”下,它说:
“Thumb 指令集是最常用的 32 位 ARM 指令的子集。Thumb 指令的长度为 16 位,对应的 32 位 ARM 指令对处理器型号的影响相同。”
任何人都可以解释更多关于这个特别是第二句话的内容,并说处理器是如何执行它的吗?
architecture - 进位标志过时了吗?
进位标志似乎有两个主要用途。1) 它对于链接加法/减法指令以对大于本机大小的数字进行操作很有用。例如,在 8 位架构上添加 32 位整数。2)它用于条件分支。还有一些不太常见的用途(例如,我在 intel 上使用过 fcomi)。特别是,进位标志不是从 C 或任何其他常见的非汇编语言定义或访问的。由于 32 位和 64 位架构非常普遍,大多数用 CI 编写的软件都不得不怀疑:
进位标志过时了吗?如果没有它的新架构出现,谁会错过它?
我假设它不需要作为条件代码(例如,用谓词替换标志),因此 AFAICT 仅用于链接 add/sub/rot 并且移入/移出它的效果将消失。
operating-system - 操作系统如何与声卡/视频卡等外围设备交互
据我了解,任何程序都会被编译成一系列针对其运行架构的汇编指令。我不明白的是操作系统如何与显卡等外围设备交互。驱动程序本身不就是CPU的一系列汇编指令吗?
我能想到的唯一一件事是它使用内存区域,然后由外围设备监视,或者它使用 BUS 来通信操作并接收结果。这个过程有没有简单的解释。
抱歉,如果这个问题太笼统,这一直困扰着我。
assembly - 有什么方法可以找到无证处理器的指令集?
有些处理器没有商业发布的文档来解释其指令集是什么。如果您可以访问处理器,有没有办法通过篡改或外部设备找到指令集?
hardware - 需要的最低组装说明是多少?
如果您要构建一个可用于运行任意程序的处理器,您可以使用的最少指令集 (ISA) 是多少?
我刚在想:
ALU-ops (add, sub, mul, div)
加载注册,[地址]
商店注册,[地址]
分支如果操作。如果不相等,则可能有分支,如果>,如果<(branchif reg1,reg2,LABEL)
你怎么看?
cpu-architecture - CISC指令长度
我想知道,当今大多数 CISC 架构上 CISC 指令的最大可能长度是多少?
我还没有找到明确的答案,但理论上建议它是 16 字节长。
在大约 15:00 分钟的视频中,为什么演讲者建议“理论上”,为什么正好是 16 个字节?
jvm - 如何设计基于堆栈的机器的指令集?
基于堆栈的虚拟机(如 CLR 和 JVM)具有不同的指令集。在创建虚拟机时设计指令集背后有什么理论吗?例如,有 JVM 指令集将常量从 0-5 加载到堆栈上
而在 CLR 中有指令集将数字从 0 加载到 8 到堆栈中,如下所示
为什么没有ldc.i4.9
,如果ldc.i4 <int32 (num)>
有,为什么我们需要上述操作码?还有其他类似的。
我很想知道不同VM的操作码之间存在这种差异的原因是什么?是否有任何特定的理论来设计这些操作码,或者它完全由 VM 本身的特性驱动,还是取决于高级语言结构?
c - ARM指令解码
我需要用 C 解码 ARM(ARM926EJ) 指令。我有 32 位十六进制指令。我想解码并获取操作码操作数。任何人都知道这方面的任何好材料。
注意我查看了 QEMU translate.c 文件。但它是如此复杂,甚至不知道为什么要做什么。