Показать сообщение отдельно
  #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.
Ответить с цитированием