Сортировка строки в алфавитном порядке с использованием сборки - PullRequest
0 голосов
/ 20 января 2019

Я использую Ubuntu 32 бит для кодирования в сборке И я пытаюсь сделать программу, чтобы упорядочить строку в алфавитном порядке, но она не работает правильно.

Я объявил строку. Я использовал Леа, чтобы поместить строку в регистр eax. Затем использовали movl(%eax), %ebx, чтобы скопировать первую ячейку памяти (0) строки, которая будет «l», чтобы затем сравнить ее со второй ячейкой памяти (1), которая будет «h».

В следующем цикле, чтобы сравнить вторую ячейку памяти с третьей ячейкой памяти, которую я сделал inc %eax, чтобы получилось movl 1(%eax), %ebx вместо movl (%eax), %ebx. Это мой код:

.data
    str: .string "lhtgbvfmjnbcdsaawcfr"
.text
.globl main
main:
    movl $19, %ecx
inicio:
    leal variavel, %eax
    movl (%eax), %ebx
    cmpl %ebx, 1(%eax) 
    JA maior 
    JB menor
maior:
    xchg %ebx, 1(%eax)
    xchg (%eax), %ebx 
menor:  
    inc %eax 
    decl %ecx 
    cmpl $0, %ecx
    JA inicio 
    JE main

То, что я делал, не работало, так что явно что-то не так, я искал сборку, но я не нашел много вещей. Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 20 января 2019

Вы описываете простой алгоритм Bubble Sort в соответствии с http://en.wikipedia.org/wiki/Bubble_sort:

Bubble sort animation

. ".String" - это просто массив символов.Последний символ имеет значение 0, чтобы определить конец строки.Символ кодируется как 8-битное значение.Таким образом, вам нужно только использовать 8-битные регистры процессора (AL, AH, DL, DH и т. Д.) Для их обработки.Вы можете использовать 32-разрядные расширенные регистры (EAX, EBX, ECX, EDX и т. Д.), Но это излишне усложняет ситуацию.

Bubble Sort требуется два вложенных цикла.В этом случае бесконечный внешний цикл, который заканчивается при сортировке строки, и внутренний цикл, который обрабатывает каждый символ.

Следующий пример очень прост.Например, последнее отсортированное письмо излишне сравнивается снова и снова.У него большой потенциал для улучшения:

#   Name:               bubblesort.s
#   Assemble & link:    gcc -m32 -obubblesort bubblesort.s
#   Run:                ./bubblesort

.data
fmt: .string "%s\n"
str: .string "lhtgbvfmjnbcdsaawcfr"

.text
.global main
main:

    pushl $str                  # Address of str onto the stack
    pushl $fmt                  # Address of fmt onto the stack
    call printf                 # Call libc: printf(fmt,str)
    addl $(4*2), %esp           # Adjust the stack by 2 PUSHes

    O1:                         # Outer loop ends when everything is sorted (swapped == false)
    movl $str, %esi
    movb $0, %dl                # swapped = false

    I1:                         # Inner loop: every character
    movb (%esi), %al
    movb 1(%esi), %ah
    cmpb $0, %ah                # End of string?
    je O2                       # Yes -> exit inner loop

    cmpb %ah, %al               # Compare the characters
    jbe I2                      # If AL < AH, don't swap the characters
    movb $1, %dl                # swapped = true
    movb %al, 1(%esi)           # Swap: Store the characters in reversed order
    movb %ah, (%esi)

    I2:
    incl %esi                   # Next character
    jmp I1

    O2:
    pushal                      # Preserve all registers
    pushl $str                  # Address of str onto the stack
    pushl $fmt                  # Address of fmt onto the stack
    call printf                 # Call libc: printf(fmt,str)
    addl $(4*2), %esp           # Adjust the stack by 2 PUSHes
    popal                       # Restore all registers

    cmpb $1, %dl                # swapped == true?
    je O1                       # Yes -> one more outer loop

    Done:
    ret                         # Return: exit the main function

А вот еще одна «анимированная» иллюстрация:

https://www.youtube.com/watch?v=lyZQPjUT5B4

...