Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из командной строки и запись в массив 
:(
    Опции темы
under_sun
Дата 5.12.2007, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 3.10.2007
Где: Ебург

Репутация: нет
Всего: 17



Привет всем!
Возникли трудности с сохранением данных, прочитанных из коммандной строки.
Читаю данные посимвольно следующим образом:
Код

_start:
  xor ax, ax
  mov al, [cs:80h]
  cmp al, 0
  je _error
  mov cx, ax
  mov si, 81h
_read:
  mov dl, [si]
  inc si
  cmp dl, ' '
  je _read
  ;нужно собрать строку из прочитанных символов
  ;с последующим сохранением этих строк в массив
  loop _read
  ...

Из прочитанных до очередного пробела символов нужно собрать строку, а затем поместить ее в массив.
Подскажите идею, как это можно реализовать?

--------------------
TMTOWTDI
PM MAIL ICQ   Вверх
SABROG
Дата 27.12.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: нет
Всего: 91



Я так и не понял что ты хочешь сделать. Разбить строку с параметрами на несколько строк, а разделителем считать пробел ?

Судя по тому, что ты к PSP обращаешься через CS, я делаю вывод, что пишется COM программу, у которой есть только одна секция, которая и код, и стек и данные. И максимальный размер у этой секции 64к. Максимальный размер командной строки - 128 байт. Бери худшую ситуацию, когда каждый символ разделен пробелом и зарезервируй столько памяти, чтобы не залезть на стек или не покоцать начало кода. Если мы возьмем 128 строк и под каждую отведем по 128 байт, то получится 16384. Т.е. ~16кб, этого вполне будет достаточно. Правда тут есть минус, если данные размещать перед кодом таким типом:

Код

strings db 128*128 dup (0)
start:


То исполнимый com файл разжиреет до 16кб. Поэтому обычно место под данные ререзвируют после кода:

Код

...
retn
strings db 128*129 dup (?)


(129 чтобы еще 0h в конец каждой строки добавить.)

Тогда компилятор будет знать адрес для strings и ему этого будет достаточно. Опять же надо следить за тем, чтобы стек не попортить. Слишком много в стек не пихать, чтобы не попортить код и данные, слишком данных много не пихать, чтобы не попортить данные в стеке и адреса возвратов из функций.

Далее остается завести счетчик, который будет увеличиваться на 1 каждый раз, когда мы находим пробел. Изначально проинициализировать в -1 (0FFh), чтобы при первом увеличении он стал 0. Ноль это будет индекс первой строки, таким образом будем определять адреса строк: strings+(0*129) адрес буффера для первой строки, strings+(1*129) - адрес второй строки. После записи каждой строки в конец надо будет добавить 0h, чтобы потом узнавать, когда строка завершилась. Для этого берем количество символов в слове, которое будет записывать и прибавляем к текущему адресу. Скажем у нас слово из 10 букв и это уже второе найденное слово, тогда string+(1*129)+10. И надо не забыть завести переменную, которая будет содержать общее количество строк в буффере.

Возможно я где-то что-то напутал с математикой, особенно с нулевыми смещениями, но найдеюсь общая логика будет понятна. Может показаться, что это не оптимальное расходывание памяти, т.к. между словами будут большие пустоты по ~100 байт, но программа будет работать быстрее, т.к. мы с легкостью будем вычислять адрес следующей строки, вместо того, чтобы сканировать с начала буффера побайтово в поисках нулей. С другой стороны если задача не требует скорости и количество строк действительно не большое, то строки можно просто тупо размещать подряд по адресу strings и разделять их нулями. А чтобы получить каждую следующую строку сканировать на наличие нулей с начала буффера.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.