Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
4-6276
dit
2003-12-24 11:40
2004.03.03
процеду ра ловушки


1-6125
Dysan
2004-01-23 13:18
2004.03.03
никак не могу разобраться с методом


6-6172
Gorlum
2003-12-26 13:22
2004.03.03
E-mail


3-5973
phantom2040
2004-02-05 13:34
2004.03.03
По набивке таблицы


1-6084
Случайно забежавший
2004-02-16 17:54
2004.03.03
StringGrid и перенос по словам