2015-03-22 9 views
0

Просто поражая различные кирпичи стены лет стоит обновление кода, но в настоящее время один я не могу показаться, чтобы преобразовать этоDelphi 6 на Delphi 2007

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 Error] Packer.pas(20): E2107 Operand size mismatch " Mov AX, Word Ptr Dest" 
[DCC Error] Packer.pas(22): E2105 Inline assembler syntax error" Mov AX, Word Ptr Dest+2   `1`" 
[DCC Error] Packer.pas(24): E2107 Operand size mismatch "Mov AX, Word Ptr Source" 
[DCC Error] Packer.pas(87): E2107 Operand size mismatch" Mov AX, Word Ptr Dest" 
[DCC Error] Packer.pas(91): E2107 Operand size mismatch " Mov AX, Word Ptr Source" 

я провел далеко много лет на d6, Что я делаю не так?

+0

код не компилируется в Delphi 6. Пожалуйста, напишите код, который компилируется в Delphi 6. То, что вы действительно должны делать, это избавиться от asm, который вы не можете понять. Напишите свою программу с помощью Pascal, и пусть компилятор сделает все остальное. Delphi 6 -> Delphi 2007 - довольно странное обновление. Я не могу понять, что вы решили сделать сейчас. –

+0

Это компания в новые руки и хочет модернизировать. Мне никогда не приходилось перекомпилировать dcu с тех пор, как я присоединился к компании, поэтому взял ее, так как все было хорошо. Я заберу свое первое действие назад, приветствую для головок вверх –

+0

Похоже на сборку Turbo Pascal. –

ответ

1

Как правило, встроенный код сборки, который компилируется в Delphi 6, также будет скомпилирован в более поздних версиях. Поэтому никакого портирования не требуется. В самом деле, когда вы пытаетесь скомпилировать этот код в Delphi 6, он терпит неудачу с точно такими же ошибками, как и с D2007.

Вы также упомянули в комментариях, что вы не компилировали код в Delphi 6, а скорее использовали скомпилированный файл .dcu. Что имеет смысл, учитывая, что код в вопросе не компилируется в Delphi 6.

Причина, по которой код не компилируется в Delphi 6, заключается в том, что он не является 32-битным кодом. Мне кажется, это 16-битный код.

Чтение между строками, которые я подозреваю, что код, который у вас есть, датируется давно, в возрасте 16 бит. Когда код был перенесен на 32-битный, кто-то портировал код, но оставил вам файл .dcu, а не источник.

Вы, таким образом, находитесь в рассоле. Не зная, что находится в этом файле .dcu, что вам делать? Вы даже уверены, что файл .dcu делает то же самое, что и этот 16-битный ассемблерный код? У вас есть функциональная спецификация для этих функций?

В идеальном мире вы бы знали, что делают эти функции и смогут перенести их на Паскаль. Тогда вы больше не будете привязаны к ассемблеру.

Если вы не знаете, что эти функции вы должны выяснить. Я не верю, что ваш 16-битный ассемблер соответствует тому, что делает ваш файл .dcu. Я бы разобрал файл .dcu и порт для Pascal.

Если это слишком сложно, целесообразным является использование Delphi 6 для компиляции файла .dcu в DLL. Затем вы можете вызывать эти функции из вашей портированной программы D20007. Это будет работать, но это не поможет вам понять, что делает ваш код.

0

Да, это 16-разрядный регистр.

enter image description here

Просто идея, может объявить в вашем переменных, например AX, как слово и AH, AL, как байты, но вам нужно будет переименовать их.

пример ...

Function Example (Var Source, Dest; Count : Word) : Word; Assembler; 
    var 
    iAX, iBX, iCX, iDX, iBP, iSI, iDI, iSP: Word; 
    iAH, iAL, iBH, iBL, iCH, iCL, iDH, iDL : Byte 
    Asm 
     Push DS 
     Mov iBX, Count        
     Mov iAX, Word Ptr Dest 
     Mov iDI, iAX 
     Mov iAX, Word Ptr Dest+2 
     Mov iES, iAX 
....... 

Ps Вы, возможно, придется изменить "Push DS" и "POP DS" на "PUSH ESI" и "POP ESI"

Смежные вопросы