Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.54 MB
Время: 0.044 c
11-1137519814
Vladimir Kladov
2006-01-17 20:43
2006.11.05
ProjMover


15-1161095946
Игорь ЖАКО
2006-10-17 18:39
2006.11.05
Ehlib 3.6 требует запуска IDE


2-1161614697
pathfinder
2006-10-23 18:44
2006.11.05
Представление строки как последовательности байтов..


3-1157548675
tytus
2006-09-06 17:17
2006.11.05
Помогите с курсором


15-1160968930
Slider007
2006-10-16 07:22
2006.11.05
С днем рождения ! 16 октября