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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 3 852

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Моя проблема состоит в следующем:
Я пишу программу на Delphi к которой присоединяется obj файл написанный на TASM, в файле простая функция movl, которая присваивает переменной x значение известной переменной a=64h.
Затем при нажатии на кнопку значение переменной x должно отобразиться в поле Edit1.
При трассировке программы я обнаружил что код из obj файла выполняется корректно, но при попытке вывода значения переменной x в поле Edit1 возникает ошибка обращения к памяти.
Также было обнаружено что если поместить вызов процедуры movl в обработчик события FormCreate ошибка обращения к памяти не возникает. Но это не удобно так как не даёт возможности вызывать процедуру в любой момент.
После этого я попытался вставить вызов процедуры movl в другую процедуру Mymove, в надежде что это решит проблему, но ошибка возникает и в этом случае.
Надеюсь что эксперты помогут мне найти способ решения данной проблемы.
Илья.

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

Приложение:
  1. mov_32.asm
  2. =========================================================
  3. Title move for 32 bits
  4.  
  5. .386P
  6. .MODEL FLAT, stdcall
  7. PUBLIC Movl
  8.  
  9. .DATA
  10. extrn x:DWORD
  11. a DD 64h
  12.  
  13. .CODE
  14. Movl proc
  15.  
  16.  
  17.  
  18.  
  19. ret
  20. Movl ENDP
  21.  
  22. END
  23. ===================================================
  24.  
  25. Mov32.pas
  26. ===================================================
  27. unit Mov32;
  28.  
  29. interface
  30.  
  31. uses
  32. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  33. Dialogs, StdCtrls;
  34.  
  35. type
  36. TForm1 = class(TForm)
  37. Edit1: TEdit;
  38. Button1: TButton;
  39. procedure Button1Click(Sender: TObject);
  40. //procedure FormCreate(Sender: TObject);
  41. private
  42. { Private declarations }
  43. public
  44. { Public declarations }
  45. end;
  46.  
  47. Procedure Mymove();
  48. Procedure Movl(); STDCall; EXTERNAL;
  49. {$L MOV_32.obj}
  50.  
  51. var
  52. Form1: TForm1;
  53. x:longint;
  54. p:Pointer;
  55.  
  56. implementation
  57.  
  58. {$R *.dfm}
  59.  
  60. procedure TForm1.Button1Click(Sender: TObject);
  61. begin
  62. Movl();
  63. Edit1.Text:=IntToStr(x);
  64. end;
  65.  
  66. {
  67. procedure TForm1.FormCreate(Sender: TObject);
  68. begin
  69. movl();
  70. end;
  71. }
  72.  
  73. {
  74. Procedure Mymove();
  75. begin
  76. Movl();
  77. End;
  78. }
  79.  
  80. end.
  81. ===================================================


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

Вопрос задал: SOA (статус: Посетитель)
Вопрос отправлен: 6 марта 2010, 12:02
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Паровоз

Здравствуйте, SOA!

Вот правила использования регистров в DelphiЖ
Выражения asm должны сохранять регистры EDI, ESI, ESP, EBP и EBX, но могут свободно изменять регистры EAX, ECX и EDX.

Вы меняете регистр BX, что приводит к ошибке. Если Вам нужно использовать этот регистр, то сначала сохраните его в стеке: push ebx, а перед выходом из процедуры восстановите его: pop ebx.

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 6 марта 2010, 19:12
Оценка за ответ: 4


Мини-форум вопроса

Всего сообщений: 7; последнее сообщение — 7 марта 2010, 09:23; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 6 марта 2010, 12:06 [#1]:

А для чего вообще нужна функция на ассемблере, да ещё и в отдельном файле?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 6 марта 2010, 12:21 [#2]:

В данный момент я просто изучаю ASM по книге Голубъ "Искусство программирования на ассемблере", а вообще я хочу писать на асме процедуры и функции для доступа к железу, и ядру системы, а интерфейс использовать от Delphi.
Ответ на мой вопрос мне уже дали в другом форуме, оказывается что в дельфийских процедурах можно свободно использовать только регистры AX, CX, DX. Действительно при смене bx на dx все заработало как часы.
min@y™

min@y™ (статус: Доктор наук), 6 марта 2010, 12:31 [#3]:

Цитата (SOA):

а вообще я хочу писать на асме процедуры и функции для доступа к железу, и ядру системы, а интерфейс использовать от Delphi.

Тогда чем тебя не устраивает ассемблер, встроенный в Delphi?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
SOA

SOA (статус: Посетитель), 6 марта 2010, 15:32 [#4]:

В борландовском асме меньше возможностей(так считается), да и потом я хочу освоить asm как он есть.
Вадим К

Вадим К (статус: Академик), 6 марта 2010, 21:07 [#5]:

Ассемблер - это не залог доступа к ядру операционной системы или железу. Можно всё писать и на делфи. А вот знания С/С++ абсолютно не помешают.

Но если хочется изучать асм, то лучше брать полноценный ассемблер типа FASM или MASM.
Галочка "подтверждения прочтения" - вселенское зло.
SOA

SOA (статус: Посетитель), 7 марта 2010, 06:44 [#6]:

Не знаю как насчет FASM, а вот у MASM формат obj файлов несовместим с delphi и поэтому я использую TASM, который тоже на мой взгляд достаточно не плох и популярен.
Насчет C/C++ базовые знания есть, но изучать его в глубину чтото лень, для себя из языков высокого уровня я уже давно выбрал Delphi.
min@y™

min@y™ (статус: Доктор наук), 7 марта 2010, 09:23 [#7]:

Цитата (SOA):

Насчет C/C++ базовые знания есть, но изучать его в глубину чтото лень

А вот и зря!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:56
Выполнено за 0.03 сек.