Tag: assembly

‘asm’,’__ asm’和’__asm__’有什么区别?

据我所知, __asm { … };之间的唯一区别__asm { … }; 和__asm__(“…”); 是第一个使用mov eax, var ,第二个使用movl %0, %%eax使用:”=r” (var) 。 还有什么其他差异? 那么asm呢?

在x86和x64上读取同一页面内的缓冲区末尾是否安全?

如果允许在输入缓冲区末尾读取少量数据,那么在高性能算法中发现的许多方法都可以(并且被简化)。 这里,“少量”通常意味着超过结尾的W – 1个字节,其中W是算法的字节大小(例如,对于处理64位块中的输入的算法,最多7个字节)。 很明显, 写入输入缓冲区的末尾通常是不安全的,因为您可能会破坏缓冲区1之外的数据。 同样清楚的是,将缓冲区的末尾读取到另一页面可能会触发分段错误/访问冲突,因为下一页可能不可读。 但是,在读取对齐值的特殊情况下,页面错误似乎是不可能的,至少在x86上是这样。 在该平台上,页面(以及因此内存保护标志)具有4K粒度(较大的页面,例如2MiB或1GiB,可能,但这些是4K的倍数),因此对齐的读取将仅访问与有效页面相同的页面中的字节缓冲区的一部分。 这是一个循环的规范示例,它对齐其输入并在缓冲区末尾读取最多7个字节: int processBytes(uint8_t *input, size_t size) { uint64_t *input64 = (uint64_t *)input, end64 = (uint64_t *)(input + size); int res; if (size = 0) { return input + res; } // align pointer to the next 8-byte boundary input64 = (ptrdiff_t)(input64 + 1) & ~0x7; for […]

x86_64 ASM – 指令的最大字节数?

完整指令在x64 asm代码中需要的最大字节数是多少? 跳转到地址可能会占用多达9个字节我想: FF 00 00 00 00 11 12 3F 1F但我不知道这是否是x64指令可以使用的最大字节数

打印__m128i变量

我正在尝试学习使用内在函数进行编码,下面是一个添加代码的代码 compiler used: icc #include #include int main() { __m128i a = _mm_set_epi32(1,2,3,4); __m128i b = _mm_set_epi32(1,2,3,4); __m128i c; c = _mm_add_epi32(a,b); printf(“%d\n”,c[2]); return 0; } 我得到以下错误: test.c(9): error: expression must have pointer-to-object type printf(“%d\n”,c[2]); 如何在变量c打印__m128i类型的__m128i

在C中,给定变量参数列表,如何使用它们构建函数调用?

假设有一个以某种方式存储的参数列表,例如,在数组中。 给定一个函数指针 ,如何调用它来传递存储的参数列表? 我不是试图将数组作为参数传递好。 你明白了,好吗? 我想将每个元素作为参数传递。 数组只是为了说明,我可以将参数存储在一些元组结构中。 另外,看看我手头有一个函数指针,并且可能有字符串格式的签名 。 我不是只想定义一个能够处理可变列表的函数。 我看到如何做到这一点的唯一方法是使用汇编(通过__asm push et al。)或者: void (*f)(…); int main() { f = ; int args[]; int num_args = ; switch(num_args) { case 0: f(); break; case 1: f(args[0]); break; case 2: f(args[0], args[1]); break; /* etc */ } return 0; } 我不太喜欢这种做法…… 还有另一种便携式和更短的forms吗? 几种脚本语言可以调用C函数。 Python或Ruby等脚本语言如何做到这一点? 他们如何以便携方式实现它? […]