能力值:
( LV15,RANK:340 )
2 楼
非结构体变量也成了指针?!这个改动还真不知道,找时间试试...
不过指针像这样操作就很有点麻烦
lea eax, sseh
mov (_SEH PTR [eax]).xxx, yyy
以前结构体操作 mov sseh.xxx, yyy 这样用还是很爽的。
{$ifdef VER150}
能力值:
( LV9,RANK:570 )
3 楼
是的,你看我上面贴的代码,普通变量也成了指针,我也没弄明白易博龙为什么要这样做,对比d2010和d7生成的代码,就感觉d2010的明显要拖沓很多。不过也只能慢慢适应了,不可能永远抱着delphi7不放,毕竟D2010里的很多新特性是非常诱人的。
能力值:
( LV15,RANK:340 )
4 楼
这个可能是D2010新改成这样的,D2009中都还能这样用:
Unit1.pas.38: stTest.bA := 1; 0040A7A1 C605841D410001 mov byte ptr [$00411d84 ],$01 ; bA类型为BYTE,默认2字节对齐 Unit1.pas.44: mov ax, $4321 0040A7BC 66B82143 mov ax,$4321 Unit1.pas.45: mov stTest.wB , ax 0040A7C0 66A3861D4100 mov [$00411d86 ],ax
D2010这边机器还没装,主要是不习惯启动前还要加载那个破解用bpl(目前Update3好像只能用这个方法进去)。感觉D2010中这样修改可能是为了后期扩展,难道以后所有变量都可以运行期改变类型?(比如原先定义一个DWORD,后面不够用了想扩展成array[0..1] of DWORD的话,只用把指针移向新的地方就够了。而原来那种方式显然做不到这样的操作)
纯属胡猜
不过相信Delphi的编译器只会越改越好,我们拭目以待吧。
能力值:
( LV9,RANK:570 )
5 楼
是这样的,比如你在unit1里定义一个公共变量test1,unit1里的程序引用test1的时候是直接对test1操作,而如果你在其他单元里引用test1的话,则会通过一个指向test1的指针对其进行操作,我试过Delphi2007、Delphi2009都是这样做的^_^
能力值:
( LV15,RANK:340 )
6 楼
哦,跨单元是这个意思,重新试了一下D2009,确实如此:
1
2
3
test
.dpr.65: [B]stTest.wB := 2;[
/B
]
0040B196 A1FCCA4000 mov eax,[$0040cafc] ; $0040cafc 是存放 stTest 实际位置$00411d84的指针
0040B19B 66C740020200 mov word ptr [eax+$02],$0002
跨单元后,Delphi 2009直接编译能识别 mov stTest.wB, ax 这样的操作,是因为他完全按照内嵌汇编写的内容转换成非指针的形式:
1
2
test
.dpr.68: [B]mov stTest.wB, ax[
/B
]
0040B19B 66A3861D4100 mov [[COLOR=
"Red"
]$00411d86[
/COLOR
]],ax ; 这里直接由编译器将stTest.wB转换成地址$00411d84+2了,确实很终于“原著”<img src=
"/view/img/face/12.gif"
width=
"24"
height=
"24"
style=
"cursor: zoom-in;"
>
而直接写的 stTest.wB := xxx; 这个跨单元操作,则可能按照新编译器的规则转成了指针方式。
跨单元全局变量,好隐蔽的问题...
能力值:
( LV9,RANK:570 )
7 楼
哈哈,这个隐蔽的问题害的我的rmcoff2修改了无数次,不过现在终于搞定了^_^
能力值:
( LV15,RANK:340 )
8 楼
能力值:
( LV9,RANK:570 )
9 楼
对嵌入式汇编我就无能为力了,这个就要靠写程序的人了,别的都搞定了^_^
能力值:
( LV3,RANK:30 )
在线值:
10 楼
学习一下~~写驱动蓝到怕了~~
能力值:
( LV3,RANK:20 )
11 楼
delphi牛人啊,,,羡慕ing.....