Подтвердить что ты не робот

Можно ли программировать в двоичном формате?

Название действительно говорит все. Один мой друг сказал мне, что он знает кого-то, кто может программировать в двоичном формате. Я никогда не слышал, чтобы кто-то программировал в двоичном формате, и несколько быстрых поисков Google не возвращали ничего полезного. Поэтому я решил, что обращусь к сообществу SO. У кого-нибудь есть информация о программировании в двоичном файле и, если возможно, может быть, быстрый пример Hello World. Спасибо заранее.

4b9b3361

Ответ 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. Hexadecimal code

Ответ 4

Очень возможно запомнить машинный код эквивалент инструкций по сборке. На самом деле, при написании кода на ассемблере часто бывает, что шестнадцатеричный код через машинный код, disassembler s, списки сборки и т.д. В результате со временем некоторые инструкции могут быть запомнены в их шестнадцатеричной форме без каких-либо дополнительных усилий.

Apple II 6502 ROM Monitor

  • На снимке отображается монитор 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 (да, это на самом деле реально) использует восемь разных символов для изменения значений байтов. Эти языки находятся примерно так же близко, как вы можете.