Название действительно говорит все. Один мой друг сказал мне, что он знает кого-то, кто может программировать в двоичном формате. Я никогда не слышал, чтобы кто-то программировал в двоичном формате, и несколько быстрых поисков Google не возвращали ничего полезного. Поэтому я решил, что обращусь к сообществу SO. У кого-нибудь есть информация о программировании в двоичном файле и, если возможно, может быть, быстрый пример Hello World. Спасибо заранее.
Можно ли программировать в двоичном формате?
Ответ 1
Конечно. Он обычно называется машинный код. Это в основном язык ассемблера без мнемонических устройств. Тот, кто знает сборку очень хорошо, может запрограммировать в машинный код дополнительные усилия, ссылаясь на списки опций (например, x86) по мере необходимости.
Я сделал бы это? Нет. Даже сборка полезна только в редких случаях, и нет причины (помимо демонстрации ваших навыков) отклонить assembler.
Поскольку вы спросили о мире привет, вы должны проверить эту статью. Он показывает, как он написал, а затем оптимизировал программу x86 ELF для ее вывода. Он был первоначально написан в nasm, затем был изменен в шестнадцатеричном редакторе.
Ответ 2
Ну, конечно, вы можете написать двоичный код для машинного кода, а затем ввести машинный код с помощью шестнадцатеричной клавиатуры в свой компьютер. Я собрал компьютер на основе TMS1100.
Простая программа для отображения 5 на шестнадцатеричном светодиоде будет 0001000 0000101 0000001, записанная в двоичном преобразовании в машинный код, который будет 8 5 1. Затем эта программа запустится и отобразит 5 на светодиоде.
Вы можете выполнить эту процедуру для более сложных программ с использованием TMS1100, и я думаю, что программирование в двоичном формате.
Собственно, я думаю, что это очень удовлетворительно и полезно, если вы заинтересованы в математике и программировании.
Ответ 3
Для храбрых сердец: вы можете попробовать получить образ гибкой MikeOS и запустить программу monitor.bin. Он позволяет вводить шестнадцатеричные коды операций вручную и выполнять их. Например (как указано в документах), введя следующие инструкции:
BE0790 E8FD6F C3 4D00$
будет выводить на экран один M
.
Ответ 4
Очень возможно запомнить машинный код эквивалент инструкций по сборке. На самом деле, при написании кода на ассемблере часто бывает, что шестнадцатеричный код через машинный код, disassembler s, списки сборки и т.д. В результате со временем некоторые инструкции могут быть запомнены в их шестнадцатеричной форме без каких-либо дополнительных усилий.
- На снимке отображается монитор ROM 6502, где шестнадцатеричный код и сборная мнемоника показаны рядом.
Второй навык, который вам понадобится, - это перевести шестнадцатеричный код в двоичный код с ума, что очень просто с трюком, который я объясню немного. Но очень легко запомнить двоичный эквивалент всех шестнадцатеричных цифр, из которых 16 из них, в конце концов (не так много, не так ли?).
Предположим, что это 1988 год, и мы потратили почти десять лет на портирование 8-битных видеоигр на разные платформы для жизни и, следовательно, запомнили следующие 6502 инструкции шестнадцатеричного кода, соответствующие инструкциям сборки:
OPCODE HEX
LDA #$44 0xA9 0x44
STA $44 0x85 0x44
STA ($44),Y 0x91 0x44
LDY #$44 0xA0 0x44
(Или в другой жизни, притвориться, что это 1974 год, наше имя - Пол Аллен, мы на самолете в Бостон, и нам нужно написать загрузчик для Altair 8800 с ручкой и бумагой)
Только с сохраненными выше опкодами мы можем написать следующий машинный код, используя только ручку и бумагу:
0xA9 0x00 0x85 0x01 0xA9 0x02 0x85 0x02 0xA0 0x00 0xA9 0x01 0x91 0x01
На самом деле выше приведен следующий код сборки в мнемонической форме:
LDA #00
STA $01
LDA #02
STA $02
LDY #00
LDA #01
STA ($01), Y
- Приведенный выше код помещает белый пиксель в верхнем левом углу экрана в 6502asm.com ассемблер/эмулятор, идите и попробуйте это!!
Если вы запомнили каждую шестую цифру в своей двоичной форме, вы могли бы написать весь код в двоичном формате.
Но если вы их не запомнили или не знаете, что такое двоичная форма, легко конвертировать их с помощью следующего трюка:
1 1 1 1
| | | |
v v v v
8 + 4 + 2 + 1
| | | +---> 2^0 * 1 Ex: 13 is 8 + 4 + 0 + 1
| | +-------> 2^1 * 1 1 1 0 1 -> 1101 (0xD)
| +-----------> 2^2 * 1 Ex: 7 is 0 + 4 + 2 + 1
+---------------> 2^3 * 1 0 1 1 1 -> 0111 (0x7)
Что помогает писать код в двоичном виде на лету:
LDA #00 -> 0xA9 0x00 -> 10101001 00000000
STA $01 -> 0x85 0x01 -> 10000101 00000001
LDA #02 -> 0xA9 0x02 -> 10101001 00000010
STA $02 -> 0x85 0x02 -> 10000101 00000010
LDY #00 -> 0xA0 0x00 -> 10100000 00000000
LDA #01 -> 0xA9 0x01 -> 10101001 00000001
STA ($01),Y -> 0x91 0x01 -> 10010001 00000001
С некоторым ретро-компьютерным духом и мотивацией получать удовольствие, мы могли бы написать весь код в двоичном формате, не записывая промежуточные шаги.
Ответ 5
Нет никакого большого вызова для этого, но это было сделано. Было время, когда код мог быть введен в систему в двоичном формате с передней консоли. Это была ошибка.
У меня была очень короткая программа uudecoe, закодированная в ASCII, которая может быть префиксами в файл UUEncoded. Полученный файл будет самораспаковывающимся и может быть отправлен по электронной почте. Я бы ожидал, что машинный код будет выполнен вручную. Я не могу найти его и не могу использовать, даже если бы мог.
Ответ 6
Есть некоторые эзотерические языки программирования. Они используются в качестве экспериментов и довольно непрактичны, но один, называемый BrainF ** k (да, это на самом деле реально) использует восемь разных символов для изменения значений байтов. Эти языки находятся примерно так же близко, как вы можете.