Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбор строки 
:(
    Опции темы
DoZENT
Дата 2.6.2006, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Извиняюсь сразу за глупый вопрос, только учусь...

Есть строка в формате "arg1,arg2,arg3" (без кавычек)

Как каждую arg записать в свою переменную? Заранее спасибо! 


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
ds29
Дата 2.6.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 1
Всего: 2



сканируешь строку на запятую (в конце строки, по идее 0), запоминаешь позицию (сначала она = 0), и каждый раз от позиции до запятой загоняй посимвольно в свою переменную.  
PM MAIL   Вверх
ds29
Дата 2.6.2006, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 1
Всего: 2



вот примерный код:

.data

string 'arg1,arg2,arg3',0

v1 10 dup(?)
v2 10 dup(?)
v3 10 dup(?)

.code

lea esi, string 
xor eax,eax

mov dl,1 ; номер переменной

start_s:
mov bl,byte ptr [esi]
cmp bl,0
je exit_s


;------
cmp dl,1
jne n_1
inc dl
lea edi,v1
n_1:

cmp dl,2
jne n_2
inc dl
lea edi,v2
n_2: ;остаётся 3-я
lea edi,v3

zicl: ; цикл по перессылки из главной строки в подстроки
cmp bl,','
je next_s

mov byte ptr [edi],bl ; записыва ю в одну из подстрок
inc edi
inc esi
mov bl, byte ptr [esi] ; загружаю следующий из главной строки
jmp zicl ;***


;------



next_s:
inc esi
jmp start_s
exit_s:



p.s. возможны ошибки, код не проверен и придуман за пару минут, так же не капли не оптимизирован, просто пример)

Добавлено @ 01:08 
(Win32) 
PM MAIL   Вверх
sgi1981
Дата 2.6.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 10



Код

.data

string db 'arg1,arg2,arg3',0

;аргументы
v1 db 10 dup(?)
v2 db 10 dup(?)
v3 db 10 dup(?)
;и так далее можно до 100 аргументов
;массив указателей на аргументы
p dd 100 dup 0; число 100 выбрано по желанию, можно больше

.code
mov ebx,offset p;в ebx адрес массива указателей на аргументы
mov [ebx],offset v1;заносим адреса аргументов в массив указателей на аргументы
mov [ebx+4],offset v2;смещение в массиве указателей на аргументы каждый раз 
;увеличиваем на 4 - размер указательной ячейки памяти
mov [ebx+8], offset v3;
;и так далее
mov esi,offset string; адрес исходной строки в Sourse Index register
cld;сбросим флаг направления - выполнение цепочечных команд в режим увеличения адреса
@3:mov edi,[ebx];адрес аргумента в Destination Index register
@2:lodsb;грузим очередной символ исходной строки в al (регистр esi увеличивается автоматически на 1)
cmp al,',';запятая ?
jz @1;переход на очередной аргумент
cmp al,0;конец строки ?
jz @en;переход на конец
stosb;иначе сохраняем al в текущем аргументе (регистр edi увеличивается автоматически на 1)
jmp @2;
@1:add ebx,4;адресный регистр на следующий указатель другого аргумента
jmp @3;
@en:
;дальше - что хочешь делаешь со своими аргументами
   

Это сообщение отредактировал(а) sgi1981 - 2.6.2006, 20:30


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
DoZENT
Дата 2.6.2006, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Блин, не работает...
Попробую написать поподробнее

Есть строка novaPDF Pro v3,winspool,NVP3:

Если юзать ваш алгоритм, то v1,v2,v3 остаются пустыми. 

mov esi,offset str1 заменил на lea esi, buf, где buf это LOCAL buf[1024] : BYTE
 
Теперь с v2,v3 все нормально, а v1 почуме-то равен novaPDF Prwinspool В чем может проблема?

P.S. Еще один вопрос: как заюзать EnumPrinters в ассемблере? 


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
sgi1981
Дата 2.6.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 10



Цитата(DoZENT @ 2.6.2006,  14:53)
Блин, не работает...
Попробую написать поподробнее

Есть строка novaPDF Pro v3,winspool,NVP3:

Если юзать ваш алгоритм, то v1,v2,v3 остаются пустыми. 

mov esi,offset str1 заменил на lea esi, buf, где buf это LOCAL buf[1024] : BYTE
 
Теперь с v2,v3 все нормально, а v1 почуме-то равен novaPDF Prwinspool В чем может проблема?

P.S. Еще один вопрос: как заюзать EnumPrinters в ассемблере?

На каком ассемблере пишешь ?

Код

mov esi,offset str1 заменил на lea esi, buf, где buf это LOCAL buf[1024] : BYTE


Что это за странный прием и чем он лучше предыдущего?

 


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
DoZENT
Дата 2.6.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

На каком ассемблере пишешь ?

MASM
Цитата

Что это за странный прием и чем он лучше предыдущего?

С предыдущим все v* вообще были пустыми 


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
DoZENT
Дата 2.6.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Дело тут в длинне строки, только вот как исправить?.. 


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
sgi1981
Дата 2.6.2006, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 10



Просто я не думал, что вы не сможете об этом догадаться

Код

;аргументы
v1 db 200 dup(?)
v2 db 200 dup(?)
v3 db 200 dup(?)


Вот так это исправляется.

А 
Код

mov esi,offset str1

заменить на 
Код

mov esi,offset string

не пробовали ?
А то я просто забыл, что идентификатор другой у строки. 


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
rsm
Дата 2.6.2006, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 1
Всего: 62



ИМХО, для такой задачи было бы неплохо написать специально обученную функцию:
Код

; lpDest - указатель куда копировать
; lpSrc - указатель на строку с разделителями ',' откуда копировать
;
; Возвращает: 
;        указатель на следующую строку после очередного разделителя
;        0 - если строка закончилась
;
strcopy proc lpDest, lpSrc :DWORD

    mov esi,lpSrc
    mov edi,lpDest
    xor edx,edx
_next:
    lodsb
    stosb
    or al,al
    jz _end
    cmp al,','
    jne _next
    mov byte ptr ds:[edi-1],0
    xchg edx,esi
_end:
    xchg eax,edx
    ret

strcopy endp

Тогда для твоего случая код будет такой:
Код

.data    

    szStrings db "item1,item2,long item3,EOF strings",0
    
    var1 db 20 dup(0)
    var2 db 20 dup(0)
    var3 db 20 dup(0)

.code

    invoke strcopy, ADDR var1, ADDR szStrings
    invoke strcopy, ADDR var2, eax
    invoke strcopy, ADDR var3, eax
   

Это сообщение отредактировал(а) rsm - 2.6.2006, 21:14

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  strcopy.zip 1,28 Kb
PM MAIL   Вверх
sgi1981
Дата 2.6.2006, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 10



Ну, так тоже можно. Только заранее неизвестно - сколько аргументов всего присутствует.
Сделано 3 вызова функции, а может нужно 4 сделать ?

И флаг направления direction flag командой cld нужно сбросить в ноль, а вдруг он содержит 1 и тогда адрес будет не увеличиваться, а уменьшаться. 


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
ds29
Дата 2.6.2006, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 1
Всего: 2



можно и рекурсию 
PM MAIL   Вверх
rsm
Дата 2.6.2006, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 999
Регистрация: 16.3.2005

Репутация: 1
Всего: 62



Цитата(sgi1981 @  2.6.2006,  23:17 Найти цитируемый пост)
Только заранее неизвестно - сколько аргументов всего присутствует

В аттаче пример, работающий с любым количеством аргументов.

Цитата(sgi1981 @  2.6.2006,  23:17 Найти цитируемый пост)
флаг направления direction flag командой cld нужно сбросить в ноль

В идеале - да, непременно нужно сбросить. В своих программах можно и не сбрасывать - с АСМом ты контролируешь каждый байт и знаешь, что, где и когда увеличивается или уменьшается smile 
PM MAIL   Вверх
DoZENT
Дата 3.6.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Просто я не думал, что вы не сможете об этом догадаться

Я же говорю, только учусь, это моя первая программа на асме. Спасибо, rsm, все работает!

Еще вопрос один: как вывести MessageBox с несколькими строками? Добавление \n к концу каждой строки не помогает... В Delphi было еще #13#10, здесь нет естественно.. 

 


--------------------
Какая боль, какая боль, Internet Explorer 5.0...
PM MAIL   Вверх
ds29
Дата 3.6.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 1
Всего: 2



var db 'text',0

а для перевода строки

var db 'line1',0dh,0ah 
      db 'line2',0

или

var db 'line1',0dh,0ah, \
      'line2',0

или , можно и всё в строку

var db 'line1',0dh,0ah , 'line2',0

************************

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

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

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


 




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


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

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