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, какво правя погрешно?


person Paul Lynch    schedule 22.03.2015    source източник
comment
Кодът не се компилира и в Delphi 6. Моля, публикувайте кода, който се компилира в Delphi 6. Това, което наистина трябва да направите, е да се отървете от asm, който не можете да разберете. Напишете вашата програма с помощта на Pascal и оставете компилатора да свърши останалото. Delphi 6 -› Delphi 2007 е доста странен ъпгрейд. Не виждам какво бихте избрали да направите това сега.   -  person David Heffernan    schedule 22.03.2015
comment
Компанията е в нови ръце и иска модернизиране. Никога не ми се е налагало да прекомпилирам dcu, откакто се присъединих към компанията, така че го приех, тъй като пасът е наред. Ще предприема първото си действие там, наздраве за главата   -  person Paul Lynch    schedule 22.03.2015
comment
Изглежда по-скоро като асемблиране на Turbo Pascal.   -  person LU RD    schedule 22.03.2015
comment
@David - Ако си спомням правилно, няма дата за Delphi2007, на която (напълно) да не се поддържа. Възможно е фирмената политика на ОП да го изисква, колкото и лудо да е това.   -  person Hugh Jones    schedule 22.03.2015
comment
@LURD, не конкретен TP, а общ 16-битов.   -  person Free Consulting    schedule 22.03.2015
comment
@David D6 -› D2007 не е толкова странен. Това е надстройка до най-новата версия преди уникод. Преминаването към unicode носи свой набор от усложнения; още повече в приложения, които трябва да се придържат към комуникационни протоколи с външни системи. В нашия случай използвахме D2007 като стъпало към по-нови версии.   -  person Disillusioned    schedule 23.03.2015
comment
@CraigYoung Наистина не виждам какво пречи на стъпалото. Не е по-лесно да стигнете до Unicode Delphi от D2007, отколкото от D6.   -  person David Heffernan    schedule 23.03.2015
comment
@David Съгласен съм, че работата трябва да се свърши независимо от това; и извършването на работата по-късно не намалява обема на необходимата работа. В нашия случай обаче допълнителната работа с Unicode е голямо количество работа. (Отчасти поради наследени грешки като неразумно използване на AnsiStrings по непоследователен начин.) Остава фактът, че плащането на технически дълг трябва да бъде балансирано с бизнес необходимостта от непрекъснато добавяне на функционалност. Ако имах лукса от месец/два да конвертирам безпрепятствено в Unicode, с удоволствие бих го направил. В момента се извършват промени в D2007. Мога да работя върху поправянето на наследени грешки и да използвам функциите на D2007.   -  person Disillusioned    schedule 23.03.2015
comment
@CraigYoung Предполагам, че е различно за всеки, но моят опит показва, че преминаването през D2007 би включвало повече работа, отколкото преминаването направо от D6 към D2010, както направихме.   -  person David Heffernan    schedule 23.03.2015
comment
Да, вече не препоръчвам D2007 като междинна стъпка в надграждането, твърде много е бъгово.   -  person Warren P    schedule 13.09.2016


Отговори (2)


Като общо правило вграденият асемблен код, който се компилира в Delphi 6, ще се компилира и в по-късни версии. Така че не трябва да е необходимо пренасяне. Наистина, когато се опитате да компилирате този код в Delphi 6, той се проваля с точно същите грешки, както докладвате от D2007.

Вие също споменавате в коментарите, че не сте компилирали кода в Delphi 6, а по-скоро сте използвали компилиран .dcu файл. Което има повече смисъл, като се има предвид, че кодът във въпроса не се компилира в Delphi 6.

Причината кодът да не се компилира в Delphi 6 е, че не е 32 битов код. Струва ми се, че е 16 битов код.

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

Така вие сте в туршия. Без да знаете какво има в този .dcu файл, какво трябва да направите? Сигурен ли си дори, че .dcu файлът прави същото като този 16-битов код за асемблиране? Имате ли функционална спецификация за тези функции?

В един идеален свят бихте знаели какво правят тези функции и бихте могли да ги пренесете в Pascal. Тогава вече няма да сте обвързани с асемблерния код.

Ако не знаете какво правят тези функции, трябва да разберете. Не вярвам, че вашият 16-битов асемблер съвпада с това, което прави вашият .dcu файл. Бих разглобил .dcu файла и бих го портирал към Pascal.

Ако дори това е твърде трудно, тогава целесъобразният подход е да се използва Delphi 6 за компилиране на .dcu файла в DLL. След това можете да извикате тези функции от вашата пренесена програма D20007. Това ще работи, но не ви оставя по-близо до това да знаете какво прави вашият код.

person David Heffernan    schedule 22.03.2015

Да, това е 16 битов регистър.

въведете описание на изображението тук

Само идея, може би декларирайте във вашите променливи например 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 
.......

P.s Може да се наложи да промените "Push DS" и "POP DS" на "PUSH ESI" и "POP ESI"

person TheDrunkenAlcoholic    schedule 30.03.2015