|
Вопрос # 4 493/ вопрос открыт / |
|
Привет всем.
Мой вопрос заключается в ошибке под названием Internal error: L3118
Суть в том что я пытаюсь получить значение регистра ESI путем прикрепления obj файла к проекту и вызовом соответствующих функций. Сам регистр я не изменяю. Почему возникает ошибка уже второй день понять не могу, но подозреваю что из за работы с ESI.
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- 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 EsiNum();STDCall;EXTERNAL;
- Procedure WordIn();STDCall;EXTERNAL;
- {$L StackOut1}
-
- var
- Form1: TForm1;
- ESIV: DWord;
-
- implementation
-
- {$R *.dfm}
-
-
- procedure TForm1.Button2Click(Sender: TObject);
- begin
- EsiNum();
- Label1.Caption:=IntToStr(ESIV);
- WordIn();
- Label4.Caption:=IntToStr(ESIV);
- end;
-
- end.
-
- ***********************************************************
-
- StackOut1.asm
- ***********************************************************
- Title StackOut for 32 bit
- .486P
- .MODEL flat, STDCall
-
-
- ;PUBLIC StackOut
- PUBLIC WordIn
- PUBLIC ESINUM
-
- .Data
- EXTRN ESIV: DWORD
-
- a32 DD ?
- b32 DD ?
- c32 DD ?
- d32 DD ?
-
- .CODE
-
- WordIn proc
- mov a32,eax
- mov eax,110
- push ax
- push esi
- pop eax
- mov ESIV,eax
- pop ax
- mov eax,a32
- ret
- WordIn ENDP
-
-
-
- ESINUM proc
- mov a32,eax
- push esi
- pop eax
- mov ESIV,eax
- mov eax,a32
- ret
- ESINUM ENDP
-
- END
- ************************************************************
 |
Вопрос задал: SOA (статус: Посетитель)
Вопрос отправлен: 8 августа 2010, 14:10
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, SOA!
Смотрим на название ошибки "Internal error: L3118". Первая часть говорит, что это какая то непредвиденная ошибка. Дальше есть буква L - это значит ошибка линковки, ну а дальше некий номер, по которому можно разработчикам компилятора сообщить.
Часто такие ошибки бывают из-за того, что программист пытается обхитрить компилятор.
Так как в нашем случае возникает ошибка линковки, то скорее всего полученный obj файл не совсем верный. Если этот файл получен с помощью компилятора TASM или MASM, а версия делфи старше третьей - то это и будет причиной, так как не совместимы эти файлы.
Если же obj файл получен третьими инструментами (например VisualStudio), то слинковать его вряд ли получиться.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 8 августа 2010, 18:04
Оценка за ответ: 5
Комментарий к оценке: Спасибо за предложенный вариант передачи данных из delphi в асм.
|
Мини-форум вопроса
Всего сообщений: 21; последнее сообщение — 17 августа 2010, 13:43; участников в обсуждении: 2.
Страницы: [« Предыдущая] [1] [2]
|
Вадим К (статус: Академик), 17 августа 2010, 13:43 [#21]:
об этом думал...
да, теперь логично все получается.
Если переменная объявлена как
d32 DD ?
то на момент линковки ее адрес неизвестен.
а если так
d32 DD 0
то известен.
Логично, что в первом случае слинковать внешнюю переменную было нереально (в виду ее отсутствия).
Галочка "подтверждения прочтения" - вселенское зло.
|
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|