それは明らかに 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
現在のテキスト ビデオ モードで使用されているビデオ メモリ領域を指すように、bx
とsi
がいくつかの許容可能な値を持っていると想定しています。0xb800:bx+si
可能ですが、お勧めしません。
いずれにせよ、レジスタ値の仮定がまだ許可されている場合は、少なくとも 4 バイト短くすることができます。それが有用な値 (上記を参照) を持っているbx
と仮定できる場合は、おそらくそれも、現在のテキスト ビデオ モードで使用されているビデオ メモリ領域を指しています。si
di
0xb800:di
00000000 B800B8 mov ax,0xb800
00000003 8EC0 mov es,ax
00000005 98 cbw
00000006 CD16 int 0x16
00000008 AA stosb
00000009 C3 ret
最初に設定ax
し0xb800
て保存しes
ます (いくつかの BIOS テキスト ビデオ モードのセグメント アドレス)。
al
次に、バイト(0) を wordに変換し、ax
の符号ビットを に拡張するal
とax
、ax
= 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
お役に立てれば。