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 关注
- 600 浏览
添加回答
举报
0/150
提交
取消