![]() |
|
![]() ![]() ![]() |
|
under_sun |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 3.10.2007 Где: Ебург Репутация: нет Всего: 17 |
Привет всем!
Возникли трудности с сохранением данных, прочитанных из коммандной строки. Читаю данные посимвольно следующим образом:
Из прочитанных до очередного пробела символов нужно собрать строку, а затем поместить ее в массив. Подскажите идею, как это можно реализовать? --------------------
TMTOWTDI |
|||
|
||||
SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: нет Всего: 91 |
Я так и не понял что ты хочешь сделать. Разбить строку с параметрами на несколько строк, а разделителем считать пробел ?
Судя по тому, что ты к PSP обращаешься через CS, я делаю вывод, что пишется COM программу, у которой есть только одна секция, которая и код, и стек и данные. И максимальный размер у этой секции 64к. Максимальный размер командной строки - 128 байт. Бери худшую ситуацию, когда каждый символ разделен пробелом и зарезервируй столько памяти, чтобы не залезть на стек или не покоцать начало кода. Если мы возьмем 128 строк и под каждую отведем по 128 байт, то получится 16384. Т.е. ~16кб, этого вполне будет достаточно. Правда тут есть минус, если данные размещать перед кодом таким типом:
То исполнимый com файл разжиреет до 16кб. Поэтому обычно место под данные ререзвируют после кода:
(129 чтобы еще 0h в конец каждой строки добавить.) Тогда компилятор будет знать адрес для strings и ему этого будет достаточно. Опять же надо следить за тем, чтобы стек не попортить. Слишком много в стек не пихать, чтобы не попортить код и данные, слишком данных много не пихать, чтобы не попортить данные в стеке и адреса возвратов из функций. Далее остается завести счетчик, который будет увеличиваться на 1 каждый раз, когда мы находим пробел. Изначально проинициализировать в -1 (0FFh), чтобы при первом увеличении он стал 0. Ноль это будет индекс первой строки, таким образом будем определять адреса строк: strings+(0*129) адрес буффера для первой строки, strings+(1*129) - адрес второй строки. После записи каждой строки в конец надо будет добавить 0h, чтобы потом узнавать, когда строка завершилась. Для этого берем количество символов в слове, которое будет записывать и прибавляем к текущему адресу. Скажем у нас слово из 10 букв и это уже второе найденное слово, тогда string+(1*129)+10. И надо не забыть завести переменную, которая будет содержать общее количество строк в буффере. Возможно я где-то что-то напутал с математикой, особенно с нулевыми смещениями, но найдеюсь общая логика будет понятна. Может показаться, что это не оптимальное расходывание памяти, т.к. между словами будут большие пустоты по ~100 байт, но программа будет работать быстрее, т.к. мы с легкостью будем вычислять адрес следующей строки, вместо того, чтобы сканировать с начала буффера побайтово в поисках нулей. С другой стороны если задача не требует скорости и количество строк действительно не большое, то строки можно просто тупо размещать подряд по адресу strings и разделять их нулями. А чтобы получить каждую следующую строку сканировать на наличие нулей с начала буффера. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Asm: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |