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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.08.2022, 16:02   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 622
По умолчанию Длина строки через asm

Такой код выдаёт ошибку
Я знаю, что первая и последняя строки лишние, но как угодно пытался понять в чем проблема
Код:
Function ggg1(s:string):LongWord;
asm
  mov eax, s

  call lstrlen

  mov result, eax
end;
При этом такой код рабочий
Код:
Function ggg(s:string):LongWord;
begin
  length(s);
  asm
    mov result, eax
  end;
end;
И выдаёт он примерно такой же код

Вопрос: как тогда из asm вызвать функцию длины строки?
Изображения
Тип файла: png изображение_2022-08-31_160140479.png (3.4 Кб, 22 просмотров)
Kronos913 вне форума Ответить с цитированием
Старый 31.08.2022, 16:11   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Т.е. вы думаете @ для украшения в асме используется?
p51x вне форума Ответить с цитированием
Старый 31.08.2022, 16:13   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 622
По умолчанию

Добавил @ - компилятор ошибку выдаёт
Kronos913 вне форума Ответить с цитированием
Старый 31.08.2022, 16:15   #4
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 622
По умолчанию

Код:
Function ggg1(s:string):LongWord;
asm
  mov eax, s

  call @LStrLen

  mov result, eax
end;
Компилятор выдаёт ошибку на строке call @LStrLen
Kronos913 вне форума Ответить с цитированием
Старый 31.08.2022, 16:17   #5
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

system.@LStrLen
p51x вне форума Ответить с цитированием
Старый 31.08.2022, 17:02   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Раз уж пытаетесь делать на asm, тогда проще посчитать длину вручную. Хотя внутренний формат String может хранить длину без необходимости проверки символа терминатора. Тогда вызов будет эффективнее.
macomics вне форума Ответить с цитированием
Старый 31.08.2022, 17:08   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Хотя внутренний формат String может хранить длину без необходимости проверки символа терминатора.
В Delphi и хранит.
p51x вне форума Ответить с цитированием
Старый 31.08.2022, 17:21   #8
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
В Delphi и хранит.
А вот Lazarus считает для AnsiString. И сохраняет для WideString.
Наверное исходят из логики, кто AnsiString обычно не превышают 255, а вот WideString содержат длинные тексты. Или из-за использования UTF8.
macomics вне форума Ответить с цитированием
Старый 31.08.2022, 17:40   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
А вот Lazarus считает для AnsiString.
Lazarus использует FPC и, судя по вики, не считает.
p51x вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длина строки AlexDn Общие вопросы Delphi 3 13.08.2018 02:06
Длина строки TRichEdit -Jack- Общие вопросы Delphi 15 08.01.2017 02:22
Укзатели. Длина строки. Chelovekpredel Помощь студентам 5 07.07.2012 19:25
Assembler длина строки Vitalii Помощь студентам 6 22.11.2011 23:14
Длина строки С++ ArniLand Общие вопросы C/C++ 7 25.03.2010 10:59