Ошибка Internal Error: L3118 при попытке линковки obj файла
От: Sword_of_apocalipsys  
Дата: 16.08.10 15:43
Оценка:
Всех приветствую.
У меня возникла проблема при линковке obj файла с delphi проектом.
Я использую Tasm и Delphi7.1
Проблема достаточно специфичная, потому что возникает не всегда а как то беспорядочно, в каких то проетах возникает, в каких то нет.
При возникновении ошибки компилятор сообщает о внутренней ошибке компилятора 3118, отчего она возникает я не понимаю.
Для примера привожу два простых примера проектов

1 Ошибка не возникает

Unit1.pas

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  Procedure Movl(); STDCall; EXTERNAL;
  {$L MOV_32.obj}
  
var
  Form1: TForm1;
  x:longint;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

Movl();
Edit1.Text:=IntToStr(x);
end;


end.


Mov_32.asm

Title move for 32 bits

.386P
.MODEL    FLAT, stdcall
PUBLIC Movl

.DATA
extrn x: DWORD
a DD 64h

.CODE
Movl    proc
mov ax,WORD PTR a    ;ax<=== low word of a
push bx
mov bx,WORD PTR a+2    ;bx<=== high word of a
mov WORD PTR x,ax    ;low word of x<=== ax
mov WORD PTR x+2,bx    ;high word of x<=== bx
pop bx
ret
Movl    ENDP

END


2 Ошибка возникает по невыясненной причине(вернее выяснено что причина во внешней переменной, но если ее урать то пропадает смысл во всем коде)

Unit1.pas

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label4: TLabel;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
Procedure EspNum();STDCall;EXTERNAL;
Procedure WordIn();STDCall;EXTERNAL;
{$L StackOut1}
 
var
  Form1: TForm1;
  ESPV: DWord;
 
implementation
 
{$R *.dfm}
 
 
procedure TForm1.Button2Click(Sender: TObject);
begin
EspNum();
Label1.Caption:=IntToStr(ESPV);
WordIn();
Label4.Caption:=IntToStr(ESPV);
end;
 
end.


StackOut1.asm

Title StackOut for 32 bit
.486P
.MODEL flat, STDCall
 
 
;PUBLIC StackOut
PUBLIC WordIn
PUBLIC EspNum
 
.Data
EXTRN ESPV: DWORD
 
a32 DD ?
b32 DD ?
c32 DD ?
d32 DD ?
 
.CODE
 
WordIn proc
mov a32,eax
mov eax,110
push ax
push esp
pop eax
mov ESPV,eax
pop ax
mov eax,a32
ret
WordIn ENDP
 
 
 
EspNum proc
mov a32,eax
push esp
pop eax
mov ESPV,eax
mov eax,a32
ret
EspNum ENDP
 
END


Если знаете как решить проблему пожалуйста отпишите.
Re: Ошибка Internal Error: L3118 при попытке линковки obj фа
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 17.08.10 07:04
Оценка: +2
Здравствуйте, Sword_of_apocalipsys, Вы писали:

S__>У меня возникла проблема при линковке obj файла с delphi проектом.

S__>Я использую Tasm и Delphi7.1

Я бы не заморачивался, а написал бы асмовые вставки на внутреннем дельфовом АСМе.
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re[2]: Ошибка Internal Error: L3118 при попытке линковки obj
От: Sword_of_apocalipsys  
Дата: 17.08.10 10:34
Оценка:
Здравствуйте, DarkMaster, Вы писали:

DM>Здравствуйте, Sword_of_apocalipsys, Вы писали:


DM>Я бы не заморачивался, а написал бы асмовые вставки на внутреннем дельфовом АСМе.


Так жить интересней .
Собственно проблема уже решена нужно было инициализировать переменные и все.

.Data
EXTRN ESPV: DWORD
 
a32 DD 0
b32 DD 0
c32 DD 0
d32 DD 0

Вопрос закрыт.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.