问题标签 [cpu-registers]

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.

0 投票
3 回答
23465 浏览

jvm - 为什么 JVM 是基于栈的,而 Dalvik VM 是基于寄存器的?

我很好奇,为什么 Sun 决定让 JVM 堆栈为基础,而 Google 决定让 DalvikVM 以寄存器为基础?

我想JVM不能真正假设目标平台上有一定数量的寄存器可用,因为它应该是平台独立的。因此,它只是将寄存器分配等推迟到 JIT 编译器。(如我错了请纠正我。)

所以安卓的人想,“嘿,那太低效了,让我们马上去一个基于寄存器的虚拟机......”?但是等等,有多个不同的 android 设备,Dalvik 的目标寄存器是多少?Dalvik 操作码是否针对一定数量的寄存器进行了硬编码?

市场上所有当前的 Android 设备是否具有大致相同数量的寄存器?或者,在 dex 加载期间是否执行了寄存器重新分配?这一切如何结合在一起?

0 投票
7 回答
4044 浏览

c - 此代码会损坏我的处理器吗?

一位朋友向我发送了该代码并声称它可能会损坏处理器。真的吗?

真的吗?

0 投票
2 回答
13208 浏览

memory-address - 如何正确计算地址空间?

以下是我在计算机工程课程中的最后一次测试中给出的问题示例。有人介意向我解释如何获取每个的开始/结束地址吗?我已经在底部列出了正确的答案...

MSP430F2410 器件的地址空间为 64 KB(基本的 MSP430 架构)。如果我们知道以下内容,请填写下表。地址空间的前 16 个字节(从地址 0x0000 开始)为特殊功能寄存器(IE1、IE2、IFG1、IFG2 等)保留,接下来的 240 个字节为 8 位外围设备保留,下一个256 字节为 16 位外围设备保留。RAM 内存容量为 2 KB,从地址 0x1100 开始。地址空间的顶部是为代码和中断向量表保留的 56KB 闪存。

0 投票
4 回答
7199 浏览

testing - 在 ia32 中测试寄存器是否等于自身

(ia32) 例如,

你为什么要那样做?确实如此$eax & $eax,对吧?这不应该总是设置标志寄存器说它们是平等的..吗?

附录: 所以如果寄存器为零,测试将设置 ZF(如下所述)。那么测试(如上所述)是否主要用于判断寄存器是否为空?如果是这样,ZF 是否已设置?

0 投票
4 回答
14533 浏览

performance - 在原始 8086 上将寄存器设置为 1 或 (-1) 的最有效方法

我现在正在学习组装课程,检查我们家庭作业的人是一个非常迂腐的老派优化怪胎。例如,如果他看到以下内容,他会扣除 1​​0%:

代替:

即使它只用过一次。

我不是汇编编程的完整初学者,但我不是优化专家,所以我需要你的帮助(可能是一个非常愚蠢的问题,但我还是会问):如果我需要将寄存器值设置为 1或(-1)更好地使用:

或执行以下操作:

我真的需要一个好成绩,所以我试图让它尽可能优化。(我需要优化时间和代码大小)

0 投票
1 回答
559 浏览

assembly - 近指针的隐式段寄存器是如何确定的?

英特尔 64® 和 IA-32 架构软件开发人员手册的第 4.3 节中。第 1 卷:基本架构,它说:

Near 指针是一个段内的 32 位偏移量。Near 指针用于平面内存模型中的所有内存引用或分段模型中的引用,其中隐含了正在访问的段的身份。

这让我想知道:隐含的段寄存器是如何确定的?

我知道默认情况下使用(%eip)和置换(%eip)(例如-4(%eip))地址%cs(%esp)并且置换(%esp)地址使用%ss,但是,,,(%eax)等等,(%edx)隐式段寄存器是否也取决于内存地址操作数出现的指令?(%edi)(%ebp)

0 投票
7 回答
22424 浏览

c - 是否可以在 C 中访问 32 位寄存器?

是否可以在 C 中访问 32 位寄存器?如果是,如何?如果没有,那么有没有办法在 C 中嵌入汇编代码?顺便说一句,我正在使用 MinGW 编译器。提前致谢!

0 投票
2 回答
5381 浏览

assembly - 如何在 Linux 64 位上从 C 编写简单的内联 asm 指令?

我正在编写一个简单的 c 程序,我的要求是从程序的某些函数中打印 RIP(指令指针)。我不想使用 ptrace。

我尝试使用内联 asm 的一件事是: asm("movl %%rip, %0;" : "=r"(val) ) 这应该将我的 rip 寄存器值复制到变量 val,但我收到编译错误。

如果我使用 ebp/esp,它们是 32 位机器的基本指针和堆栈指针,我不会收到任何编译错误,并且我的 val 分配了一些十六进制数。

我这里有几个问题:

1)由于我的机器是 63 位的,上面的指令是如何读取 32 位寄存器的?

2) 为什么我无法读取 64 位的任何寄存器,'r' 的b'caz 有什么问题吗?

3) 当我使用 32 位的 eip 时出现编译错误,这是否意味着 IP 寄存器被限制读取?

0 投票
7 回答
827 浏览

c - 是否有检测硬件位宽的标准方法?

据称 int 类型的变量是“长度为一个机器类型的字”,但在嵌入式系统中,用于 8 位微的 C 编译器使用 16 位 int!,(对于 unsigned char 为 8 位)然后对于更多位,int 表现正常:在 16 位 micros 中,int 也是 16 位,在 32 位 micros 中,int 是 32 位,等等。

那么,有没有一种标准的方法来测试它,比如 BITSIZEOF(int) ?

像“sizeof”是针对字节但针对位的。

这是我的第一个想法

但是它需要 c 作为 int,并且在 8 位编译器中使用 int 作为 16 位是很常见的,所以它给了我 16 作为结果,似乎没有使用“int”作为“寄存器宽度”的标准,(或者它不是尊重)

为什么我要检测它?假设我需要许多需要少于 256 个值的变量,因此它们可以是 8、16、32 位,但是使用正确的大小(与内存和寄存器相同)将加快速度并节省内存,如果这不能在代码中决定,我必须为每个架构重新编写函数

编辑 阅读答案后,我发现这篇好文章

http://embeddedgurus.com/stack-overflow/category/efficient-cc/page/4/

我将引用结论(加粗)

因此,底线是这样的。如果您想开始编写高效、可移植的嵌入式代码,您应该采取的第一步是开始使用 C99 数据类型“最少”和“快速”。如果您的编译器不符合 C99,那么请 投诉直到它符合 - 或更换供应商。如果您进行此更改,我认为您会对您将实现的代码大小和速度的改进感到惊喜。

0 投票
3 回答
394 浏览

c++ - 这是一个有效的 C 代码吗?

可能重复:
代码有什么作用?

以上是有效的 C 代码吗?如果是这样,它试图达到什么目的,为什么有人会做类似上述的事情?