var
 byte_0_462DE1:pointer;
asm
  movzx ecx,byte ptr [byte_0_462DE1]
end;ECX的值怎么会是byte_0_462DE1本身的地址? 而不是byte_0_462DE1所指向地址的值呢???郁闷!!

解决方案 »

  1.   

    不会吧,我用D6
    var
     byte_0_462DE1:pointer;
    begin
      byte_0_462DE1:=pointer($462DE1); //byte_0_462DE1本身的地址为$12f5b8,它指向$462DE1
    asm
      movzx ecx,byte  ptr [byte_0_462DE1] //结果ecx为$E1
    end;
      

  2.   

    另外,要得到byte_0_462DE1本身的地址可用
     lea ecx, [byte_0_462DE1]
      

  3.   

    我装了DELPHI6 试了还是一样...
    完整代码片段如下
    const
      byte_0_462DE0: array[0..55] of Byte = (
        $38, $30, $28, $20, $18, $10, $08, $00, $39, $31, $29, $21, $19, $11, $09, $01,
        $3A, $32, $2A, $22, $1A, $12, $0A, $02, $3B, $33, $2B, $23, $3E, $36, $2E, $26,
        $1E, $16, $0E, $06, $3D, $35, $2D, $25, $1D, $15, $0D, $05, $3C, $34, $2C, $24,
        $1C, $14, $0C, $04, $1B, $13, $0B, $03);var
    byte_0_462DE1: Pointer = @byte_0_462DE0[1];asm
      xor eax,eax
      movzx ecx,byte ptr [eax+byte_0_462DE1]
    end;我在监视窗口输入 pbyte(byte_0_462DE1)^的值是正常的,但是ECX的值就是等于byte_0_462DE1本身的地址没看出哪里有错误望高手指点。。
      

  4.   

    在OD里面进步调试发现了一个问题
    byte_0_462DE1和byte_0_462DE0的内存地址并不是连续的,而在DELPHI的监视窗口里看见他们的内存地址是连续的。。晕 照理说byte_0_462DE1和byte_0_462DE0的内存地址应该是连续的。 这是怎么回事???
      

  5.   

    明白你的意思了,但byte_0_462DE1是个变量,它有自己的地址
      movzx ecx,byte ptr [eax+byte_0_462DE1]
    byte_0_462DE1的确得到的是自己的地址,以前研究过,有一个简单的方法,现在想不起来了,但要实现你的功能,也简单
    1.根本不要用byte_0_462DE1,而直接用
      movzx ecx,byte ptr [eax+ byte_0_462DE0+1] //这样没问题
    2.多加一条:
      mov ecx,byte_0_462DE1
      movzx ecx,byte ptr [eax+ ecx] //这样也可以