| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Чтение из командной строки и запись в массив |
| Автор: under_sun 5.12.2007, 17:06 | ||
| Привет всем! Возникли трудности с сохранением данных, прочитанных из коммандной строки. Читаю данные посимвольно следующим образом:
Из прочитанных до очередного пробела символов нужно собрать строку, а затем поместить ее в массив. Подскажите идею, как это можно реализовать? |
| Автор: SABROG 27.12.2007, 14:56 | ||||
| Я так и не понял что ты хочешь сделать. Разбить строку с параметрами на несколько строк, а разделителем считать пробел ? Судя по тому, что ты к 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 и разделять их нулями. А чтобы получить каждую следующую строку сканировать на наличие нулей с начала буффера. |