Уменьшение размера видит то, что вы печатаете программу

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

Один-byters были также без помощников. Моя слабая мысль должна измениться (не, используют), компонент сегмента. Удалите 65 и используйте сегмент данных по умолчанию. К сожалению, кажется, что это не работает.

Что я делаю неправильно? Вчера я уменьшил свой модуль к 13 байтам размером, хотя это было нестабильно до сих пор, что каждый символ появился в отдельном положении экрана.

1
nl ja de
1/Этот вопрос должен быть помечен “набор из двух предметов”, не “собрание”. 2/Без системы команд, невозможно сказать то, что делают эти коды. Этот код PowerPC? MIPS? РУКА? 16 битов x86? 32 бита x86? x86_64?
добавлено автор Pascal Cuoq, источник
1/Этот вопрос должен быть помечен “набор из двух предметов”, не “собрание”. 2/Без системы команд, невозможно сказать то, что делают эти коды. Этот код PowerPC? MIPS? РУКА? 16 битов x86? 32 бита x86? x86_64?
добавлено автор Pascal Cuoq, источник

2 ответы

Ну, это - ясно 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

Надежда это помогает.

0
добавлено

Ну, это - ясно 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

Надежда это помогает.

0
добавлено