VC++.NET的寄存器al的Bug

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 coohai 的 blog

  在vc++.net中,无论是编译得到的,还是嵌入的汇编代码,若出现对al值的引用,都会出现这种问题。

  例:

_asm

{

    mov eax,0xa9;

}

在此句之后,al的值为0,ah的值也为0,但ax的值为0xa9,eax的值也正常。

  经进一步的研究发现,在上述情况下,也有正常的时候,条件是al的值在0x00到0x7f(包括0x7f)之间时,al的值是正常的。

再如编译得到代码的例子:

char a[2];

long ltest=0xf8;

a[0]=(char)ltest;

a[1]=(char)ltest;

结果是:a[0]==0,a[1]==0;

编译后为:

long ltest=0xf8;

       mov dword ptr [ebp-0x06],0xf8;//ltest==0xf8

a[0]=(char)ltest;

       mov eax,dword ptr [ebp-0x02];//eax==0xf8,al==0,ah==0,ax==0xf8

       mov byte ptr [a],al;//al==0,a[0]=0

a[1]=(char)ltest;

      mov eax,dword ptr [ebp-0x02];//eax==0xf8,al==0,ah==0,ax==0xf8

       mov byte ptr [ebp-0x01],al;//al==0,a[1]==0;

结果就是这样。

本文关键:VC++.NET,al,Bug
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top