Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.049 c
14-1080792433
Паниковский
2004-04-01 08:07
2004.04.25
Набираю команду декодеров!


3-1080293016
russko
2004-03-26 12:23
2004.04.25
Нехватка памяти при вызове БД


14-1081170459
VID
2004-04-05 17:07
2004.04.25
Куда IE положил скачанные обновления для Windows ?


1-1081159122
Chereepovets
2004-04-05 13:58
2004.04.25
HKEY_CURRENT_USER, Что за глюк


1-1081544782
Reset
2004-04-10 01:06
2004.04.25
Удаление объекта из массива по OnClick





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский