0

やあみんな私がこれをすべて正しい方法で行っているかどうかはわかりません。フィボナッチ数列の最初の12の数は、それがすでに実行していることを計算するために必要です。しかし、今度は、dumpMemを使用して、プログラムで(Fibonacci)の16進数の内容を表示する必要があります。プリントアウトする必要があります:01 01 02 03 05 08 0D 15 22 37 59 90

しかし、私は取得しているだけです:01 01 00 00 00 00 00 00 00 00 00 00

ヒントやヘルプは大歓迎です。

 INCLUDE Irvine32.inc
.data

reg DWORD -1,1,0                    ; Initializes a DOUBLEWORD array, giving it the values of -1, 1, and 0
array DWORD 48 DUP(?)
Fibonacci BYTE 1, 1, 10 DUP (?) 



.code
main PROC
       mov array, 1
       mov esi,OFFSET array ; or should this be Fibonacci?
       mov ecx,12
       add esi, 4


    L1:
        mov edx, [reg]
        mov ebx, [reg+4]
        mov [reg+8], edx
        add [reg+8], ebx                    ; Adds the value of the EBX and 'temp(8)' together and stores it as temp(8) 
        mov eax, [reg+8]                    ; Moves the value of 'temp(8)' into the EAX register        
        mov [esi], eax                      ; Moves the value of EAX into the offset of array
        mov [reg], ebx                      ; Moves the value of the EBX register to 'temp(0)' 
        mov [reg+4], eax                    ; Moves the value of the EAX register to 'temp(4)
        add esi, 4

       ; call DumpRegs
        call WriteInt
        loop L1

        ;mov ebx, offset array
        ;mov ecx, 12

        ;L2: 
        ;mov eax, [esi]
        ;add esi, 4
        ;call WriteInt
        ;loop L2

  ;Below will show hexadecimal contents of string target-----------------
   mov   esi, OFFSET Fibonacci      ; offset the variables
   mov   ebx,1                      ; byte format
   mov   ecx, SIZEOF Fibonacci      ; counter
   call  dumpMem 


exit
main ENDP

END main
4

2 に答える 2

2

dumpMemの呼び出しは正しいですが、プログラムは計算結果を正しい場所に保存していません。「フィボナッチ」と呼ぶ領域は、1、1、および10個のゼロに初期化されたままです。ループがフィボナッチプラス2のオフセットで書き込みを開始し、1バイト単位で10回移動することを確認する必要があります(初期化子で2つの初期項目を指定したため、12ではなく10)。

申し訳ありませんが、「フィボナッチ」という単語を含む質問は必然的に誰かの宿題であることが判明するため、これ以上具体的にすることはできません:-)

于 2011-11-28T21:51:23.243 に答える
2

ここでの問題は、フィボナッチ数列の計算にあるように思われます。そのためのあなたのコードは私を幾分...困惑させます。そこにはたくさんの「もの」があり、それはフィボナッチ数(たとえば)の計算とは何の関係もないようですregが、他の人はそうすることができますが、それらを使って何をしようとしているのか本当にわからないようです。

シーケンスを計算するためにループを見ると、実際に私に飛びつく最初のことは、メモリを頻繁に使用しているということです。アセンブリ言語を作成するときの最初の(そして最も重要な)ことの1つは、レジスタの使用を最大化し、メモリの使用を最小化することです。

ヒントとして、シーケンスを計算するときにコースでメモリから何かを読み取る場合は、おそらく間違いを犯していると思います。レジスタですべての計算を実行できるはずなので、メモリ参照は結果の書き込みのみになります。(明らかに)バイトサイズの結果のみを生成しているため、結果を保持するために必要なのは、適切なバイト数の配列を1つだけにする必要があります(つまり、生成する数値ごとに1バイト)。

これがアセンブリ言語にどれほどうまく適応できるかを示す小さなルーチンを書きたくなりますが、おそらくそうすべきではないと思います...

于 2011-11-28T21:51:44.023 に答える