@Alertoso

Почему отнимается 4 и умножается на 4?

Я не очень понимаю, почему отнимается 4 и умножается на 4, почему это число, насчёт pushad, я ведь правильно понимаю, что он помещает в стек значения РОН, то есть адрес массива в esi, и в ecx размер массива?
Procedure Bubble(var A: array of Integer; M: Integer);
Asm
    pushad

    dec   ecx
    mov   esi, 1

@1:
    mov   edi, ecx
    mov   edx, [eax+edi*4]

@2:
    mov   ebx, [eax+edi*4-4]
    cmp   ebx, edx
    ja    @3
    mov   [eax+edi*4-4], edx
    mov   [eax+edi*4], ebx
    jmp   @4

@3:
    mov   edx, ebx

@4:
    dec   edi
    cmp   edi, esi
    jnl   @2

    inc   esi
    cmp   esi, ecx
    jle   @1

    popad
End;

И как можно переделать это без процедуры, а чтоб просто использовать в основной программе
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
longclaps
@longclaps
Procedure Bubble(var A: array of Integer; M: Integer);
# var A: array of Integer - ссылка на A, передаётся в eax
# M: Integer - размер массива, передаётся в ecx
Asm
    pushad
    dec   ecx
    mov   esi, 1
@1:
    mov   edi,  ecx
    mov   edx, [eax+edi*4] #  mov   edx, A[edi], 4-байтные int
@2:
    mov   ebx, [eax+edi*4-4] # ebx, A[edi - 1]
    cmp   ebx, edx
    ja    @3
    mov   [eax+edi*4-4], edx #mov   A[edi - 1], edx
    mov   [eax+edi*4], ebx  # A[edi], ebx  # вот и поменялись местами
..............................

Вроде всё понятно.
Переделать можно, но зачем - есть quicksort, им пользуйся
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы