Assembly Collection : 6 Pengurutan(Sorting) Array dalam Assembly

Last Updated on 14 years by Mas Herdi

Kali ini kita benar-benar mendapat a big deal. Kita diminta untuk mengurutkan sebuah array atau larik berisi 8 elemen dan masih bisa ditambah. Metode pengurutan yang saya pakai adalah bubble-sort. Dan kita mempunyai 100 lebih baris prorgam Assembly.

Screenshot Program Bubble-sort Assembly

sortbubbs.asm 

.data
teks1:.asciiz "Nilai "
teks2:.asciiz ": "
teks3:.asciiz "n"
teks4:.asciiz "Nilai yang telah dimasukkan adalah "
teks5:.asciiz "-"
teks6:.asciiz "Nilai setelah diurutkan adalah "

list: .word 8

.text
.globl main
main :

li $t2, 4        #inisialisasi index = 0
li $t3, 36        #inisialisai panjang array
la $t0, list    #absolut address untuk array
li $t4, 0        #inisialisasi counter

loop: 
    addi $t4, $t4, 1        #counter i

    la $a0, teks1        #print teks1
    li $v0, 4
    syscall

    move $a0, $t4        #print i(t4)
    li $v0, 1
    syscall

    la $a0, teks2        #print teks 2
    li $v0, 4
    syscall

    li $v0, 5            #input integer untuk t5
    syscall
    move $t5, $v0

    add $t1, $t2, $t0    #kombinasikan indeks awal dengan array

    sw $t5, 0($t1)        #storeword t5 ke t1 dgn offset 0 dari basis

    addi $t2, $t2, 4        #increment index
    beq $t2, $t3, endloop    #jika index = panjang array -> end
  j loop                #looping statement

endloop:
    li $t2, 4            #inisialisasi index = 0

    la $a0, teks4        #print teks4
    li $v0, 4
    syscall

    j loopprint        #jump ke loopprint

loopprint :

    add $t1, $t2, $t0    #kombinasikan indeks awal dengan array

    lw $t6, 0($t1)        #loadword t1 ke t6 dgn offset 0 dari basis

    move $a0, $t6        #cetak t6
    li $v0, 1
    syscall

    beq $t2, 32, nostrip    #jika index = panjang – 1, tidak print “-“

    la $a0, teks5        #print “-(teks5)
    li $v0, 4
    syscall

nostrip :

    addi $t2, $t2, 4        #increment index (index ++)

    beq $t2, 36, bougysort #jika index = panjang array -> bougysort
    j loopprint        #looping

bougysort :
    li $t2, 4                 #inisialisasi index i = 0        
    li $t5, 4                 #inisialisasi index j = 0
    li $t3, 40             #inisialisasi panjang + 1

    sub $t4, $t3, 4             # panjang - 1

luaran :                    #for pertama
    slt $t6, $t2, $t4        #test apakah i < length - 1
    beq $t6, $zero, loopprint2    #jika tidak ke loopprint2
    li $t5, 4                #inisialisasi index j = 0

dalaman :                    #for kedua (nested for)

    addi $s1, $t2, 4         #s1 = (i + 1)
    sub $s2, $t3, $s1         #length – s1
    slt $t7, $t5, $s2         #apakah j < length – s1
    beq $t7, $zero, luarga     #jika tidak -> luarga

    add $t1, $t5, $t0        #kombinasikan index j dengan array t0

    lw $s4, 4($t1)            #loadword array[j+1]
    lw $s5, 0($t1)            #loadword array[j]

    slt $s3, $s4, $s5        #cek array[j+1] < array[j]
    beq $s3, 0, jangantukar    #jika tidak -> jangantukar

        lw $t7, 0($t1)        #loadword array[j]
        lw $t8, 4($t1)        #loadword array[j+1]
                        #mulai menukar
        sw $t8, 0($t1)        #storeword array[j] = array[j+1]
        sw $t7, 4($t1)        #loadword array[j+1] = array[j]

    addi $t5, $t5, 4            #increment j (j++)
    j dalaman                #jump ke dalaman (for kedua)

jangantukar :
    addi $t5, $t5, 4        #increment j (j++)
    j dalaman            #jump ke dalaman (for kedua)

luarga : 
    addi $t2, $t2, 4        #increment i (i++)
    j luaran            #jump ke luaran(for pertama)

loopprint2:

    li $t2, 4            #inisialisasi I = 0

    la $a0, teks3        #print teks3(spasi)
    li $v0, 4
    syscall

    la $a0, teks6        #print teks6
    li $v0, 4
    syscall

    j loopprint3        #jump ke looprint3

loopprint3 :            #cetak array yang terurut

    add $t1, $t2, $t0    #kombinasikan index dengan array

    lw $t6, 0($t1)        #loadword array[i]

    move $a0, $t6        #print array[i]
    li $v0, 1
    syscall

    beq $t2, 32, nostrip2    #jika index = length1, jangan cetak-“

    la $a0, teks5        print “-(teks5)
    li $v0, 4
    syscall

nostrip2:    

    addi $t2, $t2, 4        #increment index i++

    beq $t2, 36, endforev    #cek apakah index = length
    j loopprint3         #looping

endforev:
    jr$ra                #jump around return address

Dan inilah saingan bubblesort.cpp 

/* 
* File: arraymain.cpp
* Author: Herdi Naufal
*
* Created on May 12, 2011, 10:55 PM
*/

#include <cstdlib>
#include <iostream>
#define LENGTH 8

using namespace std;

/*
* 
*/

using std::cout;
using std::endl;
using std::cin;

int* ambilArray();
void cetakArrayModif(int* array);
int * urutGelemboeng(int * array);

int main()
{
   int* array = ambilArray();

   cout << "Nilai yang telah dimasukkan adalah ";
   cetakArrayModif(array);

   int * gels = urutGelemboeng(array);

   cout << "Nilai setelah diurutkan adalah ";
   cetakArrayModif(gels);
   delete[] array;
   return 0;
}

int* ambilArray()
{
int *array = new int[LENGTH];
   for ( int i = 0; i < LENGTH; i++ )
   {
     cout << "Nilai "<< i+1 <<" : ";
     cin >> array[i];
   }
   return array;
}

void cetakArrayModif(int * array)
{
    for(int i = 0; i < LENGTH; i ++)
        if(i == 8)
        {
            cout<< *(array + i);
        }
        else
        {
                cout<< *(array + i)<< "-";
        }
    cout << endl;
}

int * urutGelemboeng(int * array)
{
    int j =0;
    int temp;
    for(int i = 0; i < LENGTH-1; i++ )
    {
        for(j = 0; j < LENGTH - (i + 1); j++)
        {
            if((*(array + j)) > (*(array + j + 1)))
            {
                temp = *(array + j);
                *(array + j) = *(array + j + 1);
                *(array + j + 1) = temp;
            }
        }
    }
    return array;
}




Download aplikasi kami di Google Play Store


Tutorial Menarik Lainnya :

TWOH&Co.