Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 493

Раздел: Ассемблер
/ вопрос открыт /

Привет всем.
Мой вопрос заключается в ошибке под названием Internal error: L3118
Суть в том что я пытаюсь получить значение регистра ESI путем прикрепления obj файла к проекту и вызовом соответствующих функций. Сам регистр я не изменяю. Почему возникает ошибка уже второй день понять не могу, но подозреваю что из за работы с ESI.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. Unit1.pas
  2. **********************************************************
  3. unit Unit1;
  4.  
  5. interface
  6.  
  7. uses
  8. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  9. Dialogs, StdCtrls;
  10.  
  11. type
  12. TForm1 = class(TForm)
  13. Label1: TLabel;
  14. Label4: TLabel;
  15. Button2: TButton;
  16. procedure Button2Click(Sender: TObject);
  17. private
  18. { Private declarations }
  19. public
  20. { Public declarations }
  21. end;
  22.  
  23. Procedure EsiNum();STDCall;EXTERNAL;
  24. Procedure WordIn();STDCall;EXTERNAL;
  25. {$L StackOut1}
  26.  
  27. var
  28. Form1: TForm1;
  29. ESIV: DWord;
  30.  
  31. implementation
  32.  
  33. {$R *.dfm}
  34.  
  35.  
  36. procedure TForm1.Button2Click(Sender: TObject);
  37. begin
  38. EsiNum();
  39. Label1.Caption:=IntToStr(ESIV);
  40. WordIn();
  41. Label4.Caption:=IntToStr(ESIV);
  42. end;
  43.  
  44. end.
  45.  
  46. ***********************************************************
  47.  
  48. StackOut1.asm
  49. ***********************************************************
  50. Title StackOut for 32 bit
  51. .486P
  52. .MODEL flat, STDCall
  53.  
  54.  
  55. ;PUBLIC StackOut
  56. PUBLIC WordIn
  57. PUBLIC ESINUM
  58.  
  59. .Data
  60. EXTRN ESIV: DWORD
  61.  
  62. a32 DD ?
  63. b32 DD ?
  64. c32 DD ?
  65. d32 DD ?
  66.  
  67. .CODE
  68.  
  69. WordIn proc
  70. mov a32,eax
  71. mov eax,110
  72. push ax
  73. push esi
  74. pop eax
  75. mov ESIV,eax
  76. pop ax
  77. mov eax,a32
  78. ret
  79. WordIn ENDP
  80.  
  81.  
  82.  
  83. ESINUM proc
  84. mov a32,eax
  85. push esi
  86. pop eax
  87. mov ESIV,eax
  88. mov eax,a32
  89. ret
  90. ESINUM ENDP
  91.  
  92. END
  93. ************************************************************


SOA Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 апреля 2026, 02:06
Выполнено за 0.03 сек.