Когда я впервые выучил язык ассемблера, набирал популярность набор кода. Программы были короткими. Большинство из них я мог понять, основываясь на моих ограниченных знаниях, но мне все еще нравилось видеть результат и удивляться, как они это сделали. Надеюсь, я чему-нибудь научусь.

Одна такая программа, которую я набрал, полностью удивила меня. Отображаемый вывод не должен был быть найден где-либо внутри кода. Каким-то образом программист смог получить текстовое сообщение, сгенерированное из чего-то похожего на случайные данные. Это заняло у меня некоторое время, но в конце концов я выяснил, что происходит.

Приведенный ниже пример кода работает по принципу, аналогичному коду на языке ассемблера, который я рассматривал много лет назад. Вы видите массив целых чисел, представляющих различные положительные и отрицательные значения.

#include <stdio.h>

int main ()
{
    int x, c;
    подписанный int delta [] = {
        72, 29, 7, 0, 3, -79, 70, 12, -3, -2,
        -77, 36, 29, 13, -78, 39, 40, 0, -4, -2,
        5, -77, -23, -10
    };

    х = с = 0;
    в то время как (х <24)
    {
        с + = дельта [х];
        putchar (с);
        х ++;
    }
    Возвращение (0);
}

Значения в delta[]массиве не являются кодами ASCII. Тем не менее, когда вы запускаете программу, вы видите следующий текстовый вывод:

Hello from Dan Gookin!

То , что происходит в то время как петли в том , что значения считываются из delta[]массива и вывода через putchar () функции в строке 16. Первое значение является кодом ASCII, 72, для письма H. Однако вместо следующего элемента, являющегося кодом ASCII, его значение добавляется к текущему значению ASCII. Или, в случае отрицательного числа, значение вычитается.

Эффект состоит в том, что 29 (второй элемент в delta[]массиве) добавляется к 72, давая 101 или ASCII-код для буквы e. Следующий элемент добавляет 7 к тому значению, которое становится буквой l. Именно так обрабатывается строка, один за другим.

Я не уверен, использовался ли этот метод в качестве примера на языке ассемблера много лет назад, и не является ли он какой-либо формой умного шифрования. Фактически, единственная загадка, с которой я столкнулся, заключалась в том, как определить, когда завершается строка. Вместо того, чтобы использовать какое-либо значение, такое как 1000, я просто посчитал байты в строке и использовал это значение для завершения вывода; (x<24)на линии 13.

Эта программа на самом деле вторая, которую я написал. В конце концов, вам нужен способ конвертировать строку текста в положительные и отрицательные значения. Для этого я написал программу, которая глотает строку, а затем выводит добавленные и вычтенные значения. На уроке следующей недели рассказывается, как работает программа.