2012-04-06 32 views
0

私は、文字列の配列をバブルソートするプログラムをアセンブリで作成しています。長さゼロの文字列が配列を終了します。 DWORD配列を宣言することでこれにアプローチしました。ここでは、バイトサイズの文字列var。が格納されます。私の主な問題はバブルソート自体ではなく、配列に格納された文字列が完全に出力されていないことです。DWORDSの配列に格納された文字列を出力する

うまくいけば、それを明確にするために、ここに私のコードは次のとおりです。

.586 
.MODEL FLAT 

INCLUDE io.h ; header file for input/output 

space   equ  0 
cr    equ  0dh 

.STACK 4096 

.DATA   
myStrings    byte "Delts",0 
         byte "Abs",0 
         byte "Biceps",0 
         byte 0 

labelStrOut    byte "Output is: ", 0 

stringOut    dword 11 dup (?) 

stringNum    dword 0 
stringArray    dword 20 dup (?)    


.CODE 

_MainProc PROC 

      mov edi, offset myStrings 
      mov esi, offset stringArray 


popltLp:  
      cmp BYTE PTR [edi], 0 
      jz popltDone 
      mov ebx, [edi] 
      mov DWORD PTR [esi], ebx    
      add esi, 4 
      inc stringNum 
      xor ecx, ecx 
      not ecx 
      xor al, al 
      repne scasb 
      jmp popltLp 

popltDone: 
      xor edx, edx 


      lea esi, stringArray 
      mov ebx, DWORD PTR [esi] 
      mov stringOut, ebx 
      output labelStrOut, stringOut 
      add esi, 4 
      mov ebx, DWORD PTR [esi] 
      mov stringOut, ebx 
      output labelStrOut, stringOut 
      add esi, 4 
      mov ebx, DWORD PTR [esi] 
      mov stringOut, ebx 
      output labelStrOut, stringOut 


outptDone: 

      mov eax, 0      ;  exit with return code 0 
      ret 
_MainProc ENDP 


END        ; end of source code 

見られるように、何のバブルソートは「popltDone」以下

ラインをやっていない、まだ...している私だけです文字列が配列に引き継がれているかどうか確認するのが面倒です。しかし、画面にプリントアウトすると、ちょうど4文字しか表示されませんでした!文字列全体が印刷されていないだけで、現在私は狂っている。誰かが私が間違っていることを教えてもらえますか?

これを読んでいる人に感謝します。

+0

この宿題はありますか?表示された出力を追加できますか? – wallyk

+0

画面には「Delt」、「Abs」、「Bice」という出力があります。常に4文字...なぜ、配列に文字列を格納するために間違った命令を使用している必要がありますか分からない。 –

答えて

0

問題は、文字列ポインタを正しく使用していないことです。あなたは英語にこれを翻訳した場合、それはこのようなものになるだろう

mov ebx, [edi] 
mov DWORD PTR [esi], ebx 

Move the 4 byte value pointed to by edi into ebx. 
Move the value in ebx into the memory address pointed to by esi. 

これは完全に合法で、実際にどのようなことがあり具体的には、ここでのコードは、私が参照しています場合によっては望みますが、私はこれがその1つではないと思います。リテラル文字列を配列にコピーしたため、文字列の出力時に最初の4文字しか表示されないのは、 DWORDは4バイトなので、最初の4文字を取得します。ここで私は書くでしょう何:に変換

mov DWORD PTR [esi], edi 

Move the pointer value edi into the memory address pointed to by esi. 

今、あなたは文字列の配列が、文字列ポインタの配列を持っていません。あなたのコードをC言語で書かなければならない場合、それを逆コンパイルしてください。文字列内のリテラル文字の代わりに文字列へのポインタを扱うように比較関数と出力関数を書き直すと、問題が解決されます。

+0

あなたの助けてくれてありがとう、Sparafusile。現在、私は新しい難問に直面しています。文字列ポインタの配列内の要素を出力すると、空白になります。 ;以下は、私が を使用していた命令であり、出力すること –

+0

**なんてこった、上記の私のコメントを無視...私はまだこのサイトに新たなんだ、とそのねじれのすべて...あなたのための 感謝ヘルプ、Sparafusile。現在、私は新しい難問に直面しています。文字列ポインタの配列内の要素を出力すると、空白になります。以下 が、私はそれをプリントアウトするために使用してきた命令である: LEAのESI、のStringArray 出力labelStrOut、DWORD PTR [ESI] としては、現在、周りを取得する方法を考え出す、私の出力ウィンドウが空白である、と述べましたそれ。 –

+0

ポインタをポインタに印刷しようとしています。代わりにこれを試してください: "output labelStrOut、esi"。次の文字列に移動するには、esiに4を追加します。 – Sparafusile

関連する問題