2

フィボナッチ数列の最初の 20 の数を 20 要素のベクトルに書き込む必要がある演習を実行しようとしましたが、コードが正しく機能しない理由がわかりません。シリーズの最初の 10 個の要素で機能しますが、認識できない問題があります。どう思いますか?これは私が書いたコードです:

DIM EQU 20
COUNT EQU 18
.model small
.stack
.data

 vect dw DIM dup ?

.code
.startup

mov ax,1
mov bx,1
mov cx,COUNT

lea si,vect

mov [si],1
add si,2

ciclo: mov [si],bx
       mov dx,bx
       add bx,ax
       mov ax,dx
       add si,2
       LOOP ciclo

 .exit
 end

アップデート

プログラムに表示されているとおりにコードを貼り付けませんでした。私が実行しているプログラムは次のように始まります。

ORG 100h

重要だとは思わなかったので省略。大切ですか?

元のコードをデバッグすると、次のようになります。に足を踏み入れciclo: mov [si],bxます。CXには 8 が含まれています。

ここに画像の説明を入力

シングルステップすると、プログラムが終了し、次PROGRAM HAS RETURNED CONTROL TO THE OPERATING SYSTEMの図に示すように表示されます。

ここに画像の説明を入力

なぜこうなった?

4

2 に答える 2

3

コードが失敗する理由は、元のコードの先頭にこれがあるためです。

ORG 100h

EMU8086 では、プログラムを DOS COM プログラム (DOS EXE プログラムではない) として作成するという副作用があります。COM プログラムの場合 - データをコードの前に置くと、文字通り DATA をコードとして実行し始めます。あなたの場合、vect配列内のガベージの実行を開始し、実際のコードを実行しようとしました (成功しませんでした)。これが、実行時と EMU8086 を介したデバッグ時の両方でプログラムが示すすべての奇妙な動作の原因です。

明らかにデータ領域があり、スタックをorg 100h一番上から削除するだけで、EMU8086 がコードを DOS COM プログラムではなく DOS EXE として実行できるようになります。


.stackDOS COM プログラムを作成する場合は、ディレクティブを削除する必要があります。最後の実行可能なコード部分の後にセグメントを移動します。dataこの場合、それは によって作成されたコードです.exit。これにより、DOS がプログラムを最初から起動するときに、DATA がコードとして実行されなくなります。これは、EMU8086 の DOS EXE プログラムの問題ではありません。

DIM EQU 20
COUNT EQU 18 

org 100h             ; COM programs are placed 256 from beginning of
                     ; of segment so we need ORG 100h. This
                     ; also informs EMU8086 you want to make a COM program
                     ; and not an EXE program.

                     ; No Stack specified for a COM program as DOS
                     ; automatically places it at the top of the 64K segment
                     ; and grows downward toward the code and data.

.model tiny          ; Normally COM programs are TINY model (CS=DS=SS) 

.code
.startup             ; This isn't needed for COM programs but won't hurt.

mov ax,1
mov bx,1
mov cx,COUNT

lea si,vect

mov word ptr [si],1 ; To avoid a bug we want to update the WORD at [si]
                    ; not the BYTE.
add si,2


ciclo: mov [si],bx
       mov dx,bx
       add bx,ax
       mov ax,dx
       add si,2
       LOOP ciclo
       .exit        ; Program exits here

.data               ; Place the data after the code for a COM program

 vect dw DIM dup ?

end
于 2016-04-21T17:17:37.467 に答える
0

あなたのコードを EMU8086 でテストしたところ、2 つの小さな間違いが見つかりましcodeた。データ セグメントの前にドットと初期化があります。これが修正されたコードです:

DIM EQU 20
COUNT EQU 18
.model small
.stack
.data

 vect dw DIM dup ?

.code                          ;<=================================
.startup
mov ax, @data                  ;<=================================
mov ds, ax                     ;<=================================

mov ax,1
mov bx,1
mov cx,COUNT

lea si,vect

mov [si],1
add si,2

ciclo: mov [si],bx
       mov dx,bx
       add bx,ax
       mov ax,dx
       add si,2
       LOOP ciclo

 .exit
 end

次のスクリーンショットは、修正によりプログラムがうまく機能することを証明しています (右下のフィボナッチ数を参照してください)。

ここに画像の説明を入力

于 2016-04-21T15:24:12.873 に答える