-1
B8 00 B8 8E E8 B4 00 CD 16 65 88 00 EF F2

プログラムは最初は16バイトでしたが、不安定な入力位置を優先して2バイトを犠牲にすることにしました。以前のバージョン(0 0の位置)は次のとおりです。

65 88 06 00 00

次に、可能な候補は次のとおりです。

EF F2 -> 
C3 ->
CF..CB..CC..CE

それらの1バイトの人も助っ人ではありませんでした。私のかすかな考えは、セグメントコンポーネントを変更する(使用しない)ことです。65を削除し、デフォルトのデータセグメントを使用します。残念ながら、うまくいかないようです。

私が間違っているのは何ですか?昨日、モジュールを13バイトサイズに縮小しましたが、これまでのところ不安定で、すべてのシンボルが別々の画面位置に表示されていました。

4

1 に答える 1

0

それは明らかに 16 ビットのリアル モード x86 コード、DOS 用の .com ファイル、またはその他のフラット バイナリです。

$echo 'B8 00 B8 8E E8 B4 00 CD 16 65 88 00 C3' | udcli -x -16

0000000000000000 b800b8           mov ax, 0xb800          
0000000000000003 8ee8             mov gs, ax              
0000000000000005 b400             mov ah, 0x0             
0000000000000007 cd16             int 0x16                
0000000000000009 658800           mov [gs:bx+si], al      
000000000000000c c3               ret

現在のテキスト ビデオ モードで使用されているビデオ メモリ領域を指すように、bxsiがいくつかの許容可能な値を持っていると想定しています。0xb800:bx+si可能ですが、お勧めしません。

いずれにせよ、レジスタ値の仮定がまだ許可されている場合は、少なくとも 4 バイト短くすることができます。それが有用な値 (上記を参照) を持っているbxと仮定できる場合は、おそらくそれも、現在のテキスト ビデオ モードで使用されているビデオ メモリ領域を指しています。sidi0xb800:di

00000000  B800B8            mov ax,0xb800
00000003  8EC0              mov es,ax
00000005  98                cbw
00000006  CD16              int 0x16
00000008  AA                stosb
00000009  C3                ret

最初に設定ax0xb800て保存しesます (いくつかの BIOS テキスト ビデオ モードのセグメント アドレス)。

al次に、バイト(0) を wordに変換し、axの符号ビットを に拡張するalaxax= 0 になります。

次に、BIOS キーボード割り込みint 16h( ah= 0) を使用して、キーボードからの入力を読み取ります (必要に応じて入力を待ちます)。にASCIIコード、alにスキャンコードah

最後に ASCII コードをビデオ メモリに保存し ( に[es:di]) stosb、文字を画面に出力し、 で DOS (または任意の OS) に戻りretます。

編集:実際には、サイズを 12 バイトに落としても、次のような安定した出力アドレスを保持することが可能です:

00000000  6800B8            push word 0xb800
00000003  1F                pop ds
00000004  31C0              xor ax,ax
00000006  CD16              int 0x16
00000008  A20000            mov [0x0],al
0000000B  C3                ret

お役に立てれば。

于 2013-01-09T19:56:15.270 に答える