Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Программа с именем 0xFF

В ДОСе, как может кто-то ещё помнит, была своя, отличная от всего, кодировка русских букв, так называемая CP866. Это однобайтовая кодировка, то есть в таблице символов всего 256 позиций.

Поэтому странно, что пробельных символов в ней два, один из них — обычный пробел с кодом 32, именно его операционная система считает пробелом, второй — с кодом 255, он выводится как пробел, но считается обычным символом.

Не помню, использовалось ли это свойство для чего-то полезного или интересного, но на днях прочитал как развлекались с его помощью в те времена:

А 255 символ запретили? 30 лет назад, еще под MSDOS, переименовали утилиту переворота экрана в 255 символ и вставили в autoexec.bat. Хозяин компа уже психовать начал и монитор переворачивать :)) Показали ему прикол…

Ну то есть переименовали программу так, чтобы её имя выглядело как пробельный символ и добавили её в скрипт автозагрузки. Хозяин компьютера, видимо, проверял скрипт, ничего не находил и не понимал что происходит.

Мне стало интересно проверить — действительно ли это работает? Благо ДОС можно сейчас запустить даже в браузере.

Тут надо пояснить, что «настоящий» пробел для этого не годится — ДОС просто не распознает его в автозагрузке как имя файла для запуска.

Я не знаю как раньше вводили символ с кодом 255 в командную строку, поэтому просто набросал программу на ассемблере, которая переименовывает файл mem.exe (которая обычно есть в составе ДОСа) в  .com:

org 100h

section .data
    oldName db 'MEM.EXE', 0
    newName db 255, '.COM', 0

section .text
global _start

_start:
    mov ah, 56h
    lea dx, oldName
    lea di, newName
    int 21h

    mov ax, 4C00h
    int 21h

Необходимое пояснение: расширение обязательно, иначе ДОС не поймёт, что файл запускаемый. При запуске его можно не указывать — операционка догадается сама что именно подставить.

На следующем шаге я скомпилировал программу у себя прямо в «МакОСи» и вывел в шестнадцатеричном виде:

$ hexdump -C <(nasm -f bin rename.asm -o /dev/stdout)
00000000  b4 56 8d 16 14 01 8d 3e  1c 01 cd 21 b8 00 4c cd  |.V.....>...!..L.|
00000010  21 00 00 00 4d 45 4d 2e  45 58 45 00 ff 2e 43 4f  |!...MEM.EXE...CO|
00000020  4d 00                                             |M.|
00000022

Далее набрал её в кодах при помощи команды DEBUG и запустил. В текущей директории появилась программа с нужным именем:

Для последнего шага мне нужно было как-то снова получить символ 255 в командной строке. Для этого я перенаправил вывод команды DIR в файл START.BAT и отредактировал получившееся при помощи команды EDIT — убрал всё лишнее, кроме символа с именем команды (кажется у меня в файл попали ещё и лишние переводы строки, но они роли не играют).

Попробовал запустить, сработало!

4 комментария
Дмитрий Смирнов 19 дн

Какая красота!

hsh 19 дн

Далее набрал её в кодах при помощи команды DEBUG и запустил.

Шёл 2к24, перфокарты всё ещё не изобрели.

Itcheck 19 дн

Символ с кодом 255, в DOS (также, как и сейчас) вводили как ALT+255 (на цифровой клавиатуре).
Это работает и для других символов.

Евгений Степанищев 19 дн

Разве это не только в Винде? В любом случае, цифровой клавиатуры у меня нет.

Itcheck 18 дн

Как раз в Винду это и пришло из DOSa, там частенько этим приходилось пользоваться.

Евгений Степанищев 18 дн

Способ я помнил, но думал он только для Винды. Как бы то ни было, цифровой клавиатуры у меня нет, а на основной не срабатывало.