Нечего "обновлять". Ваш код работает. ebx
содержит input
и все. (Подсказка: ваш код на C также преобразуется в сборку. Просмотр того, что ваш компилятор генерирует через дизассемблер, может дать вам некоторое представление.)
Тем не менее, я вижу некоторые проблемы:
input = (int *)malloc(sizeof(n));
Это распределение недостаточно велико, и ваша программа аварийно завершит работу. Вы хотите выделить sizeof(int) * n
. Также следует проверить распределение на наличие ошибок.
mov al, [ebx + edi - 1]
mov dl, [ebx + edi]
cmp al, dl
Вид многословия. Вы должны уметь сравнивать регистр с памятью. (напр. cmp al, byte [ebx + edi]
)
Не говоря уже о том, что внедрение пузырьковой сортировки в сборке является полной тратой времени. Перефразировка: Изучение сборки великолепно, но было бы плохой идеей использовать это во всем, что имеет значение. Одна из самых важных вещей в знании ассемблера - это знание, когда вам не нужно его использовать. Вы, вероятно, очень часто обнаружите, что то, что генерирует ваш компилятор, достаточно хорошо. Давайте также не будем забывать, что хороший алгоритм в Си превзойдет плохой алгоритм в ассемблере, такой как пузырьковая сортировка.
@ Джорджио также поднимает хороший вопрос в комментариях. Ваша сборка сравнивает и сортирует байты. Вы хотите делать такие вещи:
mov eax, [ebx + edi - 4] ; assumes edi is a byte offset, see next comment
mov edx, [ebx + edi]
И вместо dec edi
и т. Д. Вы хотите сделать:
sub edi, 4
Для использования 32-битных величин необходимо также выполнить перестановку.
Это, конечно, предполагается, что int
- это 32 бита, что может быть не так. Если вы используете (нестандартную) встроенную сборку, вероятно, это справедливо - это означает, что вы уже нацелены на определенный компилятор. (Исходя из синтаксиса, я бы сказал, VC ++) Nitpickers могут сказать, что вы должны использовать int32_t
вместо int
.
Примечание. Я не уверен, что это единственная проблема, я не слишком внимательно изучил ваш код.