Как запустить машинный код?

Не писать в ассемблере, а написать машинный код и запустить его.

Наверное будут вопросы "зачем" и "для чего" - ведь есть ассемблер или си. Ответ прост - just for fun.

Кстати, запустить код надо в линуксе (debian)
  • Вопрос задан
  • 5712 просмотров
Пригласить эксперта
Ответы на вопрос 4
gbg
@gbg Куратор тега Linux
Любые ответы на любые вопросы
Ставите dosbox
Пишите ваш код в любом шестнадцатеричном редакторе.
Сохраняете с расширением com
Запускаете.

Под linux без dosbox вам придется также научится формировать исполняемый файл формата ELF.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
$ cat > hello.S <<'EOF'
        .data
.Lhello:
        .ascii "Hello, world\n"

        .text
        .global _start
_start:
        movl    $1, %ebx
        leal    .Lhello, %ecx
        movl    $13, %edx
        movl    $4, %eax
        int     $0x80
        movl    $1, %eax
        xorl    %ebx, %ebx
        int     $0x80
EOF
$ gcc -m32 hello.S -nostdlib -o hello
$ ./hello
Hello, world
$


С голым машинным кодом будет сложнее, т.к. нужно будет согласовать адреса закодированные в нём с тем, что будет прописано в заголовках ELF. Можно сделать примерно такой исходник:
.text
        .global _start
_start:
.incbin "code"

в файл code поместить голый машинный код. Компилировать как в первом случае.
Как вариант можно дамп вставить прямо в ассемблер:
.text
        .global _start
_start:
        .byte 0xbb, 0x01, 0x00, 0x00, 0x00, 0x8d, 0x0d, 0xb8, 
        .byte 0x80, 0x04, 0x08, 0xba, 0x0d, 0x00, 0x00, 0x00, 
        .byte 0xb8, 0x04, 0x00, 0x00, 0x00, 0xcd, 0x80, 0xb8, 
        .byte 0x01, 0x00, 0x00, 0x00, 0x31, 0xdb, 0xcd, 0x80, 
        .byte 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 
        .byte 0x6f, 0x72, 0x6c, 0x64, 0x0a


Можно зайти с другой стороны и научить линукс выполнять голые бинарники. См. https://www.kernel.org/doc/Documentation/binfmt_mi...
Ответ написан
@Eddy_Em
Батенька, даже самые упоротые ардуйщики этим уже не помышляют! Как минимум на ассемблере пишут, но чаще на нормальном высокоуровневом языке.
А под ПеКа писать на машкодах — это ж BDSM чистой воды!
Ответ написан
dmitry-polushkin
@dmitry-polushkin
Инженер программного обеспечения
Ассемблер это тот же машинный код, только использующий команды, доступные для понимания человеком, которые в свою очередь просто "конвертируются" в машинный код, причём для разных процессоров в разные "числа". Таким образом, вы, конечно, можете открыть документацию intel-а по оп-кодам процессора, и начать ваять ваше творение в редакторе при помощи цифр, но вы быстро станете от этого уставать, т.к. будете постоянно забывать что означала предыдущая строка. Человек, всё же, не цифровое устройство, а использует систему символов на протяжении долгого времени. Таким образом людям гораздо проще понять друг друга при помощи символьной системы, а не системы цифр.

Читайте: www.intel.com/content/dam/www/public/us/en/documen...

Думаю, тоже самое существует в открытом доступе и для AMD, ARM, AVR и других типов процессоров.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы