2011-02-11 97 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