我对x86寄存器的理解表明,每个寄存器都可以被整个32位代码访问,并且它被分成多个可访问的寄存器.
在这个例子中EAX是一个32位寄存器,如果我们调用AX它应该返回前16位,如果我们调用它AH或AL它应该返回16位之后的下一个8位并且AL应该返回最后8位.
所以我的问题,因为我不相信这是它的运作方式.如果我们存储一个32位值的七...也就是EAX存储
0000 0100 0000 1000 0110 0000 0000 0111
Run Code Online (Sandbox Code Playgroud)
因此,如果我们访问AX它应该返回
0000 0100 0000 1000
Run Code Online (Sandbox Code Playgroud)
如果我们读AH它应该返回
0000 0100
Run Code Online (Sandbox Code Playgroud)
当我们读到AL它时应该返回
0000 0111
Run Code Online (Sandbox Code Playgroud)
它是否正确?如果它AH真正具有什么价值呢?
我一直看到人们声称MOV指令可以在x86中免费,因为寄存器重命名.
对于我的生活,我无法在一个测试用例中验证这一点.每个测试用例我尝试揭穿它.
例如,这是我用Visual C++编译的代码:
#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);
}
Run Code Online (Sandbox Code Playgroud)
这为循环生成以下汇编代码(随意生成这个你想要的;你显然不需要Visual C++):
LOOP:
add edi,esi
mov …Run Code Online (Sandbox Code Playgroud)