Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.037 c
4-1150704205
_Вован
2006-06-19 12:03
2006.11.05
Не могу скопировать/удалить файл на диске Novell 4.2


15-1161070678
Kolan
2006-10-17 11:37
2006.11.05
Обещаный фото со свадьбы :)


11-1137747496
-=Mike=-
2006-01-20 11:58
2006.11.05
Вопрос по ListView


2-1161276226
Чародей
2006-10-19 20:43
2006.11.05
Потоки


15-1160080323
Cyrax
2006-10-06 00:32
2006.11.05
Итераторы в Delphi





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский