0

Microsoft Visual C ++ Express Editionを使用して、MASMでIA-32のアセンブリを学習していますが、この問題が発生しました。私がこれをするとき:

INCLUDE Irvine32.inc

QUANT = 47

.data

    fibonacciVetor DWORD 1, 1, (QUANT - 2) DUP(0)
    fileName BYTE "vetor.txt", 0
    fileHandler DWORD 0

.code
main PROC

    mov esi, 0
    mov ecx, QUANT

L1: mov eax, fibonacciVetor[esi * TYPE fibonacciVetor]
    add eax, fibonacciVetor[esi * TYPE fibonacciVetor + 4]
    mov fibonacciVetor[esi * TYPE fibonacciVetor + 8], eax
    inc esi
    loop L1

    mov edx, OFFSET fileName
    call CreateOutputFile
    mov fileHandler, eax
    mov edx, OFFSET fibonacciVetor
    mov ecx, QUANT * TYPE fibonacciVetor
    call WriteToFile
    mov eax, fileHandler
    call CloseFile

    exit

main ENDP
END main

fileName文字列はプロセスの途中で消去されるため、このプログラムは正しく実行されません。Irvine32.incライブラリは、KipIrvineのWebサイトにあります。私の教授が使用している教科書は、キップ・アーバインによる「Intelベースのコンピューター用のアセンブリ言語」第5版であるため、私はそれを使用しています。このための変数宣言を変更すると、次のようになります。

    fileName BYTE "vetor.txt", 0
    fibonacciVetor DWORD 1, 1, (QUANT - 2) DUP(0)
    fileHandler DWORD 0

プログラムは正しく実行されます。

fileName変数はfibonacciVetorの終了直後に割り当てる必要があり、配列に書き込むときに影響を受けないため、宣言の順序を変更するだけでプログラムの実行方法に影響するのはなぜですか?

どうもありがとうございます。

4

3 に答える 3

0

... fileName変数はfibonacciVetorの終了直後に割り当てられる必要があり、配列に書き込むときに影響を受けないためです。

ええと、「すべきではない」!="です"。デバッガーを使用してステップスルーし、範囲エラーがどこにあるかを確認します。

于 2010-04-13T20:45:44.770 に答える
0

ここでこのセクションを疑うでしょう:

L1: mov eax, fibonacciVetor[esi * TYPE fibonacciVetor]
    add eax, fibonacciVetor[esi * TYPE fibonacciVetor + 4]
    mov fibonacciVetor[esi * TYPE fibonacciVetor + 8], eax

最後の行があなたのファイル名を破壊するものかもしれないと思います.

Per Larsen のアドバイスに従い、デバッガーでステップ実行するか、いくつかの print ステートメントを追加します。うまくいけば、これにより、どこから探し始めるかがわかります。

于 2010-04-13T20:56:14.040 に答える
-1

推測ですが、定義の (Quant - 2) という用語が問題だと思います。ゼロの相対配列を使用する場合は (Quant - 1) と表示されますが、-2 を使用すると、最後の要素を配置するスペースが失われます。

-2を取り除くだけです。メモリは安価で十分です。結局のところ、KIM-1 をプログラミングしているわけではありません。

于 2010-04-13T20:56:36.243 に答える