|
Вопрос # 3 852/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Моя проблема состоит в следующем:
Я пишу программу на Delphi к которой присоединяется obj файл написанный на TASM, в файле простая функция movl, которая присваивает переменной x значение известной переменной a=64h.
Затем при нажатии на кнопку значение переменной x должно отобразиться в поле Edit1.
При трассировке программы я обнаружил что код из obj файла выполняется корректно, но при попытке вывода значения переменной x в поле Edit1 возникает ошибка обращения к памяти.
Также было обнаружено что если поместить вызов процедуры movl в обработчик события FormCreate ошибка обращения к памяти не возникает. Но это не удобно так как не даёт возможности вызывать процедуру в любой момент.
После этого я попытался вставить вызов процедуры movl в другую процедуру Mymove, в надежде что это решит проблему, но ошибка возникает и в этом случае.
Надеюсь что эксперты помогут мне найти способ решения данной проблемы.
Илья.
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- mov_32.asm
- =========================================================
- Title move for 32 bits
-
- .386P
- .MODEL FLAT, stdcall
- PUBLIC Movl
-
- .DATA
- extrn x:DWORD
- a DD 64h
-
- .CODE
- Movl proc
-
-
-
-
- ret
- Movl ENDP
-
- END
- ===================================================
-
- Mov32.pas
- ===================================================
- unit Mov32;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls;
-
- type
- TForm1 = class(TForm)
- Edit1: TEdit;
- Button1: TButton;
- procedure Button1Click(Sender: TObject);
- //procedure FormCreate(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- Procedure Mymove();
- Procedure Movl(); STDCall; EXTERNAL;
- {$L MOV_32.obj}
-
- var
- Form1: TForm1;
- x:longint;
- p:Pointer;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- Movl();
- Edit1.Text:=IntToStr(x);
- end;
-
- {
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- movl();
- end;
- }
-
- {
- Procedure Mymove();
- begin
- Movl();
- End;
- }
-
- end.
- ===================================================
 |
Вопрос задал: 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™ (статус: Доктор наук), 6 марта 2010, 12:06 [#1]:
А для чего вообще нужна функция на ассемблере, да ещё и в отдельном файле?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 6 марта 2010, 12:21 [#2]:
В данный момент я просто изучаю ASM по книге Голубъ "Искусство программирования на ассемблере", а вообще я хочу писать на асме процедуры и функции для доступа к железу, и ядру системы, а интерфейс использовать от Delphi.
Ответ на мой вопрос мне уже дали в другом форуме, оказывается что в дельфийских процедурах можно свободно использовать только регистры AX, CX, DX. Действительно при смене bx на dx все заработало как часы.
|
|
min@y™ (статус: Доктор наук), 6 марта 2010, 12:31 [#3]:
Цитата (SOA):
а вообще я хочу писать на асме процедуры и функции для доступа к железу, и ядру системы, а интерфейс использовать от Delphi.
Тогда чем тебя не устраивает ассемблер, встроенный в Delphi?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 6 марта 2010, 15:32 [#4]:
В борландовском асме меньше возможностей(так считается), да и потом я хочу освоить asm как он есть.
|
|
Вадим К (статус: Академик), 6 марта 2010, 21:07 [#5]:
Ассемблер - это не залог доступа к ядру операционной системы или железу. Можно всё писать и на делфи. А вот знания С/С++ абсолютно не помешают.
Но если хочется изучать асм, то лучше брать полноценный ассемблер типа FASM или MASM.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
SOA (статус: Посетитель), 7 марта 2010, 06:44 [#6]:
Не знаю как насчет FASM, а вот у MASM формат obj файлов несовместим с delphi и поэтому я использую TASM, который тоже на мой взгляд достаточно не плох и популярен.
Насчет C/C++ базовые знания есть, но изучать его в глубину чтото лень, для себя из языков высокого уровня я уже давно выбрал Delphi.
|
|
min@y™ (статус: Доктор наук), 7 марта 2010, 09:23 [#7]:
Цитата (SOA):
Насчет C/C++ базовые знания есть, но изучать его в глубину чтото лень
А вот и зря!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|