Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

Хочу писать модули на ассемблере   Найти похожие ветки 

 
ma5ter ©   (2004-02-19 06:39) [0]

Товарисчи помогите. Нужна вводная информация по подключению к Д7 ассемблерного модуля f.ex.: {$l test.obj}. Задача на первом этапе простая: пишу на асм-е, компилирую obj-файл и такой вот директивой подключаю к проге.
Внутри асмового модуля:

       title Mulword
.586
.MODEL flat, PASCAL
;z=5*w
data segment para public
 Extrn w:word, z:Dword
data ends
code segment para public
assume cs:code, ds:data
Public MULword
MULword proc far
mov eax,w
mov z,eax
ret
MULword endp
code ends
end

получаю цифирь, пишу в другую переменную и выдаю наружу. Так вот такая схема не работает. Говорит ошибка по адресу FFFFFFFF и т.д. Может рабочий примерчик кто-нибудь скинет с исходником на Дельфи и АСМ-е - дюже не хочется на внутреннем АСМ-е писать.


 
Ma5ter ©   (2004-02-19 06:49) [1]

Дельфовая часть проги выглядит так:

{$f+}
{$l Mulword.obj}

Procedure MULword(w,z:word);external;

procedure TForm1.Button1Click(Sender: TObject);
begin
w:=55;
MULword(w,z);
Label1.Caption:=inttostr(z);
end;
{$f-}


 
icWasya ©   (2004-02-19 14:33) [2]

ну во первых
Procedure MULword(w,var z:word);external;
если не указаны спецификации stdcall или safecall, то по умолчанию параметры передаются через регистры
первый параметр в EAX, второй EDX

в Asme тогда надо просто написать

MULword proc far
mov word ptr [edx],eax
ret


 
AKul ©   (2004-02-19 15:19) [3]


> ma5ter ©   (19.02.04 06:39)  

Во-первых, процедура, написанная на ассемблере, не использует никаких параметров - Вы просто записываете значение из внешней переменной w (кстати, здесь тоже ошибка - она у Вас типа word, а записываете ее в 32-битный регистр простой командой mov!!! Компилятор Вам на это ничего не сказал? используйте, например, movzx), в переменную z и все. Т.е. на Delphi это выглядело приблизительно так:
var w:WORD,z:DWORD;
Procedure MULword;
begin
 Z:=w;
end;
Уберите параметры из объявления, если не используете их.

Во-вторых, ошибка, из-за которой вызывается исключение, - это то, что Вы объявили процедуру как FAR. - ??? Зачем???
Само-собой, Delphi компилирует ее вызов как ближний, а вот возвращаетесь Вы из не как из дальней (в селектор кода загружается левое значение).
Уберите объявление FAR, лставьте только
 MULword proc

Вот Вам простой работающий пример процедуры умножения (беззнакового)
И почему Вы хотели умножение???

       .586
       .model FLAT

CODE    SEGMENT  para public

       Public  MULword
MULword PROC STDCALL Value:WORD, MulBy:WORD
movzx   eax,Value
       mul     MulBy
       ret
MULword ENDP

CODE    ENDS
       END

В Delphi объявите функцию:
function MULword(Value,MulBy:word):DWORD;stdcall;external;


 
Digitman ©   (2004-02-19 17:49) [4]


> AKul ©   (19.02.04 15:19) [3]



> Delphi компилирует ее вызов как ближний, а вот возвращаетесь
> Вы из не как из дальней (в селектор кода загружается левое
> значение).


я, конечно, могу ошибаться (просто не помню), но ты не загнул ? с селектором кода ? при плоской модели ?


 
default ©   (2004-02-19 17:57) [5]

Digitman ©   (19.02.04 17:49) [4]
не загнул


 
AKul ©   (2004-01-23 13:38) [6]


> Digitman ©   (19.02.04 17:49) [4]

Не загнул!
Ибо в ассемблерном коде у него ЯВНО было указано, что процедура MULword дальнего вызова:

> MULword proc far

Вот выделенное жирным это и есть "спецификация" вызова!
Возврат из этой процедуры - у него просто RET, компилятор само-собой поставит дальний.

P.S. А причем тут модель памяти??? Разве она запрещает использовать каких-либо инструкции.


 
ma5ter ©   (2004-02-23 13:55) [7]

Спасибо за дискуссию по моей теме, однако [2Akul] предложенный код не сработал:"Unsatisfied forward or external declaration". Выдает на стадии компиляции. Встает в строке объявления внешней процедуры.
{$R *.dfm}
{$f+}
{$l Mulword.obj}
function MULword(Value,MulBy:word):DWORD;stdcall;external;
procedure TForm1.Button1Click(Sender: TObject);
begin
w:=55;
z:=5;
Label1.Caption:=inttostr(MULword(w,z));
end;
{$f-}

Может быть есть готовый пример на асм-е + DELPHI-проект? Компилирую асм-файлы Microsoft (R) Macro Assembler Version 6.14.8444 ...


 
AKul ©   (2004-02-23 14:17) [8]


> ma5ter ©   (23.02.04 13:55) [7]
> код не сработал:"Unsatisfied forward or external declaration".

При чем тут "код не сработал"???
"Unsatisfied forward or external declaration" говорит о том, что линкер не нашел процедуру MULword ни в одном из подключенных модулей.
Либо Вы ошиблись в объявлении имен, либо подключили не тот "obj"-ник

> {$R *.dfm}
> {$f+}  // ЭТО ЗАЧЕМ???????????
> {$l Mulword.obj}



> Может быть есть готовый пример на асм-е + DELPHI-проект?

Этот пример я проверил у себя на машине: Все нормально компилируется (линкуется), нормально работает.
Использовал:
Ассемблер - tasm v 5.3
Delphi 5.0


 
AKul ©   (2004-02-23 15:24) [9]


> ma5ter ©   (23.02.04 13:55) [7]
> Компилирую асм-файлы Microsoft (R) Macro Assembler Version
> 6.14.8444 ...

С этого начинать надо было, что Вы masm используете (странное решение).
masm при объявлении STDCALL к имени метки добавляет суффикс с размером стека!!! - отсюда у Вас и несоответствие имен...

замените (см. мой пост [3])

> MULword PROC STDCALL Value:WORD, MulBy:WORD

на

MULword PROC PASCAL Value:WORD, MulBy:WORD


 
ma5ter ©   (2004-02-26 13:30) [10]

Все работает. Спасибо.


 
VMcL ©   (2004-02-26 16:37) [11]

2 ma5ter:
чем не устраивает BASM?


 
ma5ter ©   (2004-03-01 13:11) [12]

2 VMcL:
ХБЗ... Читаю книгу Н.Г.Голубь "Искусство программирования на асм-е". Вроде как у TASM-а косяки есть ... вот и начал с MASM ...
8-{|

Кстати вопрос, пример рабочий, однако при попытке добавить к нему процедуры сложения двух чисел возникает таже ошибка - не определена процедура или функция в модуле (кажись). По раздельности процедуры работают, а вместе нет.

.586
       .model FLAT

CODE    SEGMENT  para public

      Public  MULword

MULword PROC PASCAL Value:WORD, MulBy:DWORD
movzx   eax,Value
mul     MulBy
       ret
MULword ENDP

      Public  addaS

addaS PROC PASCAL as1:byte, bs1:byte
mov al,as1
mov cl,bs1
add     al,cl
       ret
addaS ENDP

CODE    ENDS
      END


 
ma5ter ©   (2004-03-01 13:14) [13]

А в дельфе объявляю функции так:
function MULword(Value,MulBy:word):DWORD;STDCALL;external;
function addaS(as1,bs1:byte):byte;STDCALL;external;


 
VMcL ©   (2004-03-01 20:34) [14]

>>ma5ter ©  (01.03.04 13:11) [12]

У TASM нет косяков. Делать Борланду нечего, как писать глючные трасляторы. Это раз. Во-вторых, я про BASM спрашивал (built-in asm).


 
ma5ter ©   (2004-03-02 06:52) [15]

1) Урезан.
2) Некоторые конструкции, кт. описываются в книжках не понятно как реализовать.
3) Опыт созданий внешних модулей, их подключения и использования. Всегда полезно.
4) Нет доки по BASM и особенностям программирования на нем.
5) В случае внешнего модуля: уверен что все работает так как хотелось и моглось, в проекте DELPHI минимум кода - только объявление процедуры и ее использование. Некое подобие KOL, только узкоспециализировано для себя и того парня.
6) TASM мне понравился больше ... теперь. Поставил, посмотрел, одобрил. Девствительно удобнее.


 
VMcL ©   (2004-03-02 07:41) [16]

>>ma5ter ©  (02.03.04 06:52) [15]

>3) Опыт созданий внешних модулей, их подключения и использования. Всегда полезно.
Это слишком правильно, чтоб с этим можно было не согласиться.
Только вот, например, в D6:
1) появились конструкции VMTOFFSET и DMTINDEX. Ты их не сможешь реализовать во внешнем asm-модуле. Только в BASM.
2) поддержка MMX, SSE, ... инструкций. В MASM последних версий она тоже, вроде, есть; в TASM - не уверен.

>4) Нет доки по BASM и особенностям программирования на нем.
Да что ты говоришь! С такими высказываниями надо поосторожнее, м. ч.
http://podgoretsky.com/ddp.html

В общем, ИМХО, в большинстве случаев хватает BASM.


 
ma5ter ©   (2004-03-02 11:14) [17]

Я же не говорю, что доки вообще нет. У меня ее нет, хотя искал и достаточно вдумчиво... За ссылку спасибо.

М-м-м

Большое спасибо!!! Сколько вкусного ...



Страницы: 1 вся ветка

Текущий архив: 2004.04.25;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.061 c
1-1081366941
Time
2004-04-07 23:42
2004.04.25
Со временем поясните


3-1080805412
LAndreyV
2004-04-01 11:43
2004.04.25
связка SELECT FROM WHERE ORDER BY выдает ошибку!


4-1077406924
OverSet
2004-02-22 02:42
2004.04.25
Перемещение заголовка окна


6-1078011744
ALF
2004-02-29 02:42
2004.04.25
SMTP-отправка писем через IdSMTP


1-1081345696
LD
2004-04-07 17:48
2004.04.25
move для string