2017-03-19 1 views
-1

私は8086プログラムを書いていましたが、それはうまくいきますが、変数を宣言する部分に来るとエミュレータからエラーが出ます。ラインtemp db 0x0Fを実行しようとすると、エミュレータは言う:エラー:「未知のオペコードはスキップされました:32」

unknown opcode skipped: 32

not 8086 instruction - not supported yet.

ここに私の完全なプログラムがあります:

org 100h 
mov ah, temp ;put variables into registers 
mov al, changed 
mov dx, result 
lea bx, temp ;get address of temp and put into bx 
add dx, [bx] ;add value at the address in bx to result 
lea bx, changed ;get address of changed and put into bx 
add dx, [bx] ;add value at the address in bx to result 
temp db 0x0F ;declare and initialize variables 
changed db 32h 
result dw 0 

はどのようにプログラム機能、およびどのように私はそれを修正しますと、この必然的ですか?

EDIT:sigjuiceは問題を解決しました。コメントでわかるように。ここでは、正しく動作するプログラムの最終バージョンがあります:あなたのプログラムのこの部分で

.CODE 
org 100h 
mov ah, temp ;put variables into registers 
mov al, changed 
mov dx, result 
lea bx, temp ;get address of temp and put into bx 
add dx, [bx] ;add value at the address in bx to result 
lea bx, changed ;get address of changed and put into bx 
add dx, [bx] ;add value at the address in bx to result 
.DATA 
temp db 0x0F ;declare and initialize variables 
changed db 32h 
result dw 0 
+0

プログラムをアセンブルしてリンクするためのコマンドは何ですか?使用しているエミュレータは何ですか? – sigjuice

+0

@sigjuice私は[emu8086](http://www.emu8086.com/)でこれをやっています。あなたのコメントは私が前に知らなかった、使用していないアセンブラ指示を発見するようになった。 '.CODE'と' .DATA'アセンブラディレクティブを追加すると、問題が修正されたようです。どうもありがとうございました。 – tagurit

+0

あなたは大歓迎です!正常に実行されるプログラムの最終バージョンを含めた場合、他の人には役に立ちえることをお勧めしますか? – sigjuice

答えて

1
add dx, [bx] ;add value at the address in bx to result 
temp db 0x0F ;declare and initialize variables 

それは命令であるかのように一時ラベルでデータを実行するから、CPUを停止し、何もありません。

.CODE.DATAアセンブラディレクティブ(おそらく@sigjuiceで示唆されている)を追加しても明らかにこの問題が解決されますが、これは通常.COM実行可能ファイルを書くときに使用するものではありません。 org 100h指示文を使用したため、.COM実行可能ファイルです。

プログラムが本当に必要とするのは、オペレーティングシステムに戻る方法です。これはEMU8086なので、DOS.TerminateWithReturncode関数を使用することをお勧めします。

add dx, [bx] ;add value at the address in bx to result 
       ; Exit to the operating system 
mov ax, 4C00h ;AH=4Ch function number, AL=0 exitcode (0 most often means OK) 
int 21h  ;DOS system call 
       ; Now beyond this point nothing gets executed inadvertently 
temp db 0Fh  ;declare and initialize variables 

この方法は、プログラムが起動したときに彼らがいたとしてSS:SPレジスタが設定されていることが必要ですので、私は本当に、単なるret命令を使用してオペレーティング・システムに戻すためにアドバイスすることはできません。これは常にそうであるとは限りません。特定のレジスタ設定に依存しないこのDOS機能を使います。


lea bx, temp ;get address of temp and put into bx 
add dx, [bx] ;add value at the address in bx to result 
lea bx, changed ;get address of changed and put into bx 
add dx, [bx] ;add value at the address in bx to result 

あなたの元の問題でなく、ボーナスとしては何の関係もありません:

一時は、両方のバイトサイズ変数、ワードサイズ追加されている変更したため単に変数をだけ追加するのではなく、メモリ内でそれに続くバイトも追加してください。!時にはこれは意図的なものです(私は確かにこれがここに当てはまるのではないかと疑っています)が、あなたはこれを理解する必要があります。

関連する問題