2014-10-11 8 views
5

Ich schreibe ein Programm in Assembly mit tasm. Meine Aufgabe besteht darin, ein Programm zu schreiben, das die Blasensortierung verwendet, um die eingegebene Zeichenfolge alphabetisch zu sortieren. Ex. Wenn Sie "Hallo" eingeben, sollte "ehlo" geschrieben werden. Ich habe das Betteln geschrieben, um in die Zeichenkette zu kommen und sie zu sortieren (ich denke, es funktioniert bis zum Ende, wo es das Ergebnis ausdrucken soll, aber am Ende schreibt es einfach meine .data und die fertig ist seine Arbeit) PS sorry für schlecht deutschAssembly - Blasensortierung zum Sortieren von Strings

.model small 
.stack 100h 

.data 
request  db 'This program is using bubblesort to get alphabetical order of your enterd string', 0Dh, 0Ah, 'Enter your string:', 0Dh, 0Ah, '$' 
result  db 0Dh, 0Ah, 'Result:', 0Dh, 0Ah, '$' 
buffer  db 100, ?, 100 dup (0) 

.code 

start: 
MOV ax, @data     
MOV ds, ax      


MOV ah, 09h 
MOV dx, offset request 
int 21h 


MOV dx, offset buffer   
MOV ah, 0Ah      
INT 21h       


MOV si, offset buffer   
INC si       
MOV bh, [si]      
INC si       

sort: 
mov cx, [si] 
mov bx, [si]  

nextelement: 
mov ax, [bx+si]  
cmp ax, [bx+si+1] 
jge noswap   
xchg ax, [bx+si+1] 
mov ax, [bx+si] 

noswap: 
inc si    
cmp cx, si   
jl nextelement  
loop nextelement 



MOV ah, 09h 
MOV dx, offset result 
int 21h 


char: 
LODSB       
MOV ah, 2      
MOV dl, al      
INT 21h       

DEC bh       
JZ ending      
JMP char       


ending: 
MOV ax, 4c00h    
INT 21h       

end start 
+0

Beachten Sie, dass das BH-Register die oberen 8 Bits mit bx teilt, also wenn Sie letztere laden, das Formular Er wird auch überschrieben. –

+0

Okey ich werde dies in Zukunft –

Antwort

3

1) Für Blasensortierung benötigen Sie zwei verschachtelte Schleifen. Die äußere Schleife setzt die Startparameter für die innere Schleife zurück, bis nichts mehr zu tauschen ist.

2) Sie sortieren Zeichen. Das sind 8-Bit-Werte (Bytes). Sie können sie nicht direkt in ein 16-Bit-Register laden (mov ax, [bx+si]).

3) [bx+si] & [bx+si+1]: das ist so falsch, dass ich den Fehler nicht erklären kann :-).

Anstatt Code zu korrigieren Ich schrieb ein Beispiel "from scratch": Nach der Darstellung in http://en.wikipedia.org/wiki/Bubble_sort:

Bubble sort animation

.MODEL small 
.STACK 1000h      ; Don't skimp with stack! 

.DATA 
    Struct0A EQU $     ; Buffer for INT 21h/0Ah (max,got,buf) 
     max db 100     ; Maximum characters buffer can hold (incl. CR (0Dh)) 
     got db 0     ; Number of characters actually read, (excl. CR (0Dh)) 
     buf db 100 dup (0)   ; Actual characters read, including the final carriage return (0Dh) 
    Linefeed db 13, 10, '$' 
    GetString db 'Enter string: $' 

.CODE 
start: 
    mov ax, @DATA       ; Initialize DS 
    mov ds, ax 

    ; Input String 
    mov ah, 09h 
    mov dx, OFFSET GetString 
    int 21h 
    mov dx, OFFSET Struct0A 
    mov ah, 0Ah 
    INT 21h 

    mov si, OFFSET buf      ; Base for [si + bx] 
    xor bx, bx        ; Prepare BX for following byte load 
    mov bl, got        ; Load length of string = 0Dh at the end 
    mov BYTE PTR [si + bx], '$'    ; Delimiter for int 21h/09h 

    outer: 
    dec bx         ; The last character is already at the right place 
    jz done         ; No characters left = done 
    mov cx, bx        ; CX: loop variable 
    mov si, OFFSET buf 
    xor dl, dl        ; DL (hasSwapped) = false 

    inner: 
    mov ax, [si]       ; Load **two** characters 
    cmp al, ah        ; AL: 1. char, AH: 2. char 
    jbe S1         ; AL <= AH - no change 
    mov dl, 1        ; hasSwapped = true 
    xchg al, ah        ; Swap characters 
    mov [si], ax       ; Store swapped characters 
    S1: 
    inc si         ; Next pair of characters 
    loop inner 

    test dl, dl        ; hasSwapped == true? 
    jnz outer        ; yes: once more 
    done: 

    ; Print result 
    mov dx, OFFSET Linefeed 
    mov ah, 09h 
    int 21h 
    mov dx, OFFSET buf 
    mov ah, 09h 
    int 21h 

    mov ax, 4C00h 
    int 21h 

END start 

Und hier ist eine andere "animiert" Illustration:

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

+0

berücksichtigen Ich bin wirklich dankbar für die Hilfe. Ich verstehe, wie bubble sort aussieht und wie man es in einer anderen Sprache programmiert, ich verstehe Assembler einfach nicht. Auch danke, dass du deine Zeit verbringst, um das volle Programm zu schreiben :) –

+0

Auf einigen CPUs könnte es ein Gewinn sein, Cache-Zeilen-Splits/unausgerichtete Lasten zu vermeiden, indem man immer nur den Speicher konditioniert. z.B. 'mov al, [si]'/'Rollenaxt, 8' /' cmp/jbe'. Man könnte sogar 'lodsb' verwenden (aber bei modernen CPUs ist das langsamer als' mov'/'inc'). Dies erzeugt eine Loop-getragene Abhängigkeit von AX, aber OTOH, wenn viele Swaps benötigt werden, vermeidet es Speicherweiterleitungen von dem Speicher zu der teilweise überlappenden Last. Aber der einzige Grund, um in erster Linie Blasen-Sortierung ist die kompakte Code-Größe, nicht die Leistung, so werde ich nicht zu viel beschweren über die Verwendung einer langsamen 'loop' Anweisung. –

+0

@PeterCordes: Wenn das Ziel 8086 'rol ax, 8' nicht verfügbar ist. –