Ну, это - ясно 16-битный x86-код реального режима, .com файл для DOS или другого плоского набора из двух предметов.
$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
Это предполагает, что основной обмен
и , у СИ
есть некоторые приемлемые ценности, так, чтобы 0xb800:bx+si
указал на регион видеопамяти, что это используется режимом видео текущего текста. Ну, это возможно, но я не рекомендовал бы его.
Так или иначе это может быть сделано на по крайней мере 4 байта короче, если предположения на значениях регистра все еще позволены. Если можно предположить, что основной обмен
и , у СИ
есть полезные ценности (см. выше), то 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
Сначала набор топор
к 0xb800
и магазин это, чтобы es
(адрес сегмента нескольких текстовых режимов видео BIOS).
Тогда преобразуйте байт al
(0) к слову топор
, расширив знаковый бит al
, чтобы топор
, приведя к топор
= 0.
Тогда прочитайте вход с клавиатуры (и ждите входа, при необходимости) с перерывом клавиатуры BIOS интервал, 16-й
( ах
= 0). Код ASCII в al
, отсканируйте код в ах
.
Наконец сохраните код ASCII к видеопамяти (чтобы [es:di]
) с stosb
, чтобы напечатать характер на экране и возвратиться к DOS (или безотносительно OS) с мочат
.
Edit: Actually it is possible to drop the size to 12 bytes and still have a stable output address, with something like this:
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
Надежда это помогает.