2014-11-06 6 views
0

Я отправляю это, потому что нашел это задание довольно сложным, и StackOverflow помог мне бесчисленное количество раз. Надеюсь, это поможет кому-то еще.Как отсортировать массив в NASM?

Описание проблемы:

чтения в N целых чисел, оканчивающихся значением, равным нулю (ноль не используется). Сортируйте эти цифры в порядке возрастания и распечатайте их. Сообщение об ошибке должно быть создано, если либо данные не были введены до значения нуля, либо если слишком много данных введено и будет переполняться массивом. Эта программа должна иметь возможность обрабатывать до 100 целых значений.

подход:

Я решил использовать пузырьковую сортировку, который перебирает значения в массиве N раза для массива размера N. Он смотрит на каждое значение и сравнивает его к следующему значению; если первое значение выше следующего, оно переключает их. это можно легко изменить, чтобы перечислить их в порядке убывания. В любом случае, что было труднее всего, это обрабатывать вложенную петлю в nasm и правильно циклически со всеми значениями ecx и еще много чего. Код, который я публикую, хорошо прокомментирован. Кроме того, любая конструктивная критика приветствуется, как и вопросы.

Размышления по этому проекту:

Я думаю, что может быть лучше, чтобы пройти через элементы в массиве, а не с помощью EBX. У Masm есть указатель, который можно использовать для повторения значений. Этот код работает и отвечает требованиям, но, возможно, это будет лучше. Кроме того, выбор пузырьков может быть не лучшим способом. Я знаю, что есть другие алгоритмы сортировки, но пузырь казался самым простым в применении в nasm.

ответ

1

Было бы лучше включить ваше решение в вопрос. Теперь казалось, что на этот вопрос уже был дан ответ, и он больше не нуждался в внимании. Lucky you, вот мои мысли об этом:

Вы должны инициализировать массив с помощью 101 двойного слова, потому что вы будете хранить столько входных данных, прежде чем переходить на метку tooManyInts.
При уменьшении ECX вы прокомментируете это из-за индексации на основе 0. Это неправда. Это потому, что для серии из N элементов требуется сравнение N-1.
Мне сложно отслеживать, что находится в стеке. Могу я предложить вам несколько прокомментировать этот вопрос

push ecx ;(1) 
dec ecx 
push ecx ;(2) 
... 
loop L3 
pop ecx  ;(2) 
SetWrite: 
xor ebx,ebx 
pop ecx  ;(1) 
+0

он не сохраняет 101-ю ценность; после считывания 101-го int он переходит к toomanyints. он сравнивает ex с 100, прежде чем записывает значение в массив. Кроме того, что касается индексации на основе 0, я предполагаю, что я имел в виду, что [intArray] указывает на первое значение, а [intArray + ecx * 4] будет генерировать некоторый эквивалент исключения нулевого указателя в том случае, если ex является длиной массива, потому что если массив имеет 100 значений, первое значение - [intArray], тогда как последнее значение - [intArray + 4 * 99]. Но для типа пузыря я считаю, что вы правы в отношении сравнений n-1. – amaleemur

+0

И в любой момент в стеке должно быть не более двух значений: нажата первая ecx (число значений, которые будут позже записаны), а затем будет нажата ecx-1 (количество раз, которое должен выполнить внешний цикл). – amaleemur

+0

, но спасибо за отзыв! Я действительно чувствовал, что на этот вопрос был дан полный ответ, поскольку он работает, как указывает проблема. Язык сборки сложный, и я надеялся помочь будущим студентам, и я решил изменить комментарий, который вы указали. – amaleemur

Смежные вопросы