问题标签 [x86]

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 回答
2588 浏览

assembly - MASM32 内存位置

我正在尝试使用 masm32 程序集从主内存中读取数据,为了做到这一点,我创建了(如先前在我的另一个问题的答案中所建议的那样)一个数组,该数组将包含非常分离的内存位置(以避免从缓存)。我已经设法创建了数组并让它被读取,但是,我有一个问题。我已经做过并测试过的这个数组正在使用我给它的数据(即数字)并且一切正常。但是我需要内存位置,但我在任何地方都找不到地图或对这些位置的引用。我的意思是我需要类似的东西:

但我应该使用相应的内存位置保留字而不是使用数字。但我找不到它们 =( 甚至不知道还要寻找什么。


编辑

让我检查一下是否正确,然后您告诉我可以(而不是使用数组,而是使用变量之间的所有空间来强制从主存储器读取,对吗?

0 投票
9 回答
19769 浏览

c++ - 我可以在多核 x86 CPU 上强制缓存一致性吗?

另一周,我写了一个小线程类和一个单向消息管道来允许线程之间的通信(显然,每个线程有两个管道,用于双向通信)。在我的 Athlon 64 X2 上一切正常,但我想知道如果两个线程都在查看同一个变量并且每个内核上该变量的本地缓存值不同步,我是否会遇到任何问题。

我知道volatile关键字会强制变量从内存中刷新,但是多核 x86 处理器有没有办法强制所有内核的缓存同步?这是我需要担心的事情吗,或者轻量级锁定机制的volatile和正确使用(我使用 _InterlockedExchange 设置我的 volatile 管道变量)会处理我想为多核 x86 CPU 编写“无锁”代码的所有情况?

我已经知道并使用了关键部分、互斥体、事件等。我主要想知道是否有 x86 内在函数我不知道哪种力或可用于强制缓存一致性。

0 投票
3 回答
1058 浏览

.net - 构建时如何在 .NET 依赖链上要求 x86

我们有几个项目使用p4.net,一个托管 DLL,它又依赖于 p4dn.dll,一个 32 位非托管 DLL。这在 x64 系统上存在问题,所以我不得不去每个使用 p4.net 的项目并将其处理器类型设置为 x86。

如果我理解正确的问题,那就是当 .NET 加载一个 exe 时,它​​会检查清单,如果没有,它会做最适合处理器类型的任何事情。然后,当它运行到 32 位 dll 时,它会呕吐。

我可以去每个使用 p4.net 的项目并将其标记为 32 位。但是我们有很多这样的。此外,人们将继续制作新的并忘记设置 32 位,然后当其他人尝试在 x64 上使用它时,我们将再次遇到此问题。

我的问题是:有没有办法让 .NET 自动加载任何使用 p4dn.dll 作为 32 位的应用程序?如果做不到这一点,IDE 有没有办法检测到这一点并且无法构建?

或者是否可以制作一个我可以放在 p4api 或 p4dn.dll 旁边的 .manifest 文件,以便使用它们的任何应用程序将自动以 32 位运行?

0 投票
10 回答
21437 浏览

debugging - 你最喜欢的反调试技巧是什么?

在我以前的雇主中,我们使用了一个第三方组件,它基本上只是一个 DLL 和一个头文件。该特定模块在 Win32 中处理打印。但是,制造该组件的公司破产了,所以我无法报告我发现的错误。

所以我决定自己修复错误并启动调试器。我很惊讶地发现反调试代码几乎无处不在,通常IsDebuggerPresent是这样,但引起我注意的是:

乍一看,我只是跳过了被调用两次的例程,然后事情就变得一团糟。过了一会儿,我意识到位旋转的结果总是一样的,即 jmp eax 总是直接跳到mov eax, 0x310fac09指令中。我剖析了这些字节,它是用于测量 DLL 中一些调用之间所用时间0f31的指令。rdtsc

所以我的问题是:你最喜欢的反调试技巧是什么?

0 投票
1 回答
1880 浏览

c - 耗尽 Intel Core 2 Duo 的指令流水线?

我正在为 C 中的一些非常短的操作编写一些微基准测试代码。例如,我正在测量的一件事是根据传递的参数数量调用一个空函数需要多少个周期。

目前,我在每次操作之前和之后使用 RDTSC 指令进行计时,以获取 CPU 的循环计数。但是,我担心在第一个 RDTSC 之前发出的指令可能会减慢我正在测量的实际指令。我还担心在第二个 RDTSC 发布之前,完整的操作可能还没有完成。

有谁知道在发出任何新指令之前强制所有正在进行的指令提交的 x86 指令?我被告知 CPUID 可能会这样做,但我一直无法找到任何这样说的文档。

0 投票
5 回答
57599 浏览

performance - EBP帧指针寄存器的作用是什么?

我是汇编语言的初学者,并且注意到编译器发出的 x86 代码即使在发布/优化模式下通常也会保留帧指针,因为它可以将EBP寄存器用于其他用途。

alloca()我理解为什么帧指针可能会使代码更容易调试,并且如果在函数中调用它可能是必要的。但是,x86 的寄存器很少,并且使用其中的两个来保存堆栈帧的位置,而一个就足够了,这对我来说没有意义。为什么即使在优化/发布版本中省略帧指针也被认为是一个坏主意?

0 投票
1 回答
1097 浏览

assembly - 如何在 x86 上为我的语言最好地传递全局偏移表 (GOT)?

我正在为我的语言编写一个小程序加载器,因为我放弃了理解 ELF 格式(在这样做的同时,我最终可能会更好地理解它)。我将文件映射到内存中,然后无尾礼服欢欣鼓舞。

我不想通过对其进行任何更改来阻碍程序的共享。因此,我最终做了与 C 和 elf 相同的操作:全局偏移表。

问题是:我怎样才能通过我的程序的 GOT?

首先想到的是在寄存器或堆栈参数中提供它。在寄存器中它会很棒,但是 x86 被它的寄存器数量所阻碍。这可能意味着我将失去 ebx 或 ebp 或类似的东西。在一个合理的架构中,这将是一个公平的权衡。在 x86 中感觉有点失败。

共享库的反汇编显示 gcc 正在将其作为 IP 相对寻址。如果我这样做,那将是:

虽然,这在一定程度上感觉很复杂。我不喜欢这样做。

还有什么想法,有人吗?

编辑:当使用多个库处理此问题时,我意识到:每个应用程序将有多个 GOT,并且某些 GOT 的使用取决于我所在的代码块。因此将 GOT 保存在单独的寄存器中需要一些我不知道的其他技巧。我想知道他们在将 GOT 保存在寄存器中时如何解决这个问题。

0 投票
7 回答
25028 浏览

assembly - 直接读取程序计数器

可以在内核模式或其他模式下直接读取 Intel CPU 上的程序计数器(即没有“技巧”)吗?

0 投票
4 回答
4386 浏览

c++ - 可以捕获写入地址(x86 - linux)

我希望能够检测何时发生对内存地址的写入 - 例如通过设置附加到中断的回调。有谁知道怎么做?

我希望能够在运行时执行此操作(可能 gdb 具有此功能,但我的特定应用程序导致 gdb 崩溃)。

0 投票
1 回答
1317 浏览

assembly - 使用 x86 CMPXCHG 比较和交换的 D 函数

我正在寻找一个函数,它为Intel x86 上的原子 CAS提供高级D接口。

我知道我可以使用内联 ASM 来做到这一点(如果需要,我会这样做),但如果可以的话,我宁愿从其他人那里获取代码。