2016-10-16 5 views
1

私はx86アセンブリ(NASM)とCを一緒に使用するプロジェクトに取り組んでいます。特定の年(int)が別のものよりも小さいか大きいかを調べ、結果に応じて-1,1、または0を返すインデックス付きアドレッシングモードを使用するアセンブリで書かれたサブルーチンがあります。私は約4または5以上のレコードを入力すると、適切に並べ替えられないように見えます。私は数時間かけてgdbを実行していますが、最初にjをインクリメントする前に(iがインクリメントされる前に)jをインクリメントする最後の反復で、スラップを実行してはいけないとは思っていましたが、わかりませんそれを直す方法。どのような考えにも事前に感謝します。アセンブリ+ C - ソート構造

--- Cコード---

+0

2つのグローバル変数を使用する代わりに、関数の引数を 'cmpbook'に渡すのはなぜですか?それは本当に醜い(そして少し遅い)。関連:このコメントは偽です: 'mov esi、[book1];各書籍にポインタを格納する。これはロード命令です(メモリのソースではなく、メモリのdest)。 –

+0

'は、インデックスされたアドレッシングモードを使用して、特定の年(int)が別の年より小さいか大きいかを判断します。全く別の説明。私は実際には、単に 'cmp'を使う代わりに、アドレス計算と整数を比較するためにどのようなルックアップテーブルを作成したのか、興味がありましたが、' [reg + displacement] 'アドレッシングモードを使ってアクセスしています構造体フィールド。 –

+0

asm関数の最後に 'ret'がありません。 –

答えて

1

私はそれを得ました。間違った場所にmin = iを設定していたからです。

for (i = 0; i < numBooks - 1; i++) { 
      /*** WAS HERE ***/ 
      for (j = i + 1; j < numBooks; j++) { 

      /*** SHOULD BE HERE ***/ 
      min = i; 

      /* Copy pointers to the two books to be compared into the 
      * global variables book1 and book2 for bookcmp() to see 
      */ 
      book1 = &books[i]; 
      book2 = &books[j]; 

      cmpResult = bookcmp(); 
      /* bookcmp returns result in register EAX--above saves 
      * it into cmpResult */ 

      /* book2 comes before book1, in other 
      words, book1 is greater - value stored in 
      eax will in this case be 1 */ 
      if (cmpResult == 1) { 
       min = j; 
      } 

      if (min != i) { 
       tempBook = books[i]; 
       books[i] = books[min]; 
      books[min] = tempBook; 
      } 

      } 
     } 
    } 
+0

if(bookcmp(&books [i]、&books [j])== 1){本[j]} '? (まだあなたの現在のコードのような3つの割り当てを使用しています)。これは 'min'を完全に取り除き、ループ本体を通常の比較とスワップに大幅に単純化します。 –

+0

ピーターは常に良いアドバイスを受け取ります!実際には、私は実際にその機能について知りませんでした。 – swingonaspiral