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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2015, 19:35   #21
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Fixator Посмотреть сообщение
Честно говоря, высокоуровневые языки, мне, мягко говоря, не нравятся вообще, а Паскаль - тем более. Очень люблю Ассемблер. Просто хочу изучить язык С, для повышения самообразования.
гм.. вы там выше писали, что можете порешать эту сишную задачку на ассме.

мне вот не понятно: а как?

ну, если вы не знали о том,
что сишная строка должна завершиться нуль-терминатором,
то как бы вы тогда смогли определить её длину на ассме?
_Bers вне форума Ответить с цитированием
Старый 14.12.2015, 22:10   #22
Fixator
Пользователь
 
Регистрация: 05.12.2013
Сообщений: 20
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
гм.. вы там выше писали, что можете порешать эту сишную задачку на ассме.

мне вот не понятно: а как?

ну, если вы не знали о том,
что сишная строка должна завершиться нуль-терминатором
Есть такая API функция - GetCommandLine. Она возвращает адрес на цельную строку, которую надо обрабатывать вручную.

Строка выглядит так:
"FileName.exe arg1 arg2 arg3"

На Ассемблере, вызывается так:
Код:
call  [GetCommandLine]
  или
invoke  GetCommandLineA
Чтобы подсчитать размер 0 аргумента, надо вести подсчёт до пробела. А в С, всё подругому. Там готовая обработка. Все параметры, разделены на части, оканчивающиеся нулями.
Цитата:
Сообщение от _Bers Посмотреть сообщение
то как бы вы тогда смогли определить её длину на ассме?
Очень просто.

Вот, простой пример, на 32 битном Ассемблере (подсчитывает размер 0 аргумента(имени файла)):
Код:
	invoke  GetCommandLineA

        xor     ecx,ecx
     @@:
        cmp     [eax],byte 0
        je      .print
        cmp     [eax],byte ' '
        je      .print
        cmp     [eax],byte '"'
        je      .print
        inc     eax
        inc     ecx
        jmp     @b
 .print:
Не судите строго. Я только учусь языку С.
Fixator вне форума Ответить с цитированием
Старый 14.12.2015, 22:33   #23
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Очень просто.
Ой ой... А через repne scasb не проще?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.12.2015, 23:32   #24
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

scasb ищет один терминатор - 0 а в примере их 3...
А уж если посмотреть на настоящий strlen...
waleri вне форума Ответить с цитированием
Старый 14.12.2015, 23:34   #25
Fixator
Пользователь
 
Регистрация: 05.12.2013
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ой ой... А через repne scasb не проще?
Нет. Код менше не будет. repne scasb полезно, только если, надо найти 1 байт, за 1 проход. А там, надо проверять сразу 3 байта, за 1 проход, иначе код, будет работать неправильно.

Эх... Опоздал малость.
Не судите строго. Я только учусь языку С.
Fixator вне форума Ответить с цитированием
Старый 15.12.2015, 00:56   #26
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Есть такая API функция - GetCommandLine. Она возвращает адрес на цельную строку, которую надо обрабатывать вручную.
А еще есть ее подружка функция апи, которая все это преобразовывает в аргц/аргв.

Цитата:
Чтобы подсчитать размер 0 аргумента, надо вести подсчёт до пробела. А в С, всё подругому.
Вы таки не поверите, но ничего не мешает на С сделать абсолютно также...

Цитата:
call [GetCommandLine]
или
invoke GetCommandLineA
Совсем не или. Если компилятор не древний мамонт, то он вызовет юникодовскую, а не заглушку-анси.
p51x вне форума Ответить с цитированием
Старый 15.12.2015, 02:57   #27
Fixator
Пользователь
 
Регистрация: 05.12.2013
Сообщений: 20
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А еще есть ее подружка функция апи, которая все это преобразовывает в аргц/аргв.
Вы таки не поверите, но ничего не мешает на С сделать абсолютно также...
Совсем не или. Если компилятор не древний мамонт, то он вызовет юникодовскую, а не заглушку-анси.
Ой... А я и не знал.



Всё, тема закрыта.
Не судите строго. Я только учусь языку С.
Fixator вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как посмотреть работу программы в режиме командной строки moreman Помощь студентам 21 24.02.2015 17:08
Получить строку из "Командной Строки" Janger Общие вопросы Delphi 5 05.06.2014 08:03
Как получить размер dds-файла? RibGeDx Общие вопросы Delphi 8 16.03.2013 20:56
Как получить размер базы данных Greek9000 Общие вопросы .NET 1 02.08.2011 13:49
Как получить размер строки типа LPCWSTR? Gtx541 Общие вопросы C/C++ 1 30.05.2010 14:18