【发布时间】:2015-03-22 16:41:01
【问题描述】:
经过多年的代码更新,只是碰上了各种砖墙,但目前我似乎无法转换的是这个
Function Pack (Var Source, Dest; Count : Word) : Word; Assembler;
Asm
Push DS
Mov BX, Count { BX = Count }
Mov AX, Word Ptr Dest
Mov DI, AX
Mov AX, Word Ptr Dest+2 `1`
Mov ES, AX { ES:DI - Dest }
Mov AX, Word Ptr Source
Mov SI, AX
Mov AX, Word Ptr Source+2
Mov DS, AX { DS:SI - Source }
Xor DX, DX { Packed size }
CLD
@Cycle:
Or BX, BX
JZ @End { Done }
LODSB
Mov CX, BX
Cmp CX, 100H
JC @1
Mov CX, 0FFH
@1:
Mov AH, CL
Push ES
Push DI { Save ES:DI before scan }
Push SI
Pop DI
Push DS
Pop ES { ES:DI = DS:SI for scan }
RepE ScaSB
Dec DI
Push DI
Pop SI
Push ES
Pop DS { DS:SI = ES:DI for next }
Pop DI
Pop ES { Restore ES:DI after scan }
Sub AH, CL
Mov CL, AH { CX = repeat count }
Cmp AH, 3
JNC @3 { Repeat count >= 3 }
Cmp AL, RP
JNE @2 { Not a RepeatPrefix byte }
STOSW { Save RP, repeat count < 3 }
Sub BX, CX { Actually count in source }
Add DX, 2 { Actually packed size }
Jmp @Cycle
@2:
Sub BX, CX { Actually count in source }
Add DX, CX { Actually packed size }
Rep STOSB { Save bytes }
Jmp @Cycle
@3:
Sub BX, CX { Actually count in source }
Add DX, 3 { Actually packed size }
Mov CL, AL
Mov AL, RP
STOSW { Save RP, repeat count < 3 }
Mov AL, CL
STOSB { Save repeating byte }
Jmp @Cycle
@End:
Pop DS
Mov AX, DX { Return packed size }
End;
Function UnPack (Var Source, Dest; Count : Word) : Word; Assembler;
Asm
Push DS
Mov BX, Count { BX = Count }
Mov AX, Word Ptr Dest
Mov DI, AX
Mov AX, Word Ptr Dest+2
Mov ES, AX { ES:DI - Dest }
Mov AX, Word Ptr Source
Mov SI, AX
Mov AX, Word Ptr Source+2
Mov DS, AX { DS:SI - Source }
Xor DX, DX { Packed size }
Xor AH, AH
CLD
@Cycle:
Or BX, BX
JZ @End { Done }
LODSB
Dec BX
Cmp AL, RP
JE @1
STOSB
Inc DX
Jmp @Cycle
@1:
LODSB
Mov CX, AX
Add DX, CX
Dec BX
Cmp AL, 3
JNC @2
Mov AL, RP
Rep STOSB
Jmp @Cycle
@2:
LODSB
Dec BX
Rep STOSB
Jmp @Cycle
@End:
Pop DS
Mov AX, DX
End;
[DCC 错误] Packer.pas(20): E2107 操作数大小不匹配“Mov AX, Word Ptr Dest”
[DCC 错误] Packer.pas(22): E2105 内联汇编语法错误“Mov AX, Word Ptr Dest+2 `1`”
[DCC 错误] Packer.pas(24): E2107 操作数大小不匹配“Mov AX, Word Ptr Source”
[DCC 错误] Packer.pas(87): E2107 操作数大小不匹配“Mov AX, Word Ptr Dest”
[DCC 错误] Packer.pas(91): E2107 操作数大小不匹配“Mov AX, Word Ptr Source”
我在 d6 上花了很多年,我做错了什么?
【问题讨论】:
-
代码也不能在 Delphi 6 中编译。请发布在 Delphi 6 中编译的代码。您真正应该做的是摆脱您无法理解的 asm。使用 Pascal 编写程序,让编译器完成剩下的工作。 Delphi 6 -> Delphi 2007 是一个相当奇怪的升级。我看不出你现在会选择做什么。
-
这家公司落入新人手中,想要进行现代化改造,自从我加入公司以来,我从来没有重新编译 dcu,所以把它当作是好的。将采取我的第一个行动回到那里为抬头欢呼
-
看起来更像是 Turbo Pascal 程序集。
-
@David D6 -> D2007 并不奇怪。这是对最新的 pre-unicode 版本的升级。切换到 unicode 会带来一系列复杂性。在需要遵守与外部系统的通信协议的应用程序中更是如此。在我们的案例中,我们使用 D2007 作为更新版本的垫脚石。
-
@CraigYoung 我想每个人的情况都不一样,但我的经验是,通过 D2007 会比像我们那样直接从 D6 到 D2010 需要更多的工作。
标签: delphi delphi-2007 delphi-6