x86的MOV真的可以“免费”吗?为什么我不能复制这个?我经常看到有人声称,由于注册重命名,所以在x86中MOV指令可以是免费的。为了我的生命,我无法在一个测试用例中验证这一点。每一个测试用例我都试着揭穿它。例如,下面是我正在用VisualC+编译的代码:#include <limits.h>#include <stdio.h>#include <time.h>int main(void){
    unsigned int k, l, j;
    clock_t tstart = clock();
    for (k = 0, j = 0, l = 0; j < UINT_MAX; ++j)
    {
        ++k;
        k = j;     // <-- comment out this line to remove the MOV instruction
        l += j;
    }
    fprintf(stderr, "%d ms\n", (int)((clock() - tstart) * 1000 / CLOCKS_PER_SEC));
    fflush(stderr);
    return (int)(k + j + l);}这将为循环生成以下程序集代码(请随意生成此代码,您当然不需要VisualC+):LOOP:
    add edi,esi
    mov ebx,esi
    inc esi
    cmp esi,FFFFFFFFh
    jc  LOOP现在我运行了几次这个程序,当MOV指令被删除时,我观察到了相当一致的2%的差异:Without MOV      With MOV  1303 ms         1358 ms  1324 ms         1363 ms  1310 ms         1345 ms  1304 ms        
 1343 ms  1309 ms         1334 ms  1312 ms         1336 ms  1320 ms         1311 ms  1302 ms       
   1350 ms  1319 ms         1339 ms  1324 ms         1338 ms那又是怎么回事?为什么MOV不是“免费”的?对于x86来说,这个循环太复杂了吗?有没有单株有什么例子可以证明MOV像人们所说的那样是自由的?如果是,那是什么?如果不是,为什么每个人都声称MOV是免费的?
                    
                    
                2 回答
 
                    
                    
                            吃鸡游戏
                            
                                
                            
                        
                        
                                                
                    TA贡献1829条经验 获得超7个赞
__loop1: add edx, 1 add edx, 1 add ecx, 1 jnc __loop1
__loop2: mov eax, edx add eax, 1 mov edx, eax add edx, 1 add ecx, 1 jnc __loop2
mov
- 2 回答
- 0 关注
- 634 浏览
添加回答
举报
0/150
	提交
		取消
	