Текущий архив: 2003.10.06;
Скачать: CL | DM;
Вниз
---|Ветка была без названия|--- Найти похожие ветки
← →
Malder (2003-07-28 17:53) [40]Не по моей вине и к моему удивлению произошли странности с сайтом http://www.baseprogram.narod.ru
Сейчас работа восстановлена.
to Юрий Зотов
пока я поддерживаю сайт, но ищется человек, который этим будет вместо меня заниматься
← →
Malder (2003-07-28 17:55) [41]забыл, что я типа в игноре здесь. В общем, если у модераторов совсем крыша от солнца слетела - то удаляйте
← →
Юрий Зотов (2003-07-28 18:58) [42]> Malder © (28.07.03 17:53)
Очень здорово и спасибо, а то видите какие тут проблемы начались... Просьба - если не сложно, пока продолжайте поддержку, ладно? Или откликнется кто-то другой, или вопрос решится здесь.
О прочем - по мылу.
← →
AlexRush (2003-07-28 19:50) [43]2Юрий Зотов © (28.07.03 18:58) - Нехочу показаться назойливым, но все же мне интересно Ваше мнение по поводу http://delphimaster.net/view/14-1059396295/
← →
Marser (2003-07-28 20:02) [44]
> Malder © (28.07.03 17:55)
> забыл, что я типа в игноре здесь. В общем, если у модераторов
> совсем крыша от солнца слетела - то удаляйте
Будьте спокойны - мои переговоры с модераторами завершились мирно ещё 12 июля, вы чисты перед ними. А произошедшее все-таки можно простить.
← →
AlexRush (2003-07-29 13:15) [45]UP
← →
VD602 (2003-07-29 14:54) [46]Ух ты! Оказывается, когда пишется "jle +$XX" - это смещение относительно текущей команды и константа $XX равна не адресу перехода, а (адрес_перехода - длина_команды_jle), чтобы сработал алгоритм
1. Выполнить команду, адрес которой хранится в СК.
2. Увеличить значение СК на длину только что выполненной команды.
3. Повторить, начиная с п.1.
Я ПРАВ??
P.S. Кстати, почему у Вас компилятор пишет адреса со смещением относительно точки входа jle TForm1.FormCreate + $22, а у меня относительно текущей команды? Я что-то не нашел такой установки CPU-window.
← →
VD602 (2003-07-29 14:57) [47]Упс, не сработал после второй строки.
← →
VD602 (2003-07-29 15:13) [48]В смысле </B> не сработал :))
Вот же руки сегодня :)
← →
Daniel (2003-07-29 19:45) [49]Есть! Взломал!
Правда пошел на маленькую хитрость: перед строкой
if Sender = Self then Halt
Вставил
I := $78563412
И после этого в HEX-редакторе искал последовательность 12 34 45 78
То, что 12345678 надо писать в обратном порядке я понял после нескольких экспериментов. Я так понял, то это из-за того, что в памяти значения хранятся начиная с младшего байта.
Еще пробовал искать последовательность 3B 45 FC 75 05
(это cmp eax, [ebp - $04]; jnz +$05), но таких слишком много.
Еще была идея искать вызов call @Halt0;
Не получилось потому, что машинный код этой команды меняется в разных местах программы (наверное в аргументе call указывается смещение относительно текущей команды), поэтому "не зная точно кода" этого не найти.
P.S. Почему компилятор пишет (как у VD602) jmp +$05, а если я напишу
asm
jmp +$05;
end;
Выводится ошибка несоответствия команды и операнда?
А так все нормально и хорошо, не понял только задание из этапа 3:
Написать на Паскале функцию, вычисляющую машинное эпсилон для чисел типа Extended. При вычислениях учеть реально используемый аппаратный тип FPU.
Это как?
← →
Daniel (2003-07-29 19:51) [50]Извиняюсь, фразу "в HEX-редакторе искал последовательность 12 34 45 78"
Читать как
"в HEX-редакторе искал последовательность 12 34 56 78"
← →
Юрий Зотов (2003-07-29 22:27) [51]> и константа $XX равна не адресу перехода, а (адрес_перехода -
> длина_команды_jle), чтобы сработал алгоритм...
> наверное в аргументе call указывается смещение относительно
> текущей команды
Тэкс... хорошо... я потираю руки и хитро улыбаюсь в седую бороду. Как говорил кот Матроскин: "Урра!!! Зарработало!!!"
Работает метода-то! Народ сам (!) начинает доходить вот уже до таких вещей! Своей головой!
И ето радовает. Чегтовски.
Народ! Вы на верном пути, вот ей-же. Только не расслабляться - сидеть, пыхтеть, потеть, и думать, думать, думать...
Вот мы и созрели до понимания перемещаемого кода. Значит, пора говорить об адресации... сначала на примере МК, а там к указателям и хипу подберемся. И знаменитый PChar заодно щелкнем, просто по дороге. Потом адресное пространство... процессы... классы и VMT... DLL... эх-ма!
Значит, так - адресацию начнем в следующем этапе (уже готовлю), а по поводу вопроса: "При вычислениях учеть реально используемый аппаратный тип FPU" вот что - перечитайте статью Антона Григорьева еще раз, очень вдумчиво (она того заслуживает, честное слово). Там сказано про управляющее слово сопроцессора. Вот это и есть то самое.
И еще:
> Я так понял, то это из-за того, что в памяти значения хранятся
> начиная с младшего байта.
Так и есть. Все процессоры семейства x86 имеют такую аппаратную особенность (но для других процессоров это может быть и иначе). В окне CPU отладчика Delphi можно щелкнуть правой кнопкой мыши и выбрать способ показа 4-байтовых слов - побайтно, пословно или целиком. В побайтном увидим точно то, что реально лежит в памяти, в пословном - меняются местами 2-байтовые слова (но не меняются байты внутри этих слов), а целиком - видим целые числа в привычной нам "человеческой" записи (только в HEX, конечно).
← →
Anatoly Podgoretsky (2003-07-29 22:58) [52]VD602 (29.07.03 14:54)
Ух ты! Оказывается, когда пишется "jle +$XX" - это смещение относительно текущей команды и константа $XX равна не адресу перехода, а (адрес_перехода - длина_команды_jle), чтобы сработал алгоритм
Обяснение это следуюещее, пусть по адресу 100 находится эта команда, а перейти нам надо на адрес 107, по в процессоре проиходит следующее
1. процессор извлекает команду jle, IP становится равным 101
2. после декодирования команды, процессор видит, что надо извлечь адрес (смещение) перехода, IP становится равным 102
3. процессор прибавляет смещение к текущему значению IP - IP=102+5-107
4. процессор начинает извлекать команду по новому текущему адресу, который равен в данный момент 107
Что и требовалось сделать, естественно компилятор/транслятор автоматически отсчитывает адреса и производит расчет необходимого смещения для осуществления команды перехода.
Надо учесть еще следующее, так как на шаге декодирования команды адрес перехода еще не известе, то снаяала генерируется команда jle +0, а при втором проходе транслятора она уже заменяется на jle +5. Делается это путем ведения списков меток и ассоцирования их с реальным адресом, естественно, что на втором проходе это смещение уже известно. Это конечно когда команда указывается как jle label, если же команда указывается как jle смещение то необходимости в расчете нет, это уже сделал программист, учитывая выше описанное.
← →
Юрий Зотов (2003-07-29 23:11) [53]> VD602 (29.07.03 14:54)
В ту же тему. Помните, когда мы на MK смотрели команду БП, то было сказано, что в режиме Авт надо набирать адрес, на единицу меньший того, куда мы хотим перейти. И было добавлено "вопрос для особо умных, дотошных и внимательных - почему так?".
Сопоставьте это с тем, что Вы обнаружили в окне CPU.
← →
Daniel (2003-07-29 23:56) [54]По поводу задания про FPU - если необходимо вычислить эпсилон при назных значениях битов Precision Control, то все в порядке, учтено :)) Кстати, в FPU-window очень удобно показаны 8-й и 9-й управляющего слова - общим десятичным числом!
Кстати, Юрий, расскажите все-же про отображение адресации со смещением в CPU-window (у вас относительно начала процедуры, у меня - относительно текущей команды). В настройках покопался достаточно основательно. Не нашел. У меня Delphi 6.
← →
Yanis (2003-07-30 03:07) [55]МОЖЕТ КТО НИБУДЬ, ЕСЛИ ПРОЧИТАЕТЕ ЭТО СООБЩЕНИЕ, ТО У МЕН БОЛЬШАЯЯ ПРОСЬБА: ПРИШЛИТЕ ПОЖАЛУЙСТА НА МЫЛО АРХИВ ВСЕХ ЭТАПОВ(1-5). ПОЖАЛУЙСТА. СПАСИБО.
← →
Юрий Зотов (2003-07-30 09:22) [56]> Yanis © (30.07.03 03:07)
Ссылка работает: http://www.baseprogram.narod.ru
Просто сохраните с нее страницы для автономного просмотра.
← →
Maks Realov (2003-07-30 10:48) [57]Здравствуйте.
Недавно стал проходить Этапы.
Возник вопрос, который до конца не могу понять:
почему, если в 16-ти ричной системе 1 - это 0001 в двоичной, а 3 - это 0011, то число 13 в 16-ти ричной системе равно числу в шеснадцатирично-двоичной системе, т.е. 10011 (если перевести это число опять в 16-ричную систему, мы получим 13).
В свою очередь, в 10-ой системе 1 <=> 1 в двоичной, 3 - 11 в двоичной. А число 13 представленное в десятично-двоичной как представить? Сколько разрядов должно быть? Ведь не запишеш же 10011 - это не верно.
Я так понял, что прямой перевод из 16-ричной в 2-ую возможен потому что основание 16-ой системы кратно двум в степени (в данном случае 4).
Вопрос: из каких систем возможно прямое преобразование в 2-ую. (из тех, у которых основание кратно 2^n ?)
← →
AlexRush (2003-07-30 11:01) [58]2Юрий Зотов © Взломать защиту, упирающуюся в jz/jnz - это весьма полезно для начинающих программистов (да и для некоторых неначинающих тоже ;). По крайней мере люди начинают понимать, как НЕ надо защищать свою программу.
Почему бы не пойти дальше, и не предложить некоторые "усожненные" способы защиты своих прог от, скажем так, "advansed user" и тех, кто научился искать jz/jnz.
Что скажете ?
← →
AlexRush (2003-07-30 11:27) [59]Наконец-то сподобился прсмотреть предыдущие этапы...
2Юрий Зотов ©:
Мне не совсем понятна концепция Ваших уроков. Знания и навыки работы с разными системы исчисления - безусловно необходимы для любого программиста. Особенно полезно "тыкать носом" в это начинающих, ибо часто они (по себе помню :) сразу начинают Web-сервера писать, не зная , что такое "Access Violation at address 0x400FFEBC". (Здесь же и базовые знания поцессора и архитектуры ПК пригодятся).
Но (может быть я недоглядел ?) где такие основополагающие вещи, как структуры данных, конструкции ветвления, циклов и пр. ?
Я сам лично наблюдал картину, когда в курсе MFC народу пытались объяснить, что такое очередь собщений... Но только не учли тот факт, что что такое очередь, этому самому народу никто не рассказывал...
← →
Юрий Зотов (2003-07-30 11:32) [60]> AlexRush © (30.07.03 11:01)
Всему свое время. Все же цель курса не в том, чтобы рассказать о каких-то конкретных технологиях (взлома, защиты, еще чего-то), а в том, чтобы растолковать людям базу (эх, где они сейчас, старые книги!) и научить их понимать, что они пишут и как оно работает. После чего эти люди уже перестанут быть начинающими и начнут нормально писать, думая уже не о кодинге, а об алгоритме. И читать им нужно будет уже не Архангельского, а Кнута. Это - качественно другой уровень, он и есть цель.
Все примеры и задания подчинены этому же глобальному направлению. В том числе, и задание со "взломом" собственной программы. Целью ведь ставился не сам взлом, важно было, чтобы человек пощупал машинный код "ручками", сопоставил его с кодом на Паскале и понял, что такое переходы и с чем их едят. И преследовалась еще одна цель - подвести к адресации. Судя по вопросам - получилось. По крайней мере, у тех, кто этого хотел.
Если же для раскрытия какой-то темы потребуются примеры продвинутых защит или взломов - они будут использованы, без всяких колебаний. Но не как самоцель.
> Maks Realov (30.07.03 10:48)
Не совсем понятна суть проблемы, постарайтесь сформулировать ее более четко. Возможно, это будет проще, если не писать ведущих нулей - иначе возникает путаница самого числа (как понятия арифметики) и его внутреннего представления в машине.
А по вопросу - да, прямой перевод в двоичную систему возможен из систем с основанием, кратным степени двойки: четверичной, восьмиричной, шестнадцатиричной и т.д. Для этого просто каждая цифра записывается в ее двоичном виде. А для обратного перевода двоичная запись разбивается на пары (триады, тетрады...) и каждая пара (триада, татерада...) записывается в виде одной цифры.
← →
AlexRush (2003-07-30 11:52) [61]2Юрий Зотов © (30.07.03 11:32)
> где они сейчас, старые книги! - в библиотеке (у нас на четвертом этаже :) Вот только большинство молодых пользователей инэта не знает, что книги еще и на бумаге печатают :(
Теперь я представляю себе задачу Ваших веток, как направляющих на путь истинный.
P.S. И все же, Юрий, я ожидал Ваших коментариев по поводу http://delphimaster.net/view/14-1059396295/
P.S./2 Мне кажется, Вашим ученикам могли бы быть полезны эти небольшие исследования. (IMHO)
← →
Maks Realov (2003-07-30 12:21) [62]Юрий,
при обратном переводе в двоичную - кол-во разрядов в паре равно степени двойки - правильно?
А проблема, была такая: почему из 16-ой системы можно "напрямую" переводить число в 2-ую, а из 10-ой напрямую в 2-ую нельза?
Ответ: потому что основание 10-ой системы не кратно 2^n.
- это понятно, но математическое обоснование данного правило не очевидно :(
Спасибо за Этапы.
← →
Aldor (2003-07-30 12:23) [63]2 Maks Realov:
Действительно, перевести из системы с основанием 2^n в двоичную и обратно очень просто:
Например, если n = 4, т.е. шестнадцатиричная система, то просто разбивай двоичное число на тетрады (четыре(n) разряда) и подставляй 16-ричные эквиваленты и наоборот:
1110100100101 = 0001 1101 0010 0101 = $1D25
1 D 2 ( триады) 2 Maks Realov:
Действительно, перевести из системы с основанием 2^n в двоичную и обратно очень просто:
Например, если n = 4, т.е. шестнадцатиричная система, то просто разбивай двоичное число на тетрады (четыре(n) разряда) и подставляй 16-ричные эквиваленты и наоборот:
1110100100101 = 0001 1101 0010 0101 = $1D25
1 D 2 5
Всё! Обратоно то же самое. Далее если система восьмиричная, то разбиваем на тройки (триады), так как 8 = 2^3.
Это очень простое свойство и легко доказывается даже для общего случая систем счисления с основанием k^n.
← →
Aldor (2003-07-30 13:37) [64]В предыдущую:
Жалко сместилось, цифры 1 D 2 5 считать стоящими под соответствующими тетрадами
← →
Bel (2003-07-30 14:44) [65]> Maks Realov (30.07.03 12:21)
> А проблема, была такая: почему из 16-ой системы можно "напрямую" переводить число в 2-ую, а из 10-ой напрямую в 2-ую нельза?
> Ответ: потому что основание 10-ой системы не кратно 2^n.
> - это понятно, но математическое обоснование данного правило не очевидно :(
Вот тебе краткое обоснование:
Напишем числа в разных системах счисления, прибавляя каждый раз по единице:
10-чн. 2-чн. 16-чн.
00 0000 00
01 0001 01
02 0010 02
03 0011 03
04 0100 04
05 0101 05
06 0110 06
07 0111 07
08 1000 08
09 1001 09
10 1010 0A
11 1011 0B
12 1100 0C
13 1101 0D
14 1110 0E
15 1111 0F
16 10000 10
17 10001 ( соответственно, 5-го и 2-го)> Maks Realov (30.07.03 12:21)
> А проблема, была такая: почему из 16-ой системы можно "напрямую" переводить число в 2-ую, а из 10-ой напрямую в 2-ую нельза?
> Ответ: потому что основание 10-ой системы не кратно 2^n.
> - это понятно, но математическое обоснование данного правило не очевидно :(
Вот тебе краткое обоснование:
Напишем числа в разных системах счисления, прибавляя каждый раз по единице:
10-чн. 2-чн. 16-чн.
00 0000 00
01 0001 01
02 0010 02
03 0011 03
04 0100 04
05 0101 05
06 0110 06
07 0111 07
08 1000 08
09 1001 09
10 1010 0A
11 1011 0B
12 1100 0C
13 1101 0D
14 1110 0E
15 1111 0F
16 10000 10
17 10001 11
Обрати внимание, при переходе к числу 16 у двоичного и 16-чного числа происходит увеличение старшего (соответственно, 5-го и 2-го) разряда на единицу, в то время, как у 10-чного это происходит раньше. И так будет постоянно - каждый перенос единицы из младшего разряда в старший в 16-чн. числе будет совпадать с переносом единицы из 4-го разряда в 5-й (8->9, 12->13 и т.д.) в 2-чном числе. Можешь попробовать продолжить ряд.
Количество всех состояний одного разряда 16-чного числа равно количеству состояний 4-разрядного 2-чного числа (=16), ни больше, ни меньше. Именно поэтому легко переводить числа из 2-чн. системы в 16-чн. и обратно.
Для 10-чн. системы такого соответствия нет.
Существует ещё такое понятие, как двоично-десятичная система - когда каждая 10-чн. цифра записывается 4-разрядным 2-чн. числом. Не знаю, применяется ли она сейчас где-либо. В институте мы, помню, даже делали схему для двоично-десятичной коррекции.
← →
хм (2003-07-30 14:44) [66]>Жалко сместилось, цифры 1 D 2 5 считать стоящими под >соответствующими тетрадами
Используй тег code
← →
keymaster (2003-07-30 16:09) [67]А может всё это (все разделы для начинающих) выложить в "статьи"?
Т.К. в форумах они рано или поздно попадут в архивы и найти их станет проблемно.
← →
VD602 (2003-07-30 17:16) [68]http://delphimaster.net/view/14-1059396295/
← →
VD602 (2003-07-31 00:42) [69]Удалено модератором
← →
VD602 (2003-07-31 12:22) [70]Удалено модератором
← →
Daniel (2003-07-31 16:30) [71]А я еще одну классную фичу CPU-window обнаружил: оказывается, в строке запроса "Goto address" можно написать просто EBP и сразу попадаешь в область, где хранятся все твои переменные. Вот.
Юрий, когда планируете следующий этап?
Дайте что-ль пока задание какое-нить.
← →
Daniel (2003-07-31 17:01) [72]Есть одна проблемка с размещением в памяти - если порядок байт инвертирован, то порядок бит в байте инвертирован или нет?
Вот я пишу
A := $4321;
Ожидаемо, что в памяти запишется (при по-байтовом выводе)
12 34
(начиная с младшего байта)
На деле имеем:21 43
Я вот что думаю: все дело в отображении содержимого памяти ЦПУ-окном: содержимое выбранной еденицы отображения (байт, слово, длинное слово) отображается в привычном виде, начиная со старшего байта, а порядок этих единиц - реальный, т.е.
массив в пямяти располагается с МЛАДШЕГО элемента.
И если бы в ЦПУ-окне отображались бы биты, то мы увидели бы реальное "положение дел", а так мы видим биты в инвертированном, но привычном порядке и возникает вышеописанная ситуация. На самом деле в пямяти:
1 2 3 4
0001 0010 0011 0100
А вот после помещения этого слова в регистр, все становится в привычином виде: $4321
Прав ли я?
← →
AlexRush (2003-07-31 17:03) [73]>порядок бит в байте инвертирован или нет? - нет.
>А вот после помещения этого слова в регистр, все становится в >привычином виде: $4321
> Прав ли я? - да
← →
Юрий Зотов (2003-07-31 17:11) [74]> Daniel (31.07.03 17:01)
1. Биты не инвертируются. Инвертируются 2-х байтовые слова, а внутри них - байты. И в памяти, и в регистрах.
2. $4321 - это 2-х байтовое число, а не 4-х. Естественно, оно хранится, как $2143.
3. Как хранятся массивы - это уже вопрос к компилятору. Как он скомпилирует адресацию элементов - так и будет. Об этом - на следующем этапе.
← →
Anatoly Podgoretsky (2003-07-31 17:14) [75]Daniel (31.07.03 17:01)
Порядок байт не инвертирован, младшии байты по младшим адресам, старшие по старшим адресам. У машин фирмы IBM порядок байт инветирован, кроме того у них математика не с дополнением до двух, а с дополнением до единицы. ТО что ты привел это символьное представление числа в виде шестнадцатиричного, типа слово. При символьной записи мы пишем старшие разряды слева, для памяти же нет понятия слева/справа. Аналогично с битами, мы можем писать как нам угодно (обычно старшие справа, но так не всегда), но в памяти они опять же по тому же принципу - младшии биты в младших разрядах, а старшии в старших.
Вот так при указанной тобой системе наблюдения не получится, будет побайтовая запись, но тогда ее не надо рассмтривать как слово, а как два байта, по младшему адресу находится байт 21, а по станшему байт 43, если же рассматривать как слово то по адресу будет расположено слово со значение 4321Б ещи интереснее если ты будешь рассматривать двойное слово, такое как $87654321, то по байтно, будет четыре байта 21 43 65 87, по словно, будет два слова 4321 и 8765 и как двойное слово - одно равное 87654321
По регистрам точно также, если как слово, то 4321, если как пара регистров, то 21 и 43, хоть слева направо, хоть сверху вниз, в общем в любом направлении.
← →
AlexRush (2003-07-31 18:09) [76]2 Юрий Зотов © (31.07.03 17:11) Вы меня упорно игнорируете... а я настойчивый.... 8\
← →
Юрий Зотов (2003-07-31 18:40) [77]> AlexRush © (31.07.03 18:09)
Да при чем тут игнормрование? Ну Вы поймите, там же надо серьезно и долго сидеть и разбираться, что к чему. Вам было интересно - Вы это сделали. Не скажу, что тема мне неинтересна, но, видимо, гораздо меньше, чем Вам (а что тут особенного? ничего), вот поэтому она все время и отходит на второй план.
← →
AlexRush (2003-07-31 18:50) [78]2Юрий Зотов © (31.07.03 18:40)
> вот поэтому она все время и отходит на второй план. - отходит она на второй план по другим причинам. Мало кто из здешних завсегдатаев имеет представление о той теме вобще.
О своей назойливости:
смею напомнить: Юрий Зотов © (28.07.03 15:19) Давайте поднимем, действительно интересно. Может, и я че умное вякну, а уж других-то наверняка послушаю с удовольствием.
- ввиду чего я расчитывал на Ваш ответ на конкретный вопрос по поводу CASE...OF.
← →
Best Gun (2003-07-31 22:48) [79]AlexRush, ну отстань от человека, а? Тебе уже все обьяснили. Внимание привлек - и хорошо. Не надо флудить в этой ветке - она не для того создана
← →
Юрий Зотов (2003-08-01 00:23) [80]Ну почему обязательно "отстань"? Тема действительно очень интересная, но о ней нельзя говорить просто так, "с кондачка", это не та тема, не для "ля-ля-тополя".
Александр, Вы же прекрасно понимаете, что в вопросах генерации кода вообще мало кто по-настоящему глубоко разбирается. Тем более, прикладники-самоучки, коих здесь большинство. Это же не специализированный форум по проблемам разработки компиляторов. Даже и во всем мире, думаю, наберется не так уж много народа, писавшего серьезные промышленные компиляторы - тем более, блок генерации, да еще с оптимизацией.
Что касается меня, то я писал синтаксические и лексические анализаторы, интерпретаторы, и даже свой язык имеется. Но о генерации кода и его оптимизации только читал, самому писать не приходилось. Да и читал-то уже довольно давно.
Поэтому давайте так. Стоит у меня знаменитая "книга дракона", ну и еще кое-что есть. Посмотрю еще раз о генерации, надо освежить. Может, тогда и пойму, почему Паскалевский CASE требует константы и что там за дела с таблицей переходов. Тогда и отвечу. А сейчас - ну что я могу сказать? Только одно - а шут его знает, почему Borland написала именно так а не иначе. Кто писал - у того и спрашивать надо.
Страницы: 1 2 3 4 вся ветка
Текущий архив: 2003.10.06;
Скачать: CL | DM;
Память: 0.69 MB
Время: 0.018 c