![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Assembler & Delphi [D6, D7, WinXP]
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.