0

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

うまくいけば明確にするために、ここに私のコードがあります:

.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文字しか表示されていませんでした!文字列の行全体が印刷されていなかったため、現在私は夢中になっています。誰かが私が間違っていることを教えてもらえますか?

これを読んでくれた人に感謝します。

4

1 に答える 1

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 で記述して逆コンパイルすると、おそらくこれが表示されます。比較関数と出力関数を書き直して、文字列内のリテラル文字ではなく、文字列へのポインターを操作するようにすると、問題が解決します。

于 2012-04-06T11:54:29.410 に答える