Форум: "Система";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
ВнизХочу писать модули на ассемблере Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.047 c