Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Assembler & Delphi [D6, D7, WinXP]


Страницы:   1 2

Wolfheart ©   (2006-10-18 03:12:00) 

Доброго времени суток!
Вопрос мой достаточно тривиален, связан он с использованием Делфийского BASM (Buit-in Assembler).
Как поместить строковую константу (положим, "Hello, world!") в стёк и (или) регистр, после чего произвести какое-либо действие со стокой (например, к первоначальным данным добавить " Bye, world :)")?
Далее: необходимо вызвать ShowMessage и передать ей в качестве параметра занесённую в стёк, строку.
Заранее благодарен за помощь.


nicesc   (2006-10-18 13:57:00) [1]

да


vegarulez   (2006-10-18 13:50:00) [2]

http://www.podgoretsky.com/ddp.html
Вот тут почитай.


Сергей М.   (2006-10-18 13:49:00) [3]


> nicesc   (18.10.06 13:32) [23]


> харе
> понтов


Раздел, заметь, и не для любителей дешевого доморощенного тин-сленга.


Wolfheart   (2006-10-18 13:38:00) [4]

> nicesc   (18.10.06 13:37) [26]
> да, я параметры перепутал

То есть, передавать параметры необходимо в обратной последовательности?


nicesc   (2006-10-18 13:37:00) [5]

да, я параметры перепутал
   push 64 // тип окна
   lea eax, [@msg] // заголовок
   push eax
   lea ecx,[@MSG2]
   push ecx
   push 0
   CALL MessageBoxA


Wolfheart   (2006-10-18 13:33:00) [6]

О, за комментарии Спасибо! Пригодятся :)


Wolfheart   (2006-10-18 13:32:00) [7]

О'кэй, теперь ясна причина возникновения исключения Delphi : "Privileget instruction"...
nicesc, не могли бы Вы продемонстрировать "сшивание" двух строк на примере?


nicesc   (2006-10-18 13:32:00) [8]

Сергей М. - харе стебаться, этодля новичков раздел, а не для гуру, так что меньше понтов товаристч

asm // начало асм кода
  JMP @SHOWMSG // прыгаем на начало выполняемого кода, иначе
// машина попытается выполнить строку ASM_ASM_ASM, что одназначно
// приведет к краху приложения
@MSG: // метка, которая указывает на строку 1
  DB 'ASM_ASM_ASM',0 // сама строка
@MSG2: // метка, которая указывает на строку 2
  DB 'ASM_ASM_ASM2',0 // сама строка
@SHOWMSG: // метка на начало кода
  push 0 // вспомни параметры ф-ии MessageBoxA(handle,Str1,Str2,Вид
// сообщения)
  lea eax,[@msg]  // заносим в EAX указатель на строку
  push eax // второй парметр
  lea eax,[@MSG2]
  push eax
  push 64 // вид сообщения, можешь тут использовать MB_OK и т.п. константы
  CALL MessageBoxA // вызов ф-ии сообщения
end;


nicesc   (2006-10-18 13:25:00) [9]

"как присвоить идентификатору msgHello"
lea eax, [@msg]
после данной операции eax указывает на строку в памяти
если ты хочешь сложить две строки, то во-первых ты должен понимать, что строка будет занимать больше места и поэтому этого ТЕБЕ придется выделять память
во-торых: нельзя размещать строки в коде: DB 'ASM_ASM_ASM',0
так как секция кода по умолчанию не доступна для записи


Сергей М.   (2006-10-18 13:21:00) [10]


> nicesc   (18.10.06 13:17) [18]


> дада, я старался


Что-то плохо ты старался ..не удосужился "запихать" строковые данные в стек, т.е. не проиллюстрировал именно то что требуется автору)


Wolfheart   (2006-10-18 13:20:00) [11]

nicesc, за второй пример Огромнейшее Спасибо!
Не могли бы Вы прокомментировать каждую строку, чтобы я знал что к чему и почему?
Спасибо!


Wolfheart   (2006-10-18 13:18:00) [12]

> Сергей М. ©
Разумеется. К помощи зала (т.е. к форуму) обращаюсь всегда в последнюю очередь. Мне удалось найти много чего полезного, однако, как назло, о работе со строками - практически ни слова.

> nicesc

Благодарствую за помощь!
Пример работает отлично, хотя у меня имеется вопрос на засыпку: как присвоить идентификатору msgHello строку "ASM_ASM_ASM" с помощью ассемблера (т.е. без использования оператора присвоения ":=").

> "в которых ассемблер просто незаменим" - драйвера собрался писать?

Ну, до написания драйвера мне ещё очень-очень далеко :)
Хотелось пополнить свой багаж знаний впрок.


nicesc   (2006-10-18 13:17:00) [13]

"Ай малацца !
Ну кто ж знал, что все так просто)"
дада, я старался

пропустил что без VAR, но можно так:
asm
   JMP @SHOWMSG
@MSG:
   DB 'ASM_ASM_ASM',0
@MSG2:
   DB 'ASM_ASM_ASM2',0
@SHOWMSG:
   push 0
   lea eax,[@msg]
   push eax
   lea eax,[@MSG2]
   push eax
   push 64
   CALL MessageBoxA
 end;


nicesc   (2006-10-18 13:00:00) [14]

"предусмотрительно занесённую в стёк."
ты совсем плаваешь в дельфевом асме :\
дело в том, что по умолчанию если кол-во параметров ф-ии/процедуры меньше 4, то параметры передаются через регистры EAX,ECX,EDX, хотя ты можешь сам объявить как передавать параметры через стэк или через регистры.
Вот отличные книги по BASMу
http://podgoretsky.com/cgi-bin/dlcounter/npscnt?file=http://podgoretsky.com/ftp/Docs/Delphi/basm/BasmForBeginners-ru.doc&file_id=BasmForBeginners-ru
http://podgoretsky.com/ftp/Docs/Delphi/basm/basmru.zip

"в которых ассемблер просто незаменим" - драйвера собрался писать?
вообще таких задач гораздо меньше, чем может показаться на первый взгляд и в АСМе нужно рубить очень хорошо, что бы был прирост производительности.


Сергей М.   (2006-10-18 12:53:00) [15]


> nicesc   (18.10.06 12:52) [15]


Ай малацца !
Ну кто ж знал, что все так просто)


nicesc   (2006-10-18 12:52:00) [16]

var
 msgHello: string;
begin
 msgHello:='ASM_ASM_ASM';
 asm
   mov eax,msgHello
   call ShowMessage
 end;
end;


Сергей М.   (2006-10-18 12:28:00) [17]


> Wolfheart   (18.10.06 12:14) [13]


Сам-то хоть какие-нибудь потуги на эту тему предпринимал ?
Окно CPU анализировал для начала ?


Wolfheart   (2006-10-18 12:14:00) [18]

Приветствую.
Традиционно, автору задаются встречные вопросы на подобии "зачем", "почему" и т.д. :)
Не следует меня переубеждать, что на самом деле мне всё это ни к чему и незачем :) Просто-напросто я бьюсь над вопросом, как с помощью ассемблерных комманд вызвать ShowMessage и передать ему в качестве параметра строку, предусмотрительно занесённую в стёк. Хотелось бы научится этому, чтобы со временем выполнять гораздо более сложные задачи, в которых ассемблер просто незаменим.
Скажем так, лабораторная работа ;)
Если кто-нибудь в состоянии удовлетворить моё любопытство, честь тому и хвала, полцарства в придачу.


Сергей М.   (2006-10-18 11:44:00) [19]


> evvcom ©   (18.10.06 11:23) [11]


> но и статические, и записи из параметров
> Если нет волшебных const и var


Разместит или не разместит компилятор именно содержимоетаких массивов в стеке, зависит не только и не столько от наличия или отсутствия const и var. На это влияет и размер массива/записи и соглашение о вызове.


evvcom   (2006-10-18 11:23:00) [20]

> [10] Сергей М. ©   (18.10.06 10:05)

точнее их копии. И не только открытые массивы, но и статические, и записи из параметров. Если нет волшебных const и var.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо