От 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, который вы не можете понять. Напишите свою программу на Паскале, а все остальное сделает компилятор. 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 будет (полностью) без поддержки. Возможно, этого требует политика компании OP, каким бы безумным это ни было.   -  person Hugh Jones    schedule 22.03.2015
comment
@LURD, не конкретный TP, а общий 16-битный.   -  person Free Consulting    schedule 22.03.2015
comment
@ Дэвид D6 - ›D2007 не такой уж и странный. Это обновление до последней версии до юникода. Переход на юникод сопряжен с рядом сложностей; тем более в приложениях, которым необходимо придерживаться протоколов связи с внешними системами. В нашем случае мы использовали 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-битный ассемблерный код? У вас есть функциональная спецификация для этих функций?

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

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

Если даже это слишком сложно, то целесообразным подходом будет использование 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