问题标签 [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.
x86 - CPU 寄存器中的字节顺序
我需要帮助了解 x86 处理器的 CPU 寄存器中的字节顺序。我写了这个小汇编程序:
我在 GDB 中运行这个程序,在第 10 行有一个断点(在上面的源代码中注释)。在此断点处,info registers显示 和 的eax=0x78ff5abc值ebx=0x5a595857。
由于 W、X、Y、Z 的 ASCII 码分别为 57、58、59、5A;英特尔是小端,0x5a595857 似乎是正确的字节顺序(最低有效字节在前)。为什么不是 eax 寄存器的输出0xbc5aff78(首先是数字 0x78ff5abc 的最低有效字节)而不是0x78ff5abc?
assembly - 与其他寄存器相比,eax 的不同行为
我编写了一个小程序集片段(Gas,32 位),它接受一个命令行参数,计算其字符数并在字符串具有一定长度时打印字符串(仅用于调试目的)。我对汇编比较陌生,所以我很确定我在这里错过了一些东西,因为与例如 ecx、edx 或 esi 相比,当我将字符串存储在 eax 中时,我会得到不同的行为。
这是片段。当您将 esi 替换为 eax 时,无论字符串有多长,循环只会输入两次,因此计数器 (ebx) 始终为 1。使用 esi 或其他寄存器,一切似乎都正常。
任何人都可以给我一个关于我做错了什么/误解的提示吗?
问候
cpu-architecture - 了解内存模型
我最近一直在阅读内存模型,我对它的工作原理有点困惑。
引用http://cis.poly.edu/muller/CS623/weakmemory.htm
如果处理器写入一个新的 X 然后写入一个新的 Y,所有其他随后执行读取 Y 然后读取 X 的处理器将访问新 Y 和新 X、旧 Y 和新 X 或旧 X 和旧Y:但是没有处理器会访问新的 Y 和旧的 X。这种强排序假设曾经是合理的。然而,当前的计算机制造商建议程序员不要依赖内存排序。这是因为较新的内存管理系统尝试重新排序内存访问以进行优化。允许对内存请求重新排序的系统称为弱排序内存系统(模型)。要检查如何使用重新排序来提高性能,请考虑以下汇编代码 [2]。
如果我们假设位置 B 当前在缓存中并且位置 A 没有缓存,那么加载 A 将比 B 花费更长的时间。CPU 可以从其缓存中获取 B,而不是等待 A,隐藏 B 的延迟:因此 CPU 可以执行A 可用时立即添加。通过放宽执行的强(顺序)内存模型(即,A 必须首先加载,然后是 B),可以获得更高的性能——但重新排序可能对软件不透明。考虑下面的代码片段,它是可用于实现自旋锁信号量的代码的一部分 [2]。
我的问题是,较弱的内存模型怎么可能导致处理器可以访问新 Y 和旧 X 的情况。它不是写入同一个内存(ram)还是工作方式不同?我假设如果一个进程修改了一个变量,然后另一个进程读取它,它会读取最新的值。
我不确定的另一件事是哪个组件允许内存访问重新排序,我现在的假设是允许编译器重新排序指令。但是 CPU 也可以重新排序它们吗?
谢谢
c# - 哪些方案可以最大限度地提高 x64 系统中更高寄存器数量对 C# 代码的性能影响?
来自 Eric Lippert 的博客The truth about value types很明显,寄存器的数量可能会对代码性能产生重大影响。从 x64 系统中较高的寄存器数量中获益最多的代码标准是什么?有什么好的例子吗?
我很清楚,寄存器计数不是 x64 平台的唯一,甚至不是最重要的方面,但如果有这样的标准,我们计划在其上运行代码的平台是否会影响我们的编写方式我们的代码?
c++ - 函数参数的编译器优化
函数参数放置在堆栈上,但编译器可以通过使用可选寄存器来优化此任务。如果只有 1-2 个参数,而不是有 256 个参数时,这种优化就会启动是有道理的(并不是说希望有最大数量的参数)。
如何找出某个编译器(例如 gcc)的参数限制(参数数量),在哪里可以确定会使用这种优化?
assembly - 汇编:使用数据段寄存器 (DS)
目前我正在学习 x86 汇编以获得乐趣,我喜欢微控制器编程,所以我熟悉汇编。
目前我一直在寻找这个问题的答案,但似乎找不到...... DS寄存器,我知道它应该指向我程序中的全局数据,但我没有知道它是如何工作的。我正在使用 NASM,在大多数简单的程序中,我看到以下内容:
并且效果很好(即使我省略了粗体代码),但是如何?CPU 会自动加载从 0x0000 开始的全局变量吗?还是我缺少一些内在的东西?
debugging - 在 Ride7 IDE 的寄存器窗口中设置每行的默认寄存器
这个问题是关于 Raisonance 的 Ride7 IDE 中的 CPU 寄存器视图。
调试时,每行显示的默认寄存器数量为 8,但我更喜欢这个窗口又长又细,最后每次调试运行时将其更改为每行 1 个寄存器。这很烦人,我想知道是否有办法更改默认值?
我已经查看了所有明显的地方,但找不到任何东西。
floating-point - MXCSR 控制寄存器的范围?
我想知道MXCSR 控制寄存器中存储的值的生命周期是多少(包括非正规浮点数的 FTZ 和 DAZ 配置):它是在线程范围内,还是 CPU 上的所有处理都通用/FPU?
我想知道的是我是否需要在线程池的每个线程开始时或在应用程序中设置它(MXCSR),或者它会影响应用程序和/或系统中的其他所有内容?
谢谢你的帮助!
c - 我是否必须在从 C 调用的汇编代码中初始化 CPU 寄存器?
我正在阅读 Paul Carter 的pcasm书。它使用 NASM,一个调用我的汇编代码的 C 驱动程序应用程序,以及一个使在汇编中进行基本 I/O 变得容易的配套库。
这就是我将从 C 调用的函数的样子:
该print_int函数将存储的值打印eax为整数。但这会将垃圾打印到标准输出:
如果我在使用之前将ecx寄存器初始化为 0,我将得到预期的输出:mov ecx, 0000h
是否总是需要初始化,如果需要,是否有一种从 C 或 NASM 将所有寄存器初始化为 0(或用户定义的初始化程序)的快速方法?
我正在使用 XP32、MinGW 4.4.0 和 NASM 2.09.04。
assembly - 为什么 OllyDbg 中的 cpu 寄存器没有按字母顺序排序?
在 OllyDbg 中,寄存器窗口中列出了标准的 cpu 寄存器:
最后显示EBX有什么特别的原因吗?