【问题标题】:Homework help - GNU assembler selection sort question作业帮助 - GNU 汇编程序选择排序问题
【发布时间】:2011-02-11 23:20:25
【问题描述】:

我必须在汇编中创建一个程序,将用户的输入作为最大数组大小,然后让用户创建一个该大小的数组。 我应该将该值缓冲到最多 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% 的情况,所以我对此很满意。 我什至不知道从哪里开始是如何获取用户输入并用它创建一个数组?以及如何使用缓冲区来设置数组大小的限制? 非常感谢任何帮助!

【问题讨论】:

    标签: sorting assembly gnu gnu-assembler


    【解决方案1】:

    这个程序不是交互式的。 “输入”在线数组中给出

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

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

    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”。

    【讨论】:

    • 对于数组,我是否只是将其初始化为空变量?例如数组:.int 0 另外,在我的 scanf 调用之前的某个时候,我遇到了段错误。我按顺序将 $uservalue 和 $format 推送到 scanf,其中 uservalue 是我想要保存用户所需数组长度的 int 变量,而格式只是带有“%d”的 asciz 字符串。 gdb 显示我的段错误是在 $uservalue 被推送之后。我会在一分钟内发布确切的代码。
    • 'code'.section .data maxvalue: .int 1000 format: .asciz " %d" message: .asciz "Please enter a maximum size for the array to be sorted.\n" uservalue: .int 值:.int .section .bss .comm array_buffer, 4000 .section .text .globl main main: pushl $message call printf movl $4, %esp pushl $uservalue pushl $format call scanf movl $8, %esp _exit: movl $1, %eax movl 0, %ebx int $0x80
    • "movel $4, %esp" 肯定是错误的。您正在用“4”覆盖堆栈指针,这没有任何意义。之后,第一个使用堆栈的命令,即 push,崩溃了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2011-01-24
    • 2011-03-25
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    相关资源
    最近更新 更多