Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2012, 17:26   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию Ввести строку в память динамически.

Добрый день. Я как-то не сталкивался с визуальным оформлением asm-программ. Сейчас задам глупый вопрос.
В языках высокого уровня есть такой вариант инициализации строки
Код:
str="Строка";
Можно ли как-то так сделать в asm без WinApi и дополнительных процедур?
Например:как же мне стыдно за этот бред
Код:
mov [str], 'Строка'
Т.е. чтобы для каждой строки не выделять память, а записывать поверх старой. Пока есть одно предположение: своя процедура и loop.
Хоть убейте не найду в гугл. Как я не извращался, не найду.
P.S. Давайте не будем выяснять чем я думаю, а просто решим и забудем недоразумение.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 02.03.2012, 17:42   #2
|{ot
Форумчанин
 
Аватар для |{ot
 
Регистрация: 09.03.2008
Сообщений: 127
По умолчанию

В Мasm можешь использовать макросы:
Код:
mov ebx, $CTA0("String");$CTW0
Цитата:
Т.е. чтобы для каждой строки не выделять память, а записывать поверх старой. Пока есть одно предположение: своя процедура и loop.
Хоть убейте не найду в гугл. Как я не извращался, не найду.
Это ты говоришь про "копировать строку", что бы просто ее использовать этого не надо:

Код:
.data 
strCaption db "Error Message"
strMessage db "Error in ..."

.code
......

lea ebx, strMessage
......
Вообще смотря что хочешь делать со строкой...

Ааа.. если хочешь именно инициализировать, то опять же от ситуации:
1. Помести переменную в .data и там стазу инициализируй
2. Если локальная переменная в процедуре, то можно либо скопировать нужную строку, или же хранить адрес строки в переменной, а заполнить адрес как выше..

Все зависит от контекста..

Последний раз редактировалось |{ot; 02.03.2012 в 17:46.
|{ot вне форума Ответить с цитированием
Старый 02.03.2012, 17:49   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Интересует работа без макросов, и по возможности Fasm.
Цитата:
strCaption db "Error Message"
strMessage db "Error in ..."
Ну а если таких строк много? Да и запоминать названия для каждой не вариант. А допустим если переменная 0, то записать одну строку, если нет, то другую. Вот в MessageBox можно сделать так, правда это не правильно
Код:
invoke MessageBox,0,'Текст', 'Внимание',NULL
Решение не оптимальное, даже строки сольются.
Вот пример на языке высокого уровня
Код:
if (i==0) 
{
str="Строка1";
}
else
{
str="Строка2";
}
Каждый раз выделять память жалко и не удобно.
Цитата:
Это ты говоришь про "копировать строку", что бы просто ее использовать этого не надо:
Это я про перезаписать строку.
Цитата:
Ааа.. если хочешь именно инициализировать, то опять же от ситуации:
1. Помести переменную в .data и там стазу инициализируй
2. Если локальная переменная в процедуре, то можно либо скопировать нужную строку, или же хранить адрес строки в переменной, а заполнить адрес как выше..
Короче, нет такой инструкции. Я думал, что так в скорости или памяти выиграю, но суть понял. Первый вариант - ясное дело. Ко второму я склонялся. Спасибо.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 02.03.2012 в 21:18.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 03.03.2012, 07:11   #4
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

если нужен массив строк, то можно оформить так:

Код:
s1 db "string 1"
s2 db "строка 2"
string_array dd s1, s2
т.е. загружая значения в edi из нужного элемента массива получишь готовое смещение на свою строку.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 04.03.2012, 10:55   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Вы немного не так меня поняли. У меня есть массив символов(строка). И во время выполнения я ее буду отображать, но запоминать имя массивов, если строк много не удобно. Например:
Я инициализирую строку(массив) и в нее заношу значение.
Вывожу ее на экран, и чтобы не создавать еще один массив и в него заносить значение, я просто перезаписываю старый. Вот как-то так. Сейчас, пока в консоли работаю использую CharToOem, но все равно приходится для каждой строки выделять память. Есть вариант - передавать значение через стек процедуре и потом перезаписывать массив, но вот нужно ли это?
Вот как работает функция Write() в паскале или cout<<? (Вообще это я могу и сам посмотреть) Неужели выделяет память для строки?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 04.03.2012 в 11:00.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 04.03.2012, 16:08   #6
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

у вас есть текст строки. Вы ведь понимаете что хоть где-то, но он должен храниться.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 04.03.2012, 18:36   #7
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию

Цитата:
где-то, но он должен храниться.
Я так и думал. Все отбрасываю эту затею. Но все же спрошу.
А как в языках высокого уровня работает, например, такой код:
Цитата:
str:='Строка';
?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 07.03.2012, 16:48   #8
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

строка хранится в секции данных. При загрузке берется адрес на нее, либо она копируется в нужное место.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 12.03.2012, 12:59   #9
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
str:='Строка';
в коде это будет выглядеть примерно так
Код:
s      db 6,"Строка"
....
Str   db 255 dup(?)
....

lea si, [s]
lea di, [str]
xor cx,cx
mov cl, byte ptr es:[si]
inc cl
rep movsb
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++]задать динамически строку tema65 Помощь студентам 2 03.01.2012 16:02
Как ввести строку???? firephenix Помощь студентам 2 18.02.2011 18:46
Ввести строку символьный данных Асемблер Max3 Помощь студентам 0 16.05.2010 19:41
динамически выделить память под верхний треугольник квадратной матрицы juventine Общие вопросы C/C++ 2 12.04.2009 13:06