0

この質問が本当に単純な場合は申し訳ありませんが、私が知っていることをすべて試してみましたが、理解できませんでした.

コンソールから文字列とカウントを取得し、カウントで指定された回数の文字列を出力する簡単な手順を作成しようとしています。

すべて問題ありませんが、ループのためにカウントを eax に移動すると、値が台無しになり、印刷の無限ループが発生します。

atodw で Count を DWORD に変更しようとしましたが、うまくいきませんでした。

コードは次のとおりです。

PrintString PROTO :DWORD, :DWORD

.data

        String db 100 DUP(0)

        Count db 10 DUP(0)

.code
    start:
        ;1- get user input

        invoke StdIn, addr String, 99
        invoke StdIn, addr Count, 10

        ;2- Remove the CRLF from count
         invoke StripLF, addr Count

        ;3- Convert the count to DWORD 
        invoke atodw, addr InputCount
        mov Counter, eax

        ;4- Call the Printer function

        invoke Printer, addr String,   addr Count

Printer PROC StringToPrint:DWORD, count:DWORD         

 mov eax,count  ;;;;;; This is the problem I think

 Looppp:
            push eax

            invoke StdOut,  StringToPrint

            pop eax
            dec eax

            jnz Looppp
    ret
Printer endp
4

1 に答える 1

0

addr Countに2番目の引数として–文字列のアドレス–を渡しますPrinter。ただし、整数を想定しているため、Counter代わりに渡す必要があります。

型チェックなしの言語を使用しているため、識別子にハンガリアン記法などの命名規則を採用すると、この種の問題を確認して回避するのに役立ちます。ここで名前が付けられた変数を使用するstrCountdwCount、たとえば、間違った変数を使用していたことがより明白になります。

余談ですが、印刷ループが無限eaxにならないように、最終的にはゼロに到達する必要があります。意図したよりもかなり長くなります…</ p>

于 2011-12-11T18:28:20.650 に答える