EDIT:
Я обнаружил разные проблемы в вашем коде. Я исправил их ниже, и ESI фактически изменился (не отсортирован, потому что я думаю, что алгоритм сортировки неправильный, но у него еще не было времени изменить его)
1- мов рег, 0
Лучше xor регистр вместо перемещения 0 к нему. Инструкция XOR короче.
2- В цикле CONTINUE я использую add esi, 2 (может быть, вы используете 64-битные окна?)
3- В цикле SWAP первые 2 инструкции mov бесполезны. Я удалил их.
4- В цикле SWAP вам нужно поменять строки, в которые вы помещаете значения, обратно в esi и esi + 1 (на самом деле вам даже не нужна инструкция xchg.)
Теперь ESI изменен. Вам нужно поработать над алгоритмом сортировки.
BubbleSort PROC uses ECX
xor ecx,ecx
mov ecx, 15
OUTER_LOOP:
push ecx
xor ecx,ecx
mov ecx,14
mov esi, OFFSET arr
COMPARE:
xor ebx,ebx
xor edx,edx
mov bl, byte ptr ds:[esi]
mov dl, byte ptr ds:[esi+1]
cmp bl,dl
jg SWAP
CONTINUE:
add esi,2
loop COMPARE
mov esi, OFFSET arr
pop ecx
loop OUTER_LOOP
jmp FINISHED
SWAP:
xchg bl,dl
mov byte ptr ds:[esi+1],dl
mov byte ptr ds:[esi],bl
jmp CONTINUE
FINISHED:
ret
BubbleSort ENDP
EDIT:
Во внешнем цикле у вас есть 2 mov esi, OFFSET arr
а второй происходит как раз перед выходом. Таким образом, вы в основном возвращаете смещение массива в ESI, как это было в начале.
Примечание USES ESI ниже. Вы должны удалить его.
Кроме того, для чего используется ECX в этой процедуре? Он никогда не используется, но вы присваиваете значения, нажимаете и выводите их?
ИСПОЛЬЗОВАНИЕ eax ebx ecx edx esi
Этот помощник masm помещает ESI в стек.
Когда вы выходите из процедуры, она выскакивает, как и раньше.
Так что вы, вероятно, не хотите включать туда ESI.
Обратите внимание, вы также хотите поместить свой DWORD в другой регистр, например EAX. Есть некоторые случаи, когда ввод процедуры ESI и лайки все равно выталкиваются.