Tag: x86

使用xchg时我们需要mfence吗?

我有一个基于xchg的assembly和测试assembly锁。 我的问题是: 使用xchg指令时是否需要使用内存防护( mfence , sfence或lfence )? 编辑: 64位平台:采用Intel nehalem

CFI指令意味着什么? (还有一些问题)

好的,这将是一个很长的问题。 我试图理解“缓冲区溢出”是如何工作的。 我正在阅读通过aleph1 粉碎堆栈以获得乐趣和利润 ,并且刚刚获得了以下代码的反汇编: void function(int a, int b, int c) { char buffer1[5]; char buffer2[10]; } void main() { function(1,2,3); } 使用GCC的-S标志的disameembly给了我: .file “example1.c” .text .globl function .type function, @function function: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $48, %rsp movl %edi, -36(%rbp) movl %esi, […]

为什么gcc autovectorization对3×3的卷积矩阵不起作用?

我已经为卷积矩阵实现了以下程序 #include #include #define NUM_LOOP 1000 #define N 128 //input or output dimention 1 #define MN //input or output dimention 2 #define P 5 //convolution matrix dimention 1 if you want a 3×3 convolution matrix it must be 3 #define QP //convolution matrix dimention 2 #define Csize P*Q #define Cdiv 1 //div for filter #define […]

与双打混合时使用int和unsigned int之间的速度差异

我有一个应用程序,内部循环的一部分基本上是: double sum = 0; for (int i = 0; i != N; ++i, ++data, ++x) sum += *data * x; 如果x是unsigned int,那么代码的长度是int的3倍! 这是一个更大的代码库的一部分,但我把它归结为基本要素: #include #include #include #include typedef unsigned char uint8; template double moments(const uint8* data, int N, T wrap) { T pos = 0; double sum = 0.; for (int i = 0; […]

这条指令的作用是什么?: – mov%gs:0x14,%eax

我的问候和对所有人的问候。 我有一个C程序,基本上是为了测试缓冲区溢出而写的。 #include void display() { char buff[8]; gets(buff); puts(buff); } main() { display(); return(0); } 现在我使用GDB反汇编它的显示和主要部分。 代码:- 函数main的汇编代码转储: 0x080484ae : push %ebp # saving ebp to stack 0x080484af : mov %esp,%ebp # saving esp in ebp 0x080484b1 : call 0x8048474 # calling display function 0x080484b6 : mov $0x0,%eax # move 0 into eax , […]

如何测量x86下纳秒以下的时间?

我搜索并使用了许多方法来测量经过的时间。 为此目的有很多问题。 例如, 这个问题非常好,但是当你需要一个准确的时间记录器时,我找不到一个好的方法。 为此,我想在这里分享我的方法以便在出现问题时予以纠正。 更新和注意:这个问题是基准测试,不到一纳秒。 它与使用clock_gettime(CLOCK_MONOTONIC,&start);完全不同clock_gettime(CLOCK_MONOTONIC,&start); 它记录的时间超过一纳秒。 更新:测量加速的常用方法是重复应该进行基准测试的程序部分。 但是,正如评论中所提到的,当研究人员依赖自动向量化时,它可能会显示出不同的优化。 注意一次重复测量经过的时间是不够准确的。 在某些情况下,我的结果显示该部分必须重复超过1K或1M才能获得最短的时间。 建议:我不熟悉shell编程(只知道一些基本命令……)但是,有可能测量最小的时间而不重复程序内部。 我的当前解决方案为了防止分支,我使用宏#define REP_CODE(X) XX X… XX重复ode部分,其中X是我想要基准的代码部分,如下所示: //numbers #define FMAX1 MAX1*MAX1 #define COEFF 8 int __attribute__(( aligned(32))) input[FMAX1+COEFF]; //= {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}; int __attribute__(( aligned(32))) output[FMAX1]; int __attribute__(( aligned(32))) coeff[COEFF] = {1,2,3,4,5,6,7,8};//= {1,1,1,1,1,1,1,1};//; //= {1,2,1,2,1,2,1,2,2,1}; int main() { REP_CODE( t1_rdtsc=_rdtsc(); //Code for(i = 0; i < […]

在32位计算机上实现64位运算

以下代码计算x和y的乘积,并将结果存储在内存中。 数据类型ll_t被定义为等于long long。 typedef long long ll_t; void store_prod(ll_t *dest, int x, ll_t y) { *dest = x*y; } gcc生成以下汇编代码来实现计算:dest at%ebp + 8,x at%ebp + 12,y at%ebp + 16 1 movl 16(%ebp), %esi 2 movl 12(%ebp), %eax 3 movl %eax, %edx 4 sarl $31, %edx 5 movl 20(%ebp), %ecx 6 imull %eax, %ecx 7 movl […]

在x86中增量是一个整数primefaces?

在多核x86机器上,假设在core1上执行的线程增加一个整数变量a ,同时核心2上的线程也增加它。 假设a的初始值为0,那么它最终总是2吗? 或者它可能有其他价值? 假设a被声明为volatile并且我们没有使用primefaces变量(例如C ++的atomic 和gcc中的原子操作)。 如果在这种情况下a的值确实总是2,那是否意味着x86-64中的long int也具有相同的属性,即a到底总是2?

AMD64 – nopw汇编指令?

在这个编译器输出中,我试图理解nopw指令的机器码编码是如何工作的: 00000000004004d0 : 4004d0: eb fe jmp 4004d0 4004d2: 66 66 66 66 66 2e 0f nopw %cs:0x0(%rax,%rax,1) 4004d9: 1f 84 00 00 00 00 00 在http://john.freml.in/amd64-nopl上有一些关于“nopw”的讨论。 任何人都可以解释4004d2-4004e0的含义吗? 从查看操作码列表看, 66 ..代码似乎是多字节扩展。 我觉得我可能会得到一个比这更好的答案,除非我试图让操作码列表停留几个小时。 asm输出来自C中的以下(疯狂)代码,它优化为简单的无限循环: long i = 0; main() { recurse(); } recurse() { i++; recurse(); } 当使用gcc -O2编译时,编译器会识别无限递归并将其转换为无限循环; 它实际上做得很好,事实上,它实际上在main()循环而不调用recurse()函数。 编者注:带NOP的填充函数并不特定于无限循环。 在Godbolt编译器资源管理器中 ,这是一组具有一系列NOP长度的函数。

使用cmpxchg8b获得无符号长度的预期输出

我正在尝试编写一个简单的比较和交换内联汇编代码。 这是我的代码 #include #include #include static inline unsigned long cas(volatile unsigned long* ptr, unsigned long old, unsigned long _new) { unsigned long prev=0; asm volatile(“lock cmpxchg8b %0;” : “=m”(prev) : “m”(*ptr),”a”(old),”c”(_new) ); return prev; } int main() { unsigned long *a; unsigned long b=5,c; a=&b; c=cas(a,b,6); printf(“%lu\n”,c); return 0; } 理想情况下,此代码应打印5但是打印0.我的代码有什么问题?请帮助。