2017-12-24 27 views
1

私は特定のプログラムをエミュレートするエミュレータに取り組んでいます。私はCOMファイルとソースファイルを持っています。 CLレジスタに017Bを相殺して、私はそれがDS(データ・セグメント)から値を移動することを意味知っているデータセグメントに何をロードする必要がありますか?

mov cl, [017B]  8A 0E 7B 01 

:今私は、この特定の命令を(これは私がDOSBoxをデバッガで見ることができるものである)をエミュレートする必要があります。しかし、何がDSにあるはずですか?私がエミュレートしようとしている

プログラム(ソースファイル):

.386p 

.model tiny 

code segment use16 
    assume cs:code 
    org 100h 

begin: 
    mov ax, 3h 
    int 10h 
... 
    mov cl, byte ptr ds:[keylen] <-- This is the instruction I'm talking about 
... 
    int 20h   

keylen db 13 
key1 db 20h, 3ah, 23h, 32h, 0bh, 3dh, 1fh, 13h, 4ch, 19h, 05h, 07h, 07h, 00h 
key2 db 00h, 0ah, 11h, 08h, 03h, 1dh, 1ah, 08h, 04h, 2ch, 3fh, 33h, 1ah, 41h 
key3 db 01h, 00h, 08h, 0bh, 0ch, 07h, 0ah, 05h, 02h, 09h, 06h, 03h, 04h, 00h 

code ends 
end begin 

私は私のプログラムを起動したとき、私はDSに何を保存する必要がありますか?私が今やっていると思うのは、設定することですDS = CS = ES = SS = SPECIFIC_ADDRESS

+4

100Hの組織とCOMプログラム(小さなモデルで')CS = DS = ES = SS =コントロールをコントロールに転送する前に、プログラムで使用しているPSPのセグメント。これは、COMにのみ適用されます(EXEではない) –

+0

これはあなたにいくつかの使用の可能性があります:http://www.fysnet.net/yourhelp.htm(さらに、PSPの構造、コードが 'cs:0000- cs:00FF 'の範囲)。 – Ped7g

+0

@MichaelPetch知っている、それはCOMプログラムです – Sk1X1

答えて

2

あなたが持っているような.COMプログラムの場合は、自分でセグメントレジスタを設定する必要はありません。オペレーティングシステムのプログラムローダーは、プログラムの開始点をすべて指し示しています。

指示mov cl, byte ptr ds:[keylen]はそのまま動作します。
セグメントを明示的に指定する必要はありません。 mov cl, byte ptr [keylen]またはmov cl, [keylen]と書くこともできます。

今、あなたは手動でDS segmentregisterを設定する上で主張すれば、あなたが書くことができる:

mov ax, cs 
mov ds, ax 

もう一つの方法は、次のようになります。

mov ah, 62h ;DOS.GetPSP 
int 21h  ; -> BX 
mov ds, bx 
+0

ありがとうございます。私はあなたが私の質問のポイントを得るか分からない。私はこのプログラムをエミュレートしようとしています。私はDSを指すべき場所を知っています。しかし、データセクション全体に何が含まれるべきかわかりません。 – Sk1X1

関連する問題