问题标签 [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 投票
2 回答
409 浏览

low-level - 可以使用寄存器的增量来确定时钟速率吗?

可以使用寄存器的增量(在循环中)来确定(有效)时钟速率吗?我很自然地认为它可以,但有人评论说 Cpu 可能会植入超标量技术,使这种计算变得无用。另外有人告诉我,CPU 上的寄存器的递增可以在不到一个时钟周期内完成。

是真的吗?

0 投票
7 回答
4167 浏览

memory - 从 16 位硬件寄存器中读取

在嵌入式系统上,我们有一个设置允许我们通过命令行界面读取任意数据以进行诊断。对于大多数数据,这很好用,我们使用memcpy()在请求的地址复制数据并通过串行连接将其发送回。

但是,对于 16 位硬件寄存器,memcpy()会导致一些问题。如果我尝试使用两个 8 位访问来访问 16 位硬件寄存器,则无法正确读取高位字节。

有没有人遇到过这个问题?我是一个“高级”(C#/Java/Python/Ruby)的人,正在向硬件靠拢,这是一个陌生的领域。

处理这个问题的最佳方法是什么?我看到了一些信息,具体来说,这里的 [to me] 有点令人困惑。这篇文章的作者有完全相同的问题,但我讨厌在不完全理解我在做什么的情况下实施解决方案。

非常感谢您对这个问题提出的任何看法。谢谢!

0 投票
2 回答
736 浏览

graphics - GMA 950 硬件的寄存器级编程

我正在尝试为 GMA 950 硬件编写基本驱动程序。我一直在寻找数据表或一些编程指南,但找不到任何东西。我还查看了 Linux 和 FreeBSD 源代码,但它们非常大,需要时间才能理解。GMA 950 与 Intel 945 Express 芯片组相关联。有谁知道我可以为 950 和/或 945 编写硬件寄存器级代码的好文档?

谢谢,调频

0 投票
2 回答
1425 浏览

compiler-construction - 被调用者保存调用者传递使用的寄存器?

在编译器设计中,为什么调用者不能将其已用寄存器列表(在调用者保存安排的情况下它将推送)传递给被调用者,以便被调用者可以比较它的而不是调用者或被调用者寄存器保存安排使用的寄存器列表到调用者使用的寄存器。然后只有真正需要推送的寄存器才会被推送。我错过了什么吗?

0 投票
6 回答
16536 浏览

assembly - 术语:汇编语言编程中的“寄存器”

我听说过这些术语:寄存器、硬件寄存器、程序寄存器、寄存器文件。

所有这些有什么区别?在汇编中,EAX 寄存器的类型是什么?程序寄存器?

0 投票
3 回答
32168 浏览

assembly - 在 MIPS 的 HI 和 LO 寄存器中存储值

我正在 MIPS 中编写某些代码,我已经到了需要将结果临时存储在特殊寄存器(均为 4 字节宽)HI中的地步。LO这些说明可供我使用:

因此,divu将除法的结果LO和余数存储在 中HI,而multu将乘法的结果存储在LO(低 4 字节)和HI(高 4 字节)中。

稍后,要从寄存器中检索结果,我可以HILO

我已经想出了如何将计算结果存储在LO

  • divu除法的结果存储在 LO 中,所以我只需将结果除以 1 即可。

但是,存储起来HI更复杂。一种方法是强制multu指令将值移动 32 位(4 字节):

但是,结果是 in 的值在HI它应该在的位置右边 1 位(所以如果我的值是,0100 1000那么HI将包含0010 0100)。

有谁知道如何在HI寄存器中存储一些东西?

0 投票
3 回答
360 浏览

c - 在 C 中嵌入程序集,编译器为您查找寄存器

将汇编代码嵌入到 C/C++ 程序中时,您可以通过使用 push 指令保存寄存器来避免破坏寄存器(或指定编译器支持它的 clobber 列表)。

如果您包含汇编内联并希望避免推送和弹出破坏寄存器的开销,有没有办法让 gcc 为您选择寄存器(例如,它知道其中没有有用信息的寄存器)。

0 投票
2 回答
6912 浏览

c++ - PIC 寄存器 (%ebx) 有什么作用?

我用 C++ 编写了一个“危险”程序,它从一个堆栈帧来回跳转到另一个堆栈帧。目标是从调用堆栈的最低级别跳转到调用者,做某事,然后再次向下跳转,每次跳过中间的所有调用。

我通过手动更改堆栈基地址(设置%ebp)并跳转到标签地址来做到这一点。它完全可以使用 gcc 和 icc ,完全没有任何堆栈损坏。这工作的那一天是凉爽的一天。

现在我正在使用相同的程序并用 C 重新编写它,但它不起作用。具体来说,它不适用于 gcc v4.0.1 (Mac OS)。一旦我跳转到新的堆栈帧(堆栈基指针设置正确),就会执行以下指令,就在调用fprintf. 此处列出的最后一条指令崩溃,取消引用 NULL:

我已经进行了一些调试,我发现通过%ebx在切换堆栈帧时手动设置寄存器(使用我在离开函数之前观察到的值),我修复了这个错误。我读过这个寄存器处理 gcc 中的“位置无关代码”。

什么是位置无关代码?位置无关代码如何工作?这个寄存器指向什么?

0 投票
5 回答
1674 浏览

exception - Windows:避免在堆栈上推送完整的 x86 上下文

我已经实现了PARLANSE,这是一种 MS Windows 下的语言,它使用仙人掌堆栈来实现并行程序。堆栈块是在每个函数的基础上分配的,并且大小正好适合处理局部变量、表达式临时推送/弹出和库调用(包括库例程工作的堆栈空间)。这种堆栈帧实际上可以小到 32 字节,而且通常如此。

这一切都很好,除非代码做了一些愚蠢的事情并导致硬件陷阱......此时Windows似乎坚持将整个x86机器上下文“推入堆栈”。如果包含 FP/MMX/等,这大​​约是 500+ 字节。注册,它确实如此。自然地,对 32 字节堆栈的 500 字节推送会破坏它不应该的东西。(硬件在陷阱上推了几句话,但不是整个上下文)。

[编辑 2012 年 11 月 27 日:有关Windows 实际推送的可笑堆栈数量的测量详细信息,请参阅此内容]

我可以让 Windows 将异常上下文块存储在其他地方(例如,存储到特定于线程的位置)吗?然后,软件可以处理线程上的异常并处理它,而不会溢出我的小堆栈帧。

我不认为这是可能的,但我想我会问更多的观众。是否有可能导致这种情况发生的操作系统标准调用/接口?

如果我可以让 MS 让我的进程有选择地定义一个上下文存储位置“contextp”,那么在操作系统中做这件事将是微不足道的,默认情况下,该位置已初始化为启用当前的遗留行为。然后替换中断/陷阱向量代码:

... 和 ...

具有保存 somereg 等所需的明显更改。

[我现在要做的是:检查每个函数的生成代码。如果它有机会生成陷阱(例如,除以零),或者我们正在调试(可能是错误的指针 deref 等),请为 FP 上下文的堆栈帧添加足够的空间。堆栈帧现在最终大小为 ~~ 500-1000 字节,程序不能递归到那么远,这对于我们正在编写的应用程序来说有时是一个真正的问题。所以我们有一个可行的解决方案,但它使调试变得复杂]

编辑 8 月 25 日:我设法将这个故事传达给了一位微软内部工程师,他显然有权找出 MS 中谁可能真正关心。解决的希望渺茫。

编辑 9 月 14 日:MS Kernal Group Architect 听说了这个故事并且很同情。他说 MS 将考虑一种解决方案(如提议的解决方案),但不太可能包含在服务包中。可能需要等待下一个版本的 Windows。(叹息……我可能会变老……)

编辑:2010 年 9 月 13 日(1 年后)。微软没有采取任何行动。我最近的噩梦:在 Windows X64 上运行 32 位进程的陷阱是否会在中断处理程序假装推送 32 位上下文之前将整个 X64 上下文推送到堆栈上?那会更大(整数寄存器的两倍宽,SSE 寄存器的两倍(?))?

编辑:2012 年 2 月 25 日:(1.5 年过去了……)微软方面没有任何反应。我想他们只是不关心我的并行性。我认为这是对社区的伤害;MS 在正常情况下使用的“大堆栈模型”限制了通过吃大量 VM 可以在任何时刻活着的并行计算量。PARLANSE 模型将让一个应用程序拥有一百万个处于运行/等待状态的实时“颗粒”;这确实发生在我们的一些应用程序中,其中“并行”处理了 1 亿个节点图。PARLANSE 方案可以使用大约 1Gb 的 RAM 来做到这一点,这非常易于管理。如果您尝试使用 MS 1Mb“大堆栈”,您将需要 10^12 字节的 VM 仅用于堆栈空间,而我

编辑:2014 年 4 月 29 日:(4 年过去了)。 我猜MS只是不读SO。 我在 PARLANSE 上做了足够多的工程,所以我们只在调试期间或进行 FP 操作时支付大堆栈帧的代价,所以我们设法找到了非常实用的方法来解决这个问题。MS继续令人失望;不同版本的 Windows 推送到堆栈上的东西的数量似乎有很大差异,而且超出了对硬件上下文的需求。有一些迹象表明,这种可变性的某些原因是由于非 MS 产品(例如防病毒)在异常处理链中卡住了它们的鼻子。为什么他们不能从我的地址空间之外做到这一点?无论如何,我们通过简单地为 FP/调试陷阱添加一个大的溢出因子来处理所有这些,并等待现场中不可避免的 MS 系统超过该数量。

0 投票
6 回答
2521 浏览

c++ - 整数和寄存器大小之间有关系吗?

最近,我在最近的一次采访中遇到了一个字符串操作问题,并被要求优化性能。我不得不使用迭代器在 TCHAR 字符之间来回移动(支持 UNICODE - 每个 2 字节)。

没有真正考虑数组长度,我犯了一个错误,没有使用 size_t 而是使用 int 进行迭代。我了解它不合规且不安全。

但是,我们可以分配的最大内存是有限的。如果 int 和寄存器大小之间存在关系,则使用整数可能是安全的。

例如:没有任何虚拟映射工具,我们只能映射 2^register-size 个字节。由于 TCHAR 的长度为 2 个字节,因此是该数字的一半。对于任何将 int 作为 32 位的系统,即使您不使用 int 的无符号版本,这也不会成为问题。有嵌入式背景的人曾经认为 int 是 16 位的,但是在这样的设备上内存大小会受到限制。所以我想知道整数和寄存器大小之间是否存在架构微调决定。