家庭作业帮助 - GNU汇编程序选择排序问题

时间:2011-02-11 23:20:25

标签: sorting assembly gnu gas

我必须在程序集中创建一个程序,将用户的输入作为最大数组大小,然后让用户创建该大小的数组。 我应该将该值缓冲到最多1000个数组项(所有整数) 然后我必须对数组和输出运行选择排序。

我在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 个答案:

答案 0 :(得分:1)

此程序不是交互式的。 “输入”在行数组

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

并且只能在编译期间进行更改。如果需要接受用户输入,则需要调用相应的内核函数或标准库函数。

带有stdin文件描述符的

http://linux.die.net/man/2/read(非常低级别,但您正在编写汇编程序)或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”。