Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 04.05.2012, 18:50
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Который после
Цитата:
аты попробуй этот
Ну так в CPU и есть дизассемблированный код. Там и посмотри строку. Около адреса, который перед записью в S (@LStrAsg) кладётся в edx. На её конце - ноль. Никакого магического преобразования нет, результатом вызываемой функции _LStrToPChar является Pointer(s). Сделана эта функция только для возможной будущей переработки самого механизма строк, которой на деле скорее всего не будет.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 04.05.2012 в 19:03.
Ответить с цитированием
  #17  
Старый 04.05.2012, 19:05
robt robt вне форума
Активный
 
Регистрация: 17.02.2011
Сообщения: 298
Репутация: -1806
По умолчанию

а в моем примере и нет никакого преобразования вообще (0 в конце не вижу) !
_LStrToPChar из систем вообще не факт что идентичен LStrToPChar из прилинкованых obj файлов
и у меня она выглядит так
Код:
function _LStrToPChar(const s: AnsiString): PChar;
{$IFDEF PUREPASCAL}
const
  EmptyString = '';
begin
  if Pointer(s) = nil then
    Result := EmptyString
  else
    Result := Pointer(s);
end;
{$ELSE}
asm
        { ->    EAX pointer to str              }
        { <-    EAX pointer to PChar    }

        TEST    EAX,EAX
        JE      @@handle0
        RET
{$IFDEF PIC}
@@handle0:
        JMP     PICEmptyString
{$ELSE}
@@zeroByte:
        DB      0
@@handle0:
        MOV     EAX,offset @@zeroByte
{$ENDIF}             
end;
{$ENDIF}
тоесть выполняется асм код с неким DB 0
да и вообще у меня 7 делфя а у тебя ХЕ
Ответить с цитированием
  #18  
Старый 04.05.2012, 19:11
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Неверная интерпретация кода.
Код:
asm
        { ->    EAX pointer to str              }
        { <-    EAX pointer to PChar    }

        TEST    EAX,EAX
        JE      @@handle0
        RET
test eax, eax выставит флаг нуля если eax = 0 (поскольку test - логический AND без сохранения результатов, если результатом был 0 - ставится флаг нуля). То есть это идентично проверке if Pointer(S) = nil.
je - Если флаг нуля установлен, то идем на обработчик ошибки, а если нет - идем на ret, т.е. выходим. В итоге eax никто не меняет, если он не равен нулю (нормальная строка).
DB 0 - не команда, а видимо выравнивание. Если присмотреться, на него процессор никогда не попадёт. Ну и еще он используется в одном из варинатов обработки ошибок, наверное, как PChar нулевой длины.

И еще доказательство:
Код:
var s: AnsiString;
    p: PAnsiChar;
Begin
s:='123'#0'456';
p:=PAnsiChar(s);
ShowMessage(inttostr(DWORD(s))+' '+inttostr(DWORD(p)));
end.
На выходе два одинаковых адреса.

[UPDATE]
Если интересует дальнейшее обсуждение - либо во флейм (предпочтительно), либо в личку.
Или можно попросить админов перенести все эти изыскания во флейм.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 04.05.2012 в 19:24.
Ответить с цитированием
  #19  
Старый 04.05.2012, 19:16
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Господа, вам не кажется, что вы несколько ушли от темы и обсуждать ее надо явно не тут?
Что касается вопроса, как положить в массив. Я вам дал код в результате выполнения которого вы и получите массив строк в свойстве SL.Strings или Memo1.Lines.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:31.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter