Permalink
Browse files

bugfixes by Evgeny Proshin

  • Loading branch information...
DennisYurichev committed Dec 10, 2018
1 parent ad15043 commit c38793550c9ba458bf3e0b14c7e43eef9496bee6
@@ -5,7 +5,7 @@
Это область данных, отдельная для каждого треда. Каждый тред может хранить там то, что ему нужно.
Один из известных примеров, это стандартная глобальная переменная в Си \IT{errno}.
Несколько тредов одновременно могут вызывать функции возвращающие код ошибки в \IT{errno}, поэтому глобальная переменная здесь не будет работать корректно,
для мультитредовых программ \IT{errno} нужно хранить в в \ac{TLS}. \\
для мультитредовых программ \IT{errno} нужно хранить в \ac{TLS}. \\
\\
\myindex{\Cpp!C++11}
В C++11 ввели модификатор \IT{thread\_local}, показывающий, что каждый тред будет иметь свою версию этой переменной, и её можно инициализировать, и она расположена в \ac{TLS}
@@ -4,7 +4,7 @@

\subsection{Text strings}

As we saw in (\myref{sec:digging_strings}), text strings may be really helpful.
As we know from (\myref{sec:digging_strings}), text strings may be really helpful.

Programmers who are aware of this try to hide them, making it impossible to find the string in \IDA{} or any hex editor.

@@ -4,6 +4,7 @@

\subsection{Chaînes de texte}

% TBT
Comme nous l'avons vu dans (\myref{sec:digging_strings}), les chaînes de texte peuvent
être vraiment utiles.

@@ -4,7 +4,7 @@

\subsection{Текстовые строки}

Как мы увидели в (\myref{sec:digging_strings}) текстовые строки могут быть крайне
Как мы знаем из (\myref{sec:digging_strings}) текстовые строки могут быть крайне
полезны.
Знающие об этом программисты могут попытаться их спрятать так, чтобы их не было видно в \IDA{} или любом
шестнадцатеричном редакторе.
@@ -11,7 +11,7 @@ \subsection{Странная оптимизация циклов}
};
\end{lstlisting}

Как минимум MVC 6.0 из конца 90-х вплоть до MSVC 2013 может выдавать вот такой странный код (этот листинг создан MSVC 2013
Как минимум MSVC 6.0 из конца 90-х вплоть до MSVC 2013 может выдавать вот такой странный код (этот листинг создан MSVC 2013
x86):

\lstinputlisting[style=customasmx86]{advanced/500_loop_optimizations/1_1_RU.lst}
@@ -88,7 +88,7 @@

Теперь информация для игроманов: нужно бросить кость $\approx 42$ раза, чтобы получить один раз пару из шести, но никто вам не скажет, когда именно это случится.
\myindex{Розенкранц и Гильденстерн мертвы}
Я не помню, сколько раз подбрасывалась моента в фильме ``Розенкранц и Гильденстерн мертвы'', но её нужно подбросить $\approx 2048$ раз, и в какой-то момент, вы увидите 10 решек подряд, а в другой момент,
Я не помню, сколько раз подбрасывалась монета в фильме ``Розенкранц и Гильденстерн мертвы'', но её нужно подбросить $\approx 2048$ раз, и в какой-то момент, вы увидите 10 решек подряд, а в другой момент,
10 орлов поряд.
Опять же, вам никто не скажет, когда именно это случится.

@@ -294,6 +294,6 @@
Так что эта утилита берет значения частотв вроде 850, 900, 950, 1000, итд, но не 855 или 911.

Вот и всё! Если вы делаете что-то такое, имейте ввиду, что это может испортить вашу плату, как и в случае разгона
чиспов вроде \ac{CPU}, \ac{GPU}, итд.
чипов вроде \ac{CPU}, \ac{GPU}, итд.
Если у вас есть плата Cointerra, делайте всё это на свой собственный риск!

@@ -87,7 +87,7 @@ \subsection{Example \#2: SCO OpenServer}
Hard to say why, probably by mistake
\footnote{What a strange feeling: to find bugs in such ancient software.}.

Let's see where the value from the global variable \TT{ctl\_mode} is used.
Let's see where the value from the global variable \TT{ctl\_model} is used.

One such place is:

@@ -77,7 +77,7 @@ \subsection{Пример \#2: SCO OpenServer}
Трудно сказать, зачем это, может быть по ошибке
\footnote{Это очень странное чувство: находить ошибки в столь древнем ПО.}.

Давайте посмотрим, где проверяется значение глобальной переменной \TT{ctl\_mode}.
Давайте посмотрим, где проверяется значение глобальной переменной \TT{ctl\_model}.

Одно из таких мест:

@@ -4,7 +4,7 @@

"Марьяж" --- старая и довольно популярная версия игры в "Преферанс" под DOS.

Играют три игрока, каждому раздается по 10 карт, остальные 2 остается в т.н. "прикупе".
Играют три игрока, каждому раздается по 10 карт, остальные 2 остаются в т.н. "прикупе".
Начинаются торги, во время которых "прикуп" скрыт.
Он открывается после того, как один из игроков сделает "заказ".

@@ -14,7 +14,7 @@
Let's start from the top. Here is a function that takes two file names and password.

\begin{lstlisting}[style=customasmx86]
.text:00541320 ; int __cdecl crypt_file(int Str, char *Filename, int password)
.text:00541320 ; int __cdecl crypt_file(char *Str, char *Filename, int password)
.text:00541320 crypt_file proc near
.text:00541320
.text:00541320 Str = dword ptr 4
@@ -29,7 +29,7 @@
.text:00541320 mov eax, [esp+Str]
.text:00541324 push ebp
.text:00541325 push offset Mode ; "rb"
.text:0054132A push eax ; Filename
.text:0054132A push eax ; Str
.text:0054132B call _fopen ; open file
.text:00541330 mov ebp, eax
.text:00541332 add esp, 8
@@ -17,7 +17,7 @@


\begin{lstlisting}[style=customasmx86]
.text:00541320 ; int __cdecl crypt_file(int Str, char *Filename, int password)
.text:00541320 ; int __cdecl crypt_file(char *Str, char *Filename, int password)
.text:00541320 crypt_file proc near
.text:00541320
.text:00541320 Str = dword ptr 4
@@ -32,7 +32,7 @@
.text:00541320 mov eax, [esp+Str]
.text:00541324 push ebp
.text:00541325 push offset Mode ; "rb"
.text:0054132A push eax ; Filename
.text:0054132A push eax ; Str
.text:0054132B call _fopen ; open file
.text:00541330 mov ebp, eax
.text:00541332 add esp, 8
@@ -457,7 +457,7 @@
.text:00541320 ; =============== S U B R O U T I N E =======================================
.text:00541320
.text:00541320
.text:00541320 ; int __cdecl crypt_file(int Str, char *Filename, int password)
.text:00541320 ; int __cdecl crypt_file(char *Str, char *Filename, int password)
.text:00541320 crypt_file proc near ; CODE XREF: _main+42
.text:00541320
.text:00541320 Str = dword ptr 4
@@ -467,7 +467,7 @@
.text:00541320 mov eax, [esp+Str]
.text:00541324 push ebp
.text:00541325 push offset Mode ; "rb"
.text:0054132A push eax ; Filename
.text:0054132A push eax ; Str
.text:0054132B call _fopen ; open file
.text:00541330 mov ebp, eax
.text:00541332 add esp, 8
@@ -10,15 +10,15 @@
а это обычный \ac{PE}-файл.

Посмотрим, как отрисовываются стрелки?
Когда я откарываю этот файл (из Windows 7) в Resource Hacker, здесь есть разные виды циферблата, но нет стрелок:
Когда я открываю этот файл (из Windows 7) в Resource Hacker, здесь есть разные виды циферблата, но нет стрелок:

\begin{figure}[H]
\centering
\myincludegraphics{examples/timedate/reshack.png}
\caption{Resource Hacker}
\end{figure}

ОК, что мы заем? Как рисовать стрелку часов? Они все начинаются в середине круга и заканчиваются на его границе.
ОК, что мы знаем? Как рисовать стрелку часов? Они все начинаются в середине круга и заканчиваются на его границе.
Следовательно, нам нужно расчитать координаты точки на границе круга.
Из школьной математики мы можем вспомнить, что для рисования круга нужно использовать ф-ции синуса/косинуса, или
хотя бы квадратного корня.
@@ -191,12 +191,12 @@
Судя по моему опыту, тут могут быть:

\begin{itemize}
\item сигнатура фалйа;
\item верия файла;
\item сигнатура файла;
\item версия файла;
\item контрольная сумма;
\item какие-нибудь флаги;
\item может быть даже идентификатор языка;
\item дата/время текстового фалйа, так что программа \IT{fortune} будет регенирировать файл с индексами только тогда, когда
\item дата/время текстового файла, так что программа \IT{fortune} будет регенирировать файл с индексами только тогда, когда
пользователь изменит текстовый файл.
\end{itemize}

@@ -25,7 +25,7 @@ \subsection{ZX Spectrum ROM text strings}
Old 8-bit computers have very tight environment.

Characters of all messages are always in standard 7-bit \ac{ASCII} table,
so it's guaranteed 8th bit is never used for characters.
so it's guaranteed 7th bit is never used for characters.

To print such string, we must check \ac{MSB} of each byte, and if it's set, we must clear it, then print character,
and then stop.
@@ -58,7 +58,7 @@ \subsection{ZX Spectrum ROM text strings}
};
\end{lstlisting}

Now what is interesting, since 8th bit is the most significant bit (in byte), we can check it, set it and remove it using
Now what is interesting, since 7th bit is the most significant bit (in byte), we can check it, set it and remove it using
arithmetical operations instead of logical.

I can rewrite my C example:
@@ -93,13 +93,13 @@ \subsection{ZX Spectrum ROM text strings}
if treated as signed),
we must treat each character in text message as unsigned.

Now if 8th bit is set, the number is always larger or equal to 0x80.
If 8th bit is clear, the number is always smaller than 0x80.
Now if 7th bit is set, the number is always larger or equal to 0x80.
If 7th bit is clear, the number is always smaller than 0x80.

Even more than that: if 8th bit is set, it can be cleared by subtracting 0x80, nothing else.
Even more than that: if 7th bit is set, it can be cleared by subtracting 0x80, nothing else.
If it's not set beforehand, however, subtracting will destruct other bits.

Likewise, if 8th bit is clear, it's possible to set it by adding 0x80.
Likewise, if 7th bit is clear, it's possible to set it by adding 0x80.
But if it's set beforehand, addition operation will destruct some other bits.

In fact, this is valid for any bit.
@@ -26,7 +26,7 @@ \subsection{Chaînes de texte de la ROM du ZX Spectrum}
Les vieux ordinateurs 8-bit avaient une mémoire très restreinte.

Les caractères de tous les messages sont toujours dans la table \ac{ASCII} 7-bit
standard, donc il est garanti que le 8ème bit n'est jamais utilisé pour les caractères.
standard, donc il est garanti que le 7ème bit n'est jamais utilisé pour les caractères.

Pour afficher une telle chaîne, nous devons tester le \ac{MSB} de chaque octet, et
s'il est mis, nous devons l'effacer, puis afficher le caractère et arrêter.
@@ -59,7 +59,7 @@ \subsection{Chaînes de texte de la ROM du ZX Spectrum}
};
\end{lstlisting}

Maintenant ce qui est intéressant, puisque le 8ème bit est le bit le plus significatif
Maintenant ce qui est intéressant, puisque le 7ème bit est le bit le plus significatif
(dans un octet), c'est que nous pouvons le tester, le mettre et le supprimer en utilisant
des opérations arithmétiques au lieu de logiques:

@@ -95,15 +95,15 @@ \subsection{Chaînes de texte de la ROM du ZX Spectrum}
variable comme 0x80 (qui est négative ($-128$) si elle est traitée comme signée),
nous devons traiter chaque caractère dans le texte du message comme non signé.

Maintenant si le 8ème bit est mis, le nombre est toujours supérieur ou égal à
Maintenant si le 7ème bit est mis, le nombre est toujours supérieur ou égal à
0x80.
Si le 8ème est à zéro, le nombre est toujours plus petit que 0x80.
Si le 7ème est à zéro, le nombre est toujours plus petit que 0x80.

Et même plus que ça: si le 8ème bit est mis, il peut être effacé en soustrayant 0x80,
Et même plus que ça: si le 7ème bit est mis, il peut être effacé en soustrayant 0x80,
rien d'autre.
Si il n'est pas mis avant, toutefois, la soustraction va détruire d'autres bits.

De même, si le 8ème est à zéro, il est possible de le mettre en ajoutant 0x80.
De même, si le 7ème est à zéro, il est possible de le mettre en ajoutant 0x80.
Mais s'il est déjà mis, l'opération d'addition va détruire d'autres bits.

En fait, ceci est valide pour n'importe quel bit.
@@ -25,7 +25,7 @@ \subsection{Текстовые строки в \ac{ROM} ZX Spectrum}
В старых 8-битных компьютерах был сильный дефицит памяти.

Символы всех сообщений всегда находятся в стандартной 7-битной \ac{ASCII}-таблице, так что это гарантия,
что 8-й бит никогда не используется для символов.
что 7-й бит никогда не используется для символов.

Чтобы вывести такую строку, мы должны проверять \ac{MSB} каждого байта, и если он выставлен, мы должны его сбросить,
затем вывести символ, затем остановиться.
@@ -58,7 +58,7 @@ \subsection{Текстовые строки в \ac{ROM} ZX Spectrum}
};
\end{lstlisting}

И вот что интересно, так как 8-й бит это самый старший бит (в байте), мы можем проверить его, выставить и сбросить
И вот что интересно, так как 7-й бит это самый старший бит (в байте), мы можем проверить его, выставить и сбросить
используя арифметические операции вместо логических.

Я могу переписать свой пример на Си:
@@ -94,13 +94,13 @@ \subsection{Текстовые строки в \ac{ROM} ZX Spectrum}
если считается за знаковую),
мы должны считать каждый символ сообщения как беззнаковый.

Теперь, если 8-й бит выставлен, число всегда больше или равно 0x80.
Если 8-й бит сброшен, число всегда меньше 0x80.
Теперь, если 7-й бит выставлен, число всегда больше или равно 0x80.
Если 7-й бит сброшен, число всегда меньше 0x80.

И даже более того: если 8-й бит выставлен, его можно сбросить вычитанием 0x80, и ничего больше.
И даже более того: если 7-й бит выставлен, его можно сбросить вычитанием 0x80, и ничего больше.
Если он уже сброшен, впрочем, операция вычитания уничтожит другие биты.

Точно также, если 8-й бит сброшен, можно его выставить прибавлением 0x80.
Точно также, если 7-й бит сброшен, можно его выставить прибавлением 0x80.
Но если он уже выставлен, операция сложения уничтожит остальные биты.

На самом деле, это справедливо для любого бита.
@@ -269,7 +269,7 @@ \subsection{Регистр адреса}
Суперкомпьютер Cray-1 имел 64-битные GPR, но 24-битные регистры для адресов, так что он мог адресовать
$2^{24}$ (16 мегаслов или 128 мегабайт).
Память в 1970-ые была очень дорогой, так что и не ожидалось, что даже в среде суперкомпьютеров её будет больше.
Тогда зачем выделять целый 64-битный рергистр для адреса или указателя?
Тогда зачем выделять целый 64-битный регистр для адреса или указателя?

Процессоры 8086/8088 имели крайне странную схему адресации:
значения двух 16-битных регистров суммировались в очень странной манере, производя 20-битный адрес.
@@ -32,7 +32,7 @@

\begin{framed}
\begin{quotation}
Упражнение 3-4. В представлени чисел с помощью дополнения до двойки наша версия функции \IT{itoa}
Упражнение 3-4. В представлении чисел с помощью дополнения до двойки наша версия функции \IT{itoa}
не умеет обрабатывать самое большое по модулю отрицательное число, т.е., значение
\IT{n}, равное $-(2^{wordsize-1})$. Объясните, почему это так. Доработайте функцию так, чтобы она
выводила это число правильно независимо от системы, в которой она работает.
Oops, something went wrong.

0 comments on commit c387935

Please sign in to comment.