2

そこで、バブルソートプログラムをアセンブリから Y86 に変換しようとしています。この C コードから始めて、アセンブリに変換しました。

#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;
    }
      }
}

これは私のY86コードです:

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

標識フラグが立てられていないように見えますが、これがなぜなのかはよくわかりません。シミュレーターを実行すると、配列の要素はソートされず、同じ位置に留まります。これを修正する方法についてのヒントは大歓迎です!

4

0 に答える 0