2

So I am trying to convert a bubble sort program from assembly to Y86. I started with this C code and then converted it to assembly:

#include <stdio.h>

void bubble(int *, int);

int main(){

int count = 5;
int data[5]= {3, 2, 6, 1, 9,};
bubble(data, count);

return 0;

}

void bubble(int *data, int count){
int i, last;
for(last = count-1; last > 0; last--){
    for (i=0; i < last; i++)
    if (data[i+1] < data[i]){
    /* Swap adjacent elements */
        int t = data[i+1];
        data[i+1] = data[i];
        data[i] = t;
    }
      }
}

and this is my Y86 code:

init: irmovl Stack, %esp   # Set up stack pointer
      irmovl Stack, %ebp   # Set up base pointer
      call main            # call main program
      halt                 # Terminate program 

main:
    pushl   %ebp
    rrmovl  %esp, %ebp
    irmovl  -16, %ecx
    andl    %ecx, %esp
    irmovl  48, %ecx
    subl    %ecx, %esp
    irmovl  5, %esi 
    rmmovl  %esi, 44(%esp)
    irmovl  3, %esi
    rmmovl  %esi, 24(%esp)
    irmovl  2, %esi
    rmmovl  %esi, 28(%esp)
    irmovl  6, %esi 
    rmmovl  %esi, 32(%esp)
    irmovl  1, %esi
    rmmovl  %esi, 36(%esp)
    irmovl  9, %esi 
    rmmovl  %esi, 40(%esp)
    mrmovl  44(%esp), %eax
    rmmovl  %eax, 4(%esp)
    mrmovl  24(%esp), %ecx
    addl    %ecx, %eax
    rmmovl  %eax, (%esp)
    call    bubble
    irmovl  0, %eax
    rrmovl  %ebp, %esp
        popl    %ebp
    ret

bubble:
    pushl   %ebp
    rrmovl  %esp, %ebp
    irmovl  16, %esi
    subl    %esi, %esp
    mrmovl  12(%ebp), %eax
    irmovl  1, %esi
    subl    %esi, %eax
    rmmovl  %eax, -8(%ebp)
    jmp L4
L8:
    irmovl  0, %ebx
    rmmovl  %ebx, -12(%ebp)
    jmp L5
L7:
    mrmovl  -12(%ebp), %eax
    irmovl  1, %ecx
    addl    %ecx, %eax
    addl    %eax, %eax
    addl    %eax, %eax
    addl    %eax, %eax
    mrmovl  8(%ebp), %esi
    addl    %esi, %eax
    mrmovl  (%eax), %edx
    mrmovl  -12(%ebp), %eax
    addl    %eax, %eax
    addl    %eax, %eax
    addl    %eax, %eax
    mrmovl  8(%ebp), %esi
    addl    %esi, %eax
    mrmovl  (%eax), %eax    
    subl    %eax, %edx
    jge L6
    mrmovl  -12(%ebp), %eax
    irmovl  1, %esi
    addl    %esi, %eax
    addl    %eax, %eax
    addl    %eax, %eax
    addl    %eax, %eax
    mrmovl  8(%ebp), %esi
    addl    %esi, %eax
    mrmovl  (%eax), %eax
    rmmovl  %eax, -4(%ebp)
    mrmovl  -12(%ebp), %eax
    irmovl  1, %esi
    addl    %esi, %eax
    addl    %eax, %eax
    addl    %eax, %eax
    addl    %eax, %eax
    mrmovl  8(%ebp), %esi
    addl    %esi, %eax
    mrmovl  -12(%ebp), %edx
    addl    %edx, %edx
    addl    %edx, %edx
    addl    %edx, %edx
    mrmovl  8(%ebp), %esi
    addl    %esi, %eax
    mrmovl  (%edx), %edx
    rmmovl  %edx, (%eax)
    mrmovl  -12(%ebp), %eax
    addl    %eax, %eax
    addl    %eax, %eax
    addl    %eax, %eax
    mrmovl  8(%ebp), %esi
    addl    %esi, %eax
    mrmovl  -4(%ebp), %edx
    rmmovl  %edx, (%eax)
L6:
    irmovl  1, %esi
    mrmovl  -12(%ebp), %ebx
    addl    %esi, %ebx
L5:
    mrmovl  -12(%ebp), %eax
    mrmovl  -8(%ebp), %ebx 
    subl    %ebx, %eax
    jl  L7
    irmovl  1, %esi
    mrmovl  -8(%ebp), %ebx
    subl    %esi, %ebx
L4:
    irmovl  0, %esi             #i = 0
    mrmovl  -8(%ebp), %ebx
    subl    %esi, %ebx
    jg  L8
    rrmovl %ebp, %esp
        popl   %ebp
    ret

#stack starts here
.pos 0x200
Stack: .long    0

It seems as though the sign flag is never being raised, and I am not quite sure why this is. When I run the simulator, the elements of the array are never sorted, they just remain in the same position. Any tips on how to fix this would be much appreciated!

JSolo714
  • 35
  • 1
  • 7

0 Answers0