Я отправляю это, потому что нашел это задание довольно сложным, и StackOverflow помог мне бесчисленное количество раз. Надеюсь, это поможет кому-то еще.Как отсортировать массив в NASM?
Описание проблемы:
чтения в N целых чисел, оканчивающихся значением, равным нулю (ноль не используется). Сортируйте эти цифры в порядке возрастания и распечатайте их. Сообщение об ошибке должно быть создано, если либо данные не были введены до значения нуля, либо если слишком много данных введено и будет переполняться массивом. Эта программа должна иметь возможность обрабатывать до 100 целых значений.
подход:
Я решил использовать пузырьковую сортировку, который перебирает значения в массиве N раза для массива размера N. Он смотрит на каждое значение и сравнивает его к следующему значению; если первое значение выше следующего, оно переключает их. это можно легко изменить, чтобы перечислить их в порядке убывания. В любом случае, что было труднее всего, это обрабатывать вложенную петлю в nasm и правильно циклически со всеми значениями ecx и еще много чего. Код, который я публикую, хорошо прокомментирован. Кроме того, любая конструктивная критика приветствуется, как и вопросы.
Размышления по этому проекту:
Я думаю, что может быть лучше, чтобы пройти через элементы в массиве, а не с помощью EBX. У Masm есть указатель, который можно использовать для повторения значений. Этот код работает и отвечает требованиям, но, возможно, это будет лучше. Кроме того, выбор пузырьков может быть не лучшим способом. Я знаю, что есть другие алгоритмы сортировки, но пузырь казался самым простым в применении в nasm.
он не сохраняет 101-ю ценность; после считывания 101-го int он переходит к toomanyints. он сравнивает ex с 100, прежде чем записывает значение в массив. Кроме того, что касается индексации на основе 0, я предполагаю, что я имел в виду, что [intArray] указывает на первое значение, а [intArray + ecx * 4] будет генерировать некоторый эквивалент исключения нулевого указателя в том случае, если ex является длиной массива, потому что если массив имеет 100 значений, первое значение - [intArray], тогда как последнее значение - [intArray + 4 * 99]. Но для типа пузыря я считаю, что вы правы в отношении сравнений n-1. – amaleemur
И в любой момент в стеке должно быть не более двух значений: нажата первая ecx (число значений, которые будут позже записаны), а затем будет нажата ecx-1 (количество раз, которое должен выполнить внешний цикл). – amaleemur
, но спасибо за отзыв! Я действительно чувствовал, что на этот вопрос был дан полный ответ, поскольку он работает, как указывает проблема. Язык сборки сложный, и я надеялся помочь будущим студентам, и я решил изменить комментарий, который вы указали. – amaleemur