x86的MOV真的可以“免費”嗎?為什么我不能復(fù)制這個?我經(jīng)??吹接腥寺暦Q,由于注冊重命名,所以在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);}這將為循環(huán)生成以下程序集代碼(請隨意生成此代碼,您當(dāng)然不需要VisualC+):LOOP:
add edi,esi
mov ebx,esi
inc esi
cmp esi,FFFFFFFFh
jc LOOP現(xiàn)在我運行了幾次這個程序,當(dāng)MOV指令被刪除時,我觀察到了相當(dāng)一致的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來說,這個循環(huán)太復(fù)雜了嗎?有沒有單株有什么例子可以證明MOV像人們所說的那樣是自由的?如果是,那是什么?如果不是,為什么每個人都聲稱MOV是免費的?
2 回答

吃雞游戲
TA貢獻(xiàn)1829條經(jīng)驗 獲得超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 關(guān)注
- 621 瀏覽
添加回答
舉報
0/150
提交
取消