Текущий архив: 2004.03.03;
Скачать: CL | DM;
Вниз
Как перекодировать текст из Windows кодировки в Dos? Найти похожие ветки
← →
zamkom © (2004-02-19 16:50) [40]Андрей Сенченко © (19.02.04 16:39) [33]
Да примерно месяц назад было обсуждение по данному вопросу.
Автором был я. :-)
Поэтому и привел код
zamkom © (19.02.04 14:48) [2]
← →
Игорь Шевченко © (2004-02-19 16:52) [41]default © (19.02.04 16:50)
Имеется в виду время доступа к нужной странице. Данные сегмента кода в подавляющем большинстве случаев в swap-файл не попадают.
← →
Verg © (2004-02-19 16:53) [42]
> [34] default © (19.02.04 16:41)
Константы компилер хочет размещать в таком месте, где бы их модернизация была невозможна. Его можно понять? :)
Единственным обладающим столь ценным атрибутом является сегмент кода (Read Only, ExecutAble).
помнишь как раньше было - ОЗУ, ПЗУ, RAM, ROM...
"А компилятор все равно старается размещать константы ближе к тому месту, где они используются." - это, ИМХО, просто метафора
← →
AKul © (2004-02-19 17:05) [43]
> Игорь Шевченко © (19.02.04 16:50) [38]
Неа:) Проще ему, как раз, все данные собрать в одном месте. Как изменяемые, так и не изменяемые.
Если он убирает дублирующиеся строковые константы, то да, ему даже приходится так делать.
А если не убирает? Зачем хранить лишнюю информацию, если ее сразу же можно разместить, ведь она используется единожды внутри процедуры?
Но это вопрос скорее к разработчикам компилятора - кто их знает, что они там наплодили... :)
← →
default © (2004-02-19 17:09) [44]Verg © (19.02.04 16:53) [42]
"Константы компилер хочет размещать в таком месте, где бы их модернизация была невозможна. "
возможна
const
S = "72345";
...
begin
PChar(@S[1])^ := "1";
Caption := S // Caption = "12345"
...
разве только явно невозможна
← →
Verg © (2004-02-19 17:17) [45]
> [44] default © (19.02.04 17:09)
О том что такое @S[1] было сказано достаточно выше.
Кроме того не надо относится к записям типа const A=B так буквально.
Это почти как директивы #define в С, т.е. почти как препроцессинг.
Немного не по теме, но все же ...
http://citforum.isurgut.ru/book/cook/selfmod.shtml
← →
Игорь Шевченко © (2004-02-19 17:18) [46]AKul © (19.02.04 17:05)
> это вопрос скорее к разработчикам компилятора - кто их знает,
> что они там наплодили...
Между прочим, наплодили очень много интересных решений для оптимизации по времени выполнения. В том числе и загрузку конвейеров процессора, и мимимизацию количества страничных отказов. Скажу даже больше - у Microsoft в ряде системных библиотек используется такое понятие, как OMAP (расшифровку, увы, не помню), но суть в том, что редкоиспользуемые части кода в процедурах разбросаны по разным страницам памяти, для того, чтобы освободить место для часто используемого кода. Получившийся результат выглядит как макаронный код. Но работает в итоге быстрее, чем если бы вся процедура была собрана в одном месте.
С уважением,
← →
default © (2004-02-19 17:20) [47]Verg © (19.02.04 17:17) [45]
есть статья эта, всю не читал ещё, но почему константы модифиц-ся и до этого знал(хоть могут и лежать в сегменте кода физически защищённым от записи...)
← →
Verg © (2004-02-19 17:30) [48]
> [47] default © (19.02.04 17:20)
const S = "12345";
procedure TForm1.Button1Click(Sender: TObject);
begin
pchar(@S[1])^ := "1";
Caption := S;
end;
Может все же попробуешь исполнить этот код для ясности? :))
← →
AKul © (2004-02-19 17:30) [49]
> Игорь Шевченко © (19.02.04 17:18) [46]
> Между прочим, наплодили очень много интересных решений для
> оптимизации по времени выполнения.
Здесь я полностью с Вами согласен!!!
С уважением, Андрей.
← →
default © (2004-02-19 17:52) [50]Verg © (19.02.04 17:30) [48]
var
Form1: TForm1;
X: Byte;
implementation
{$R *.dfm}
procedure Proc1;
begin
X := 5
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
asm
MOV BYTE PTR [OFFSET Proc1 + 6], 7
end;
Proc1;
Caption := IntToStr(X)
end;
Кстати в той статье пишется "Замечание: среди начинающих программистов ходит совершенно
нелепая байка о том, что, дескать, если обратится к коду программы командой,
предваренной префиксом DS, Windows якобы беспрепятственно позволит его изменить.
На самом деле это ерунда; обратиться-то она позволит, а вот изменить – нет,
каким бы способом ни происходило обращение, т.к., защита работает на уровне физических страниц,
а не логических адресов."
ерунда не ерунда, а вышеприведённый код работает
Verg © (19.02.04 17:30) [48]
у меня этот код работает
если у тебя нет значит дело в ОС-ах
← →
default © (2004-02-19 17:55) [51]Verg © (19.02.04 17:30) [48]
бегло посмотрел, думал мой код скопировал...
← →
Verg © (2004-02-19 18:05) [52]
> [50] default © (19.02.04 17:52)
Ну что ж, значит так тому и быть - у тебя своя правда, у меня - своя. :))
Видимо только мне мерещится устойчивый AV.... Write of address <такой-то>.
Значит с ОС тебе повезло больше.
Не забывай только, к своим продуктам с таким твоим кодом прикладывать дистрибутив твоей "нужной и всепонимающей" ОС.
← →
default © (2004-02-19 18:17) [53]Verg © (19.02.04 18:05) [52]
а почему ошибка-то должна быть?
работаем как говорили с копией же
кстати значение константы дажt в отладчике не посмотреть...
← →
Verg © (2004-02-19 18:32) [54]
> [53] default © (19.02.04 18:17)
Да потому, что не надо путать слабительное со снотворным.
const
S = "12345";
и
pchar(@S[1])^:=
это полная аналогия pchar(@"12345"[1])^ :=
Понимаешь? Ни S, ни "12345" не всопринимаются компилером как Huge String, да и с какой бы стати? Вот поэтому и не работаем с копией.
Пока это просто набор символов в сегменте кода.
Все, мне надоело....
← →
default © (2004-02-19 18:57) [55]Verg © (19.02.04 18:32) [54]
PChar(S)^ := "7";
по вашему такой код работает с "реальной" S и потому должен вызывать ошибку так как константы распол-ся и тд и тп
но в моей "плохой и бескультурной ОС" такое действие не приводит к ошибку кроме того данные не изменяются(константы) хотя мы по-вашему обращаемся через "реальный" адрес...
в CPU это всё выглядит весьма загадочно
← →
Defunct © (2004-02-20 05:36) [56]default © (19.02.04 18:57) [55]
Нельзя записать в страницу кода.
Убедитесь:
procedure TForm1.Button1Click(Sender: TObject);
begin
Asm
Call @@L2 // В стеке адрес возврата: L2
@@L2:
Pop EBx // В EBx адрес на команду Pop EBx
Mov EAx, 100h // Эта команда занимает 5 байт
Mov CS:[EBx], EAx // Пытаемся затереть команду Pop EBx
// Здесь Access Violation at CS:@@L2
End;
Caption := "Zzz";
end;
← →
default © (2004-02-20 15:33) [57]Defunct © (20.02.04 05:36) [56]
ёлки, я ж говорю об изменении кода через DS, ясно что через CS
ошибка будет
а так у вас работает?
здесь затирается RET, если б не затиралось ничего, то ошибки бы не было
вот только думаю что не каждая ОС такие вольности позволяет
procedure TForm1.Button1Click(Sender: TObject);
label
LabelForRET;
begin
asm
MOV BYTE PTR [OFFSET LabelForRET], 0
end;
Caption := "YO!";
LabelForRET:
end;
← →
Игорь Шевченко © (2004-02-20 16:47) [58]default © (20.02.04 15:33)
Запусти отладчик - оно рулез.
В окне CPU посмотри, чему равно значение CS и чему равно значение DS. Будешь удивлен.
← →
Anatoly Podgoretsky © (2004-02-20 16:55) [59]Игорь Шевченко © (20.02.04 16:47) [58]
Вообще то это мало о чем говорит, хто значения селектора, а на что оно указывает совсем другое дело. Специалисты сказали, что это для удобства сделали два разных селектора, в том числе и для защиты.
← →
Amoeba © (2004-02-20 17:52) [60]Модератор! Ау! Пора перебрасывать ветку в "Потрепаться".
← →
default © (2004-02-20 18:33) [61]Игорь Шевченко © (20.02.04 16:47) [58]
смотрел?и что?
вот ещё кусок статьи Касперски на эту тему
"Создание самомодифицирующегося кода требует знания некоторых тонкостей архитектуры Windows, не освещенных в документации, но одинаково реализованных на всех Windows-платформах, и активно используемых компилятором Visual C++ от Microsoft.
Для адресации 4 ГБ виртуальной памяти, выделенной в распоряжение процесса, Windows использует два селектора; один загружается в сегментный регистр CS, а другой – в регистры DS, ES и SS. Оба селектора ссылаются на один и тот же базовый адрес памяти (равный нулю), и имеют лимит в 4 ГБ. (Замечание: кроме перечисленных, Windows использует еще и регистр FS, в который загружает селектор сегмента, содержащего информационный блок потока).
Фактически существует всего один сегмент, вмещающий в себя и код, и данные, и стек процесса. Благодаря этому передача управления коду, расположенному в стеке, осуществляется близким (near) вызовом или переходом, и для доступа к содержимому стека использование префикса "SS" совершенно необязательно. Несмотря на то, что значение регистра CS не равно значению регистров DS, ES и SS, команды MOV dest,CS:[src]; MOV dest,DS:[src] и MOV dest,SS:[src] в действительности обращаются к одной и той же ячейке памяти.
Отличия между регионами кода, стека и данных заключаются в атрибутах принадлежащих им страниц: страницы кода допускают чтение и исполнение, страницы данных – чтение и запись, а стека – чтение, запись и исполнение одновременно.
Помимо этого, каждая страница имеет специальный флаг, определяющий уровень привилегий, необходимых для доступа к этой странице. Некоторые страницы – например, те, что принадлежат ОС, требуют наличия прав супервизора, которыми обладает только код нулевого кольца. Прикладные программы, исполняющиеся в кольце 3, таких прав не имеют, и при попытке обращения к защищенной странице вызывают исключение.
Манипулировать атрибутами страниц, равно как и ассоциировать страницы с линейными адресами, может только операционная система (или код, исполняющийся в нулевом кольце). Правда, в защите Win’95/98 есть дыры, позволяющие коду повысить свои привилегии до супервизора; но в Windows NT/2000 это уже не проходит."
← →
Игорь Шевченко © (2004-02-20 18:36) [62]
> Отличия между регионами кода, стека и данных заключаются
> в атрибутах принадлежащих им страниц: страницы кода допускают
> чтение и исполнение, страницы данных – чтение и запись,
> а стека – чтение, запись и исполнение одновременно
Ну да, ну да...
Страницы: 1 2 вся ветка
Текущий архив: 2004.03.03;
Скачать: CL | DM;
Память: 0.6 MB
Время: 0.018 c