1

ユーザーの入力を最大配列サイズとして受け取り、ユーザーにそのサイズの配列を作成させるプログラムをアセンブリで作成する必要があります。その値を最大 1000 個の配列項目 (すべて int) にバッファーすることになっています。次に、配列で選択ソートを実行して出力する必要があります。

IBM Web サイトで次の選択ソートを見つけました。

    .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/stdinファイル記述子(非常に低レベルですが、アセンブラーを作成しています)またはhttp://www.manpagez.com/man/3/scanf/( C関数)。また、コマンドラインで「manscanf」を使用して概要を取得します。

関数に与えたい引数を逆の順序でスタックに置き、関数を呼び出し、スタックを再調整します。関数に引数がどのように与えられるかは、アーキテクチャとオペレーティングシステムによって異なります。これは、アプリケーションバイナリインターフェイス(「ABI」)で定義されます。i386を使用している場合は、 http://www.scribd.com/doc/48244725/abi386-4の「関数呼び出しシーケンス」を参照してください。

.bssセクションで1000バイトを予約できます。

.section .bss
buffer:  .space 1000

または、「malloc」を使用できます。

于 2011-02-12T00:02:18.483 に答える