8得票2回答
在x86 CPU上估计中断延迟时间

我正在寻找有助于估计x86 CPU中断延迟的信息。我在“datasheets.chipdb.org/Intel/x86/386/technote/2153.pdf”上发现了一篇非常有用的论文。但是这篇论文为我提出了一个非常重要的问题:如何定义等待当前指令完成的延迟时间?我的意思是INTR信号被...

10得票1回答
在加载数字流时避免缓存污染

在x86处理器上,是否有一种方法可以将数据从常规写回内存加载到寄存器中,而不经过缓存层次结构? 我的用例是我有一个大的查找结构(哈希映射或B-Tree)。我正在处理一个大量的数字流(比我的L3缓存更大但适合内存)。我想要做的事情非常简单: int result = 0; for (nu...

13得票4回答
使用Core 2 CPU(SSSE3)计算大缓冲区的比特流行计数

我正在寻找在512字节或更多字节的大缓冲区上进行popcount的最快方法。我可以保证任何所需的对齐方式,并且缓冲区大小始终是2的幂。缓冲区对应于块分配,因此通常位要么全部设置,要么不设置,或者大部分设置偏向于缓冲区的“左侧”,偶尔有空洞。 我考虑过的一些解决方案是: - GCC的__bu...

13得票2回答
对于bsr和lzcnt的困惑

我对这两个指令有点困惑。 首先,让我们放弃扫描值为0和未定义的/bsr或bitsize/lzcnt结果的特殊情况 - 这种差异是清楚的,而且不属于我的问题。 让我们取二进制值0001 1111 1111 1111 1111 1111 1111 1111 根据英特尔的规格,lzcnt的结果为...

10得票2回答
在Linux上使用汇编输出整数

我需要在纯汇编中完成这个任务(即没有使用库或调用C函数)。 我理解问题的本质:需要将整数除以10,将一位数字余数转换为ASCII,输出并重复这个过程直到商为0。 但出于某种原因,它就是不起作用。 我正在使用x86上的NASM。 以下是我现在拥有的代码(不输出任何内容,但也不会抛出任何汇编...

84得票3回答
在Win32上将双精度浮点数强制转换为无符号整型会截断为2,147,483,648。

编译以下代码:double getDouble() { double value = 2147483649.0; return value; } int main() { printf("INT_MAX: %u\n", INT_MAX); ...

20得票1回答
为什么在关闭优化时,Clang不使用内存目标x86指令?它们是否高效?

我编写了这个简单的汇编代码,运行并使用GDB查看了内存位置: .text .global _main _main: pushq %rbp movl $5, -4(%rbp) addl $6, -4(%rbp) popq %rbp ...

26得票3回答
为什么在x86上代码应该对齐到偶地址边界?

我正在学习Kip Irvine的"Assembly Language for x86 Processors, sixth edition",并且非常喜欢它。 我刚刚在下面的段落中读到了NOP助记符: 有时编译器和汇编程序员使用它[NOP]将代码对齐到偶数地址边界。 给出...

12得票4回答
从FPU堆栈中移除某个内容的最简单方法

我最近在处理FPU栈溢出的问题。我成功地将其追踪到一个有缺陷的库函数,每次调用它时都会将垃圾值推送到FPU栈上,并且从不清理。 幸运的是,这很容易重现,并且我知道确切的条件。我可以将一块内嵌的ASM代码放入调用此例程的例程中,以弹出FPU堆栈的顶部值...除非我不太知道该写什么。我的ASM功...

11得票2回答
如果我要用汇编语言编写程序,这个HelloWorld汇编代码的哪些部分是必不可少的?

我有这个简短的 Hello World 程序:#include <stdio.h> static const char* msg = "Hello world"; int main(){ printf("%s\n", msg); return 0; } 我使用g...