2

emu8086を使用しています。ヘキサ入力から変換した後、7 セグメント ディスプレイに表示されるものを表示するように依頼された質問があります。データを 16 進数で入力する必要があります。7 セグメント テーブルの 16 進数の入力と一致する場合は、10 進数で表示されます。3FH = 0, 06H = 1. 配列を使用してこのプログラムを実装しています。以下は、作業用ソース プログラムです。

ORG 100H     

MOV AL,[1840H]   ;input in this memory location
MOV CL,0AH       ; initialize length counter
   
AGAIN:  CMP AL,MSG+BX     ; compare to check if the data matches
        JE RESULT         ; jump to RESULT if data matched
        INC BX            ; increase decimal output by 1 if data not matched
LOOP AGAIN

MOV [1841H],0FFH          ; display FF if no data matched the array

HLT

MSG DB 3FH, 06H, 5BH, 4FH,66H, 6DH,7DH,07H,7FH,6FH        ; my array with hexa inputs

RESULT: MOV [1841H],BL                 ; display data if matched

私はこのプログラムを動かしていました。MSG DB 3FH...しかし、私は自分の配列を afterORG 100Hと beforeの位置に切り替える何かを試しましMOV AL,[1840H]た。プログラムを実行するとエラーメッセージが表示されます

「不明なオペコードがスキップされました: 66、8086 命令ではありません - まだサポートされていません」.

理由がわかりません。

ORG 100H配列をとの間に保持する場合、プログラムが機能するように何かを修正できMOV AL,[1840H]ますか?

4

1 に答える 1

6

データ配列MSGを最初の命令の前に移動することで、効果的に emu8086 に実行を依頼したことになります。MSGの最初のバイトは、有効な 8086 命令 ( AASPUSH ESPOP BX、およびDEC DI) に対応しますが、5 番目のバイトは、8086 プロセッサでは使用できないオペランド サイズのプレフィックスを表します。

問題をすばやく解決するには、MSGにジャンプするだけです:

  ORG 100H
  jmp start
MSG DB 3FH, 06H, 5BH, 4FH,66H, 6DH,7DH,07H,7FH,6FH
start:

しかし、元のようにコードの後に​​置く方がさらに良いので、そもそも邪魔になりません。jmp他の人がファイルを編集できるようにバイナリの標準的な場所に配置したい場合を除き、プログラムの最初の命令をそこにコードを配置するだけでよい場合は、利点はありません。(.com実行可能ファイルには、エントリーポイントがどこにあるかをプログラムローダーに伝えるためのメタデータがありません。ファイルの最初のバイトである IP=100h に固定されています。)

いくつかの観察

  • ではLOOP AGAINLOOP命令はレジスタ全体に依存しますが、CXを介して下位 8 ビットのみを初期化しましMOV CL,0AHた。
  • コードもBXレジスタを使用して配列にインデックスを付けていますが、ゼロBXにしたことがないため、プログラムが正常に動作するかどうかはわかりません。
  • ではMOV [1841H],0FFH、このイミディエートをメモリ ロケーションに書き込むときに、デフォルトでバイト サイズになる emu8086 に依存しているようです。のように、必要なサイズを常に課すことをお勧めしますmov byte ptr [1841h], 255
  • 私を混乱させるのは、 に角括弧がないことですCMP AL,MSG+BX。、、で角括弧を使用するのと同じように
    書くべきではありませんか? MASM (emu8086 は MASM スタイル) での角括弧の使用に関するさらに混乱 (およびいくつかの明確化) については、この Ross Ridge answerをお読みください。cmp al, [MSG+BX]mov AL, [1840H]MOV [1841H],0FFHMOV [1841H],BL

改訂されたプログラムの私のバージョン:

  ORG  256
  jmp  start

msg db 3Fh, 06h, 5Bh, 4Fh, 66h, 6Dh, 7Dh, 07h, 7Fh, 6Fh

start:
  mov  al, [1840h]
  xor  bx, bx        ; ArrayIndex (offset)
again:
  cmp  al, [msg+bx]
  je   result
  inc  bx
  cmp  bx, 10        ; NumberOfElements
  jb   again
  mov  bl, -1
result:
  mov  [1841h], bl   ; display ARRAYINDEX if matched else display FF
  hlt

関連/重複:

于 2014-10-05T14:50:15.620 に答える