2016-04-25 7 views
0

このコードは、はるかに洗練され、より効率的になる可能性があることを理解していますが、これまでに提供されているコードのみを使用しています。私は2D配列を作成し、セールスマン番号(行番号)、販売数量(値)、製品ID(列番号)をユーザーに入力させようとしています。終了すると-1の値を入力します。各販売員の合計売上(行合計)と各製品の合計売上(列合計)を表示する必要があります。最初の行の情報を入力することはできますが、Salesman 2、3、または4の情報を入力しようとするとプログラムがフリーズします。ここに問題のあるコードの部分があります。2行以上のデータを2次元配列に読み取るときにエラーが発生する

L1: mov  edx, OFFSET msg1 
     call WriteString 
     call ReadInt 
     .WHILE(eax != quit) 
      mov  ebx, OFFSET tableE 
      dec  eax 
      add  ebx, RowSizeE 
      imul ebx, eax 
      call Crlf 
      mov  edx, OFFSET msg2 
      call WriteString 
      call ReadDec 
      mov  ecx, eax 
      call Crlf 
      mov  edx, OFFSET msg3 
      call WriteString 
      call ReadDec 
      mov  esi, eax 
      dec  esi 
      mov  tableE[ebx + esi*TYPE tableE], ecx 
      call Crlf 
      mov  eax, 0 
      mov  ebx, 0 
      mov  edx, 0 
      mov  ecx, 0 
      mov  esi, 0 
      loop L1 
     .ENDW 
+0

:これが正しい方法です。また、特に他人に手助けをしたい場合は、コードをコメントしてください。最後は重要なことですが、詳細を提供し、プログラムにエラーがあると言うだけではありません。 – Jester

+0

これは、あなたの問題を示す最小限の完全な例の反対です。これはあなたの全プログラムです。できるだけ小さいプログラムを作成するまで(そしてそれほど大したことはありませんが)、同じ問題があります。あなたはたぶんあなたのバグを見つけ出します。デバッガを使用してレジスタ/メモリを調べて、問題がまだ存在するかどうかを確認してください。 –

+1

コードを縮小していただきありがとうございますが、各ステップで何をしたいのか、理由を説明するコメントはまだありません。とにかく、 '' loop'命令の直前で 'ecx'をゼロにします(http://stackoverflow.com/questions/35742570/why-is-the-loop-instruction-slow-couldnt-intel-have-implemented-it-効率的に)おそらくバグです。 –

答えて

1

プログラムに2つの問題があります。

  • あなたがループに4回をしようとしている(4枚のセールスマンがあるので)が、どこのプログラムでは、あなたのECXでのセットアップ、このようなカウンタを行いません。さらに悪いことに、loop命令(@PeterCordesに記載されているように)の直前にECXレジスタをゼロにすることさえできます。

    mov  ecx, 4   ;NEW 
    L1: mov  edx, OFFSET msg1 
        call WriteString 
        call ReadInt 
        .WHILE(eax != quit) 
         push ecx   ;NEW 
         mov  ebx, OFFSET tableE 
         ... 
         mov  tableE[ebx + esi*TYPE tableE], ecx 
         call Crlf 
         xor  eax, eax  \ 
         xor  ebx, ebx  | Better way to zero these registers 
         xor  edx, edx  | 
         xor  esi, esi  /
         pop  ecx   ;NEW 
         loop L1 
        .ENDW 
    
  • EBXレジスタを誤って初期化します。あなたはあなたの質問は、(編集中もプレビューを使用して)それを自分で修正してください壊れたフォーマットで出てくる見たら、礼儀として

    dec  eax     ;Decrement salesman number [1,4] -> [0,3] 
    imul eax, RowSizeE 
    mov  ebx, eax 
    
+0

ew、ループ内のループカウンタのプッシュ/ポップ?ループカウンタには別のレジスタを使い、 'loop'を使わないでください。また、繰り返しごとに4つの整数regをゼロにすることは実際には必要であるとは思われません。 –

関連する問題