Текущий архив: 2006.11.05;
Скачать: CL | DM;
ВнизAssembler & Delphi Найти похожие ветки
← →
Wolfheart (2006-10-18 03:12) [0]Доброго времени суток!
Вопрос мой достаточно тривиален, связан он с использованием Делфийского BASM (Buit-in Assembler).
Как поместить строковую константу (положим, "Hello, world!") в стёк и (или) регистр, после чего произвести какое-либо действие со стокой (например, к первоначальным данным добавить " Bye, world :)")?
Далее: необходимо вызвать ShowMessage и передать ей в качестве параметра занесённую в стёк, строку.
Заранее благодарен за помощь.
← →
Германн © (2006-10-18 03:15) [1]
> Wolfheart (18.10.06 03:12)
>
> Доброго времени суток!
> Вопрос мой достаточно тривиален, связан он с использованием
> Делфийского BASM (Buit-in Assembler).
> Как поместить строковую константу
Имхо, он не очень тривиален. Строка в Дельфи - не просто набор байт записанных в некоторые ячейки.
← →
Wolfheart (2006-10-18 03:21) [2]Судя по документации, следует проделать нечто вроде:
DB "Hello, world", 0A, 0D
К сожалению, компилятор при этом жутко ругается...
← →
Германн © (2006-10-18 03:29) [3]
> Wolfheart (18.10.06 03:21) [2]
>
> Судя по документации, следует проделать нечто вроде:
>
Позволь поинтересоваться, какую документацию ты имеешь в виду?
← →
Wolfheart (2006-10-18 03:33) [4]Обыкновенное Справочное Руководство Delphi... Информацию находил по предметному указателю запросом "DB directive".
← →
Германн © (2006-10-18 03:43) [5]
> Wolfheart (18.10.06 03:33) [4]
Прочитал. Ничем не могу помочь. Если только завтра, "на свежую голову". :-(
← →
atruhin © (2006-10-18 05:08) [6]> Судя по документации, следует проделать нечто вроде:
> DB "Hello, world", 0A, 0D
Во первых 0A лишнее, во вторых строка будет не в стеке, а в сегменте данных. Поместить в стек только побайтно например pop. Зачем вообще это нужно?
← →
Сергей М. © (2006-10-18 08:52) [7]
> Wolfheart (18.10.06 03:12)
Работа со строковыми данными именно в стеке - это что, блажь ? Или учебное задание ? Или чем-то обоснованная необходимость ?
← →
Anatoly Podgoretsky © (2006-10-18 09:57) [8]
> DB "Hello, world", 0A, 0D
Потому что сплошной бред.
← →
Чапаев © (2006-10-18 09:59) [9]> в стёк
Не называй stack так, он может обидеться и отказаться помещать с себя что бы то ни было. ;-)
> Как поместить строковую константу
Лучше поместить её адрес.
> Далее: необходимо вызвать ShowMessage и передать ей в качестве
> параметра занесённую в стёк, строку.
Таки адрес нужен. А вообще -- вызови ShowMessage() "традиционно", а потом посмотри сгенерированный ассемблерный код.
> [2] Wolfheart (18.10.06 03:21)
С чего ты решил, что это будет в стеке?
> Во первых 0A лишнее
Неправда. Перевод строки в ДОС/Вин -- #13#10.
> во вторых строка будет не в стеке, а в сегменте данных
Ну да? Если я в потоке кода между asm end помещу некоторые байты, они окажутся в сегменте данных? С чего бы? В сегменте кода это Hello world будет.
> Работа со строковыми данными именно в стеке - это что, блажь
> ?
Неопытность.
Автор, ищи и читай книгу Зубкова. Там и не такие извращения есть наряду с объяснением, почему извращаться не стоит. ;-)
← →
Сергей М. © (2006-10-18 10:05) [10]
> Чапаев © (18.10.06 09:59) [9]
Открытые массивы в Делфи толкаются компилятором именно в стек)
← →
evvcom © (2006-10-18 11:23) [11]> [10] Сергей М. © (18.10.06 10:05)
точнее их копии. И не только открытые массивы, но и статические, и записи из параметров. Если нет волшебных const и var.
← →
Сергей М. © (2006-10-18 11:44) [12]
> evvcom © (18.10.06 11:23) [11]
> но и статические, и записи из параметров
> Если нет волшебных const и var
Разместит или не разместит компилятор именно содержимое таких массивов в стеке, зависит не только и не столько от наличия или отсутствия const и var. На это влияет и размер массива/записи и соглашение о вызове.
← →
Wolfheart (2006-10-18 12:14) [13]Приветствую.
Традиционно, автору задаются встречные вопросы на подобии "зачем", "почему" и т.д. :)
Не следует меня переубеждать, что на самом деле мне всё это ни к чему и незачем :) Просто-напросто я бьюсь над вопросом, как с помощью ассемблерных комманд вызвать ShowMessage и передать ему в качестве параметра строку, предусмотрительно занесённую в стёк. Хотелось бы научится этому, чтобы со временем выполнять гораздо более сложные задачи, в которых ассемблер просто незаменим.
Скажем так, лабораторная работа ;)
Если кто-нибудь в состоянии удовлетворить моё любопытство, честь тому и хвала, полцарства в придачу.
← →
Сергей М. © (2006-10-18 12:28) [14]
> Wolfheart (18.10.06 12:14) [13]
Сам-то хоть какие-нибудь потуги на эту тему предпринимал ?
Окно CPU анализировал для начала ?
← →
nicesc (2006-10-18 12:52) [15]var
msgHello: string;
begin
msgHello:="ASM_ASM_ASM";
asm
mov eax,msgHello
call ShowMessage
end;
end;
← →
Сергей М. © (2006-10-18 12:53) [16]
> nicesc (18.10.06 12:52) [15]
Ай малацца !
Ну кто ж знал, что все так просто)
← →
nicesc (2006-10-18 13:00) [17]"предусмотрительно занесённую в стёк."
ты совсем плаваешь в дельфевом асме :\
дело в том, что по умолчанию если кол-во параметров ф-ии/процедуры меньше 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
"в которых ассемблер просто незаменим" - драйвера собрался писать?
вообще таких задач гораздо меньше, чем может показаться на первый взгляд и в АСМе нужно рубить очень хорошо, что бы был прирост производительности.
← →
nicesc (2006-10-18 13:17) [18]"Ай малацца !
Ну кто ж знал, что все так просто)"
дада, я старался
пропустил что без 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;
← →
Wolfheart (2006-10-18 13:18) [19]> Сергей М. ©
Разумеется. К помощи зала (т.е. к форуму) обращаюсь всегда в последнюю очередь. Мне удалось найти много чего полезного, однако, как назло, о работе со строками - практически ни слова.
> nicesc
Благодарствую за помощь!
Пример работает отлично, хотя у меня имеется вопрос на засыпку: как присвоить идентификатору msgHello строку "ASM_ASM_ASM" с помощью ассемблера (т.е. без использования оператора присвоения ":=").
> "в которых ассемблер просто незаменим" - драйвера собрался писать?
Ну, до написания драйвера мне ещё очень-очень далеко :)
Хотелось пополнить свой багаж знаний впрок.
← →
Wolfheart (2006-10-18 13:20) [20]nicesc, за второй пример Огромнейшее Спасибо!
Не могли бы Вы прокомментировать каждую строку, чтобы я знал что к чему и почему?
Спасибо!
← →
Сергей М. © (2006-10-18 13:21) [21]
> nicesc (18.10.06 13:17) [18]
> дада, я старался
Что-то плохо ты старался ..не удосужился "запихать" строковые данные в стек, т.е. не проиллюстрировал именно то что требуется автору)
← →
nicesc (2006-10-18 13:25) [22]"как присвоить идентификатору msgHello"
lea eax, [@msg]
после данной операции eax указывает на строку в памяти
если ты хочешь сложить две строки, то во-первых ты должен понимать, что строка будет занимать больше места и поэтому этого ТЕБЕ придется выделять память
во-торых: нельзя размещать строки в коде: DB "ASM_ASM_ASM",0
так как секция кода по умолчанию не доступна для записи
← →
nicesc (2006-10-18 13:32) [23]Сергей М. - харе стебаться, этодля новичков раздел, а не для гуру, так что меньше понтов товаристч
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;
← →
Wolfheart (2006-10-18 13:32) [24]О"кэй, теперь ясна причина возникновения исключения Delphi : "Privileget instruction"...
nicesc, не могли бы Вы продемонстрировать "сшивание" двух строк на примере?
← →
Wolfheart (2006-10-18 13:33) [25]О, за комментарии Спасибо! Пригодятся :)
← →
nicesc (2006-10-18 13:37) [26]да, я параметры перепутал
push 64 // тип окна
lea eax, [@msg] // заголовок
push eax
lea ecx,[@MSG2]
push ecx
push 0
CALL MessageBoxA
← →
Wolfheart (2006-10-18 13:38) [27]> nicesc (18.10.06 13:37) [26]
> да, я параметры перепутал
То есть, передавать параметры необходимо в обратной последовательности?
← →
Сергей М. © (2006-10-18 13:49) [28]
> nicesc (18.10.06 13:32) [23]
> харе
> понтов
Раздел, заметь, и не для любителей дешевого доморощенного тин-сленга.
← →
vegarulez © (2006-10-18 13:50) [29]http://www.podgoretsky.com/ddp.html
Вот тут почитай.
← →
nicesc (2006-10-18 13:57) [30]да
Страницы: 1 вся ветка
Текущий архив: 2006.11.05;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.091 c