2011-02-11 105 views
1

我必須在程序集中創建一個程序,將用戶輸入作爲最大數組大小,然後讓用戶創建一個具有該大小的數組。 我應該緩衝該值到最多1000個數組項目(所有整數) 然後,我必須在陣列和輸出上運行選擇排序。家庭作業幫助 - GNU彙編程序選擇排序問題

我在IBM網站上發現了以下選擇排序。

.section .data 

    array: 
     .byte 89, 10, 67, 1, 4, 27, 12, 34, 86, 3 

    array_end: 
     .equ ARRAY_SIZE, array_end - array 

    array_fmt: 
     .asciz " %d" 

    usort_str: 
     .asciz "unsorted array:" 

    sort_str: 
     .asciz "sorted array:" 

    newline: 
     .asciz "\n" 


.section .text 
.globl main 

main: 
     pushl $usort_str 
     call puts 
     addl $4, %esp 

     pushl $ARRAY_SIZE 
     pushl $array 
     pushl $array_fmt 
     call print_array10 
     addl $12, %esp 

     pushl $ARRAY_SIZE 
     pushl $array 
     call sort_routine20 

# Adjust the stack pointer 
     addl $8, %esp 

     pushl $sort_str 
     call puts 
     addl $4, %esp 

     pushl $ARRAY_SIZE 
     pushl $array 
     pushl $array_fmt 
     call print_array10 
     addl $12, %esp 
     jmp _exit 



print_array10: 
     pushl %ebp 
     movl %esp, %ebp 
     subl $4, %esp 
     movl 8(%ebp), %edx 
     movl 12(%ebp), %ebx 
     movl 16(%ebp), %ecx 

     movl $0, %esi 

push_loop: 
     movl %ecx, -4(%ebp) 
     movl 8(%ebp), %edx 
     xorl %eax, %eax 
     movb (%ebx, %esi, 1), %al 
     pushl %eax 
     pushl %edx 

     call printf 
     addl $8, %esp 
     movl -4(%ebp), %ecx 
     incl %esi 
     loop push_loop 

     pushl $newline 
     call printf 
     addl $4, %esp 
     movl %ebp, %esp 
     popl %ebp 
     ret 

sort_routine20: 
     pushl %ebp 
     movl %esp, %ebp 

# Allocate a word of space in stack 
     subl $4, %esp 

# Get the address of the array 
     movl 8(%ebp), %ebx 

# Store array size 
     movl 12(%ebp), %ecx 
     decl %ecx 

# Prepare for outer loop here 
     xorl %esi, %esi 

outer_loop: 
# This stores the min index 
     movl %esi, -4(%ebp) 
     movl %esi, %edi 
     incl %edi 

inner_loop: 
     cmpl $ARRAY_SIZE, %edi 
     jge swap_vars 
     xorb %al, %al 
     movl -4(%ebp), %edx 
     movb (%ebx, %edx, 1), %al 
     cmpb %al, (%ebx, %edi, 1) 
     jge check_next 
     movl %edi, -4(%ebp) 

check_next: 
     incl %edi 
     jmp inner_loop 

swap_vars: 
     movl -4(%ebp), %edi 
     movb (%ebx, %edi, 1), %dl 
     movb (%ebx, %esi, 1), %al 
     movb %dl, (%ebx, %esi, 1) 
     movb %al, (%ebx, %edi, 1) 

     incl %esi 
     loop outer_loop 

     movl %ebp, %esp 
     popl %ebp 
     ret 

exit: 
     movl $1, %eax 
     movl 0, %ebx 
     int $0x80 

我已經通過它了,我可以理解90%的事情,所以我對此感到滿意。 我不知道從哪裏開始就是如何獲取用戶輸入並使用它創建數組?我如何使用緩衝區來設置數組大小的限制? 任何幫助非常感謝!

回答

1

該程序不具有互動性。 「輸入」在線陣列中給出

array: 
     .byte 89, 10, 67, 1, 4, 27, 12, 34, 86, 3 

只能在編譯期間更改。如果您需要接受用戶輸入,則需要調用適當的內核函數或標準庫函數。

http://linux.die.net/man/2/read與stdin文件描述符(非常低的水平,但您正在編寫彙編器)或http://www.manpagez.com/man/3/scanf/(C函數)。 您還可以在命令行中獲得「man scanf」的概述。

您可以在堆棧中將相應的參數以相反順序放置,調用該函數並重新調整堆棧。如何給函數賦予參數取決於體系結構和操作系統。它在應用程序二進制接口(「ABI」)中定義。假設您在i386上,請參見「函數調用序列」下的http://www.scribd.com/doc/48244725/abi386-4

您可以在.bss段保留1000個字節

.section .bss 
buffer: .space 1000 

或者你可以使用 「的malloc」。

+0

對於數組,我只是將它初始化爲一個空變量? 如array:.int 0 此外,我在我的scanf調用之前有時會收到段錯誤。 我推$ uservalue和$格式的順序scanf其中uservalue是int變量我想保存用戶所需的數組長度和格式只是一個asciz字符串與「%d」。 gdb顯示我的段錯誤在$ uservalue被推後。我會在一分鐘內發佈確切的代碼。 – 2011-02-12 01:03:53