代码如下
procedure test;
var
  i:Byte;
begin
  i:=0; 我在此处下断点
  i:=not i;
end;断点执行后 反汇编
此时ebp 为 0018F534
Unit1.pas.69: I:=0;
00520654 C645FF00         mov byte ptr [ebp-$01],$00               ------     i的地址是[ebp-$01]堆栈为
0018F534 44 00 4A 97
0018F530 C8 77 08 69单步执行后 反汇编
此时ebp 为 0018F534 
Unit1.pas.70: i:=not i;
00520658 F655FF           not byte ptr [ebp-$01]堆栈为
0018F534 44 00 4A 97
0018F530 C8 77 08 69
单步执行后 反汇编
此时ebp 为 0018F534 
Unit1.pas.72: end;
0052065B 59               pop ecx堆栈为
0018F534 44 FF 4A 97  问题在这 44后面的位置 那个位置应该是[ebp+01],而实际i的地址是[ebp-$01] 
0018F530 C8 77 08 69可能我表达的有问题
其实就是想知道内存区域的变化
我以前是学win32汇编的 来搞搞delphi 呵呵

解决方案 »

  1.   

    汇编我不太懂了。
      i:=0;  这一句是:分配内存,并把这4字节的内存赋值为0;
      i:= not i; 这一句是:把i内存处的值放到寄存器,然后进行反运算,最后把运算后的值放到i所处的内存处
      

  2.   

    not 
    就是反运算的
      

  3.   

    没看出问题,然后你的表达有误,i的地址是ebp-$01,不应该加上中括号。
      

  4.   

    pop ecx是恢复寄存器环境,准备退出函数了。
      

  5.   


    i的地址是ebp-1,即0018F533啊!!!那个ebp+1的地方变成ff是在执行pop ecx之后啊,而在pop ecx之前,ebp-1的地方就变为ff了!!!