2014-12-03 40 views
0

我需要創建一個將整數數組按升序排序的程序。 C中的問題很簡單,並且代碼給了我們。無法在Y86中創建數組循環Assembly

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

但是當我嘗試落實到組件中,我得到任何

Error on line 90: Invalid line 
Line 90, Byte 0x00d0: .comm *data,20,4  //data = memory location 

,或者,如果我評論說,線路輸出(我不認爲我應該)我得到這個

Error on line 39: Expecting ')' 
Line 39, Byte 0x005a: mrmovl (%edx,%ebx,4),%eax //%eax = data[i] 
Error on line 41: Expecting ')' 
Line 41, Byte 0x0066: mrmovl 4(%edx,%ebx,4),%edi //%edi = data[i++] 
Error on line 46: Expecting ')' 
Line 46, Byte 0x0073: mrmovl 4(%edx,%ebx,4),%edi //%edi = data[i++] 
Error on line 47: Expecting ')' 
Line 47, Byte 0x0079: rmmovl %edi, (%edx,%ebx,4) //data[i] = data[i++] 
Error on line 48: Expecting ')' 
Line 48, Byte 0x007f: rmmovl %eax, 4(%edx,%ebx,4) //data[i++] = data[i] 

以下是我的代碼,因爲它代表:

.pos 0 

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

bubble: pushl %ebp  //setup 
    rrmovl %esp, %ebp 

    pushl %edx  //declaring *data 
    mrmovl 8(%ebp), %edx   
    pushl %ecx  //declaring count 
    mrmovl 12(%ebp), %ecx 
    pushl %ebx  //declaring i 
    pushl %esi  //declaring last 
    pushl %edi 
    pushl %eax 
    irmovl $1, %edi  //%edi = 1 

    rrmovl %ecx,%esi //last=count 
    subl %edi,%esi  //last-- 

L1: 
    irmovl $0, %edi  //%edi = 0 
    subl %edi,%esi  //last -= 0 
    jle L9   //ends loop if last <= 0 

    irmovl $0, %ebx  //i = 0 
L2: 
    rrmovl %ebx, %edi //%edi = copy of i 
    subl %esi,%edi  //%edi = i-last 
    jge L8   //ends loop if i >= last 

    mrmovl (%edx,%ebx,4),%eax //%eax = data[i] 
    irmovl $1, %edi   //%edi = 1 
    mrmovl 4(%edx,%ebx,4),%edi //%edi = data[i++] 

    subl %eax,%edi  //%edi = data[i++]-data[i] 
    jge L7   //cancel if statement if data[i++]>=data[i] 

    mrmovl 4(%edx,%ebx,4),%edi //%edi = data[i++] 
    rmmovl %edi, (%edx,%ebx,4) //data[i] = data[i++] 
    rmmovl %eax, 4(%edx,%ebx,4) //data[i++] = data[i] 

L7: 
    irmovl $1, %edi  //%edi = 1 
    addl %edi,%ebx  //i++ 
    jmp L2   //go to beginning of loop 
L8: 
    irmovl $1, %edi  //%edi = 1 
    subl %edi,%esi  //last-- 
    jmp L1 
L9: 
    popl %ebx  //finish 
    popl %esi 
    popl %edi 
    popl %eax 
    popl %ebp 

    ret 




main: pushl %ebp  //setup 
    rrmovl %esp, %ebp 

    pushl %ebx  //declaring *data 
    mrmovl data, %ebx 
    pushl %esi  //declaring count 
    mrmovl count, %esi 

    rmmovl %ebx, (%esp) //move data to be used by bubble 
    rmmovl %esi, 4(%esp) //move count to be used by bubble 

    call bubble 

    popl %ebx  //finish 
    popl %esi 
    popl %ebp 

    ret 


.comm data,20,4  //data = memory location 
.align 4 
count: .long 5  //count = memory location 
data: .long 2  //data array assignment 
    .long 1 
    .long 3 
    .long 5 
    .long 4 

.pos 0x200 
Stack: .long 0 

回答

0

y86不支持完整的x86有效地址語法與索引和縮放比例,它只允許displacement(base)。您必須自己執行地址計算。

Y86彙編器不支持.comm或者,只是用定義數據.long