1

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

4

1 回答 1

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

于 2011-02-12T00:02:18.483 回答