Всех приветствую.
У меня возникла проблема при линковке 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
Если знаете как решить проблему пожалуйста отпишите.
Здравствуйте, DarkMaster, Вы писали:
DM>Здравствуйте, Sword_of_apocalipsys, Вы писали:
DM>Я бы не заморачивался, а написал бы асмовые вставки на внутреннем дельфовом АСМе.
Так жить интересней

.
Собственно проблема уже решена нужно было инициализировать переменные и все.
.Data
EXTRN ESPV: DWORD
a32 DD 0
b32 DD 0
c32 DD 0
d32 DD 0
Вопрос закрыт.