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

Как я мог написать "hello world" в двоичном формате?

Предположим, я хотел написать программу для отображения "hello world", и я хотел написать ее в двоичном формате. Как я могу это сделать?

У меня есть идея, что:

  • Мне нужно определить, какую архитектуру чипа я использую
  • Мне нужно выяснить, какой тип бинарного файла он использует.
  • Мне нужна ссылка на этот вкус двоичных файлов
  • Мне может потребоваться изменить настройку в моем редакторе (Vim)

Может ли кто-нибудь пройти меня через это?

4b9b3361

Ответ 1

Это немного сложнее, потому что на самом деле печать "Привет, мир!" to stdout - системный вызов, поэтому вам нужно знать правильный номер syscall ядра. Это, конечно, зависит от операционной системы. Также вам нужно знать двоичный формат, который также имеет тенденцию меняться, хотя ELF (Исполняемый и Связываемый формат) универсален в нескольких вариантах Unix и Linux.

Смотрите Привет, мир! в ассемблере.

Это код ассемблера Linux:

section .text
    global _start           ;must be declared for linker (ld)

_start:                 ;tell linker entry point

    mov edx,len ;message length
    mov ecx,msg ;message to write
    mov ebx,1   ;file descriptor (stdout)
    mov eax,4   ;system call number (sys_write)
    int 0x80    ;call kernel

    mov eax,1   ;system call number (sys_exit)
    int 0x80    ;call kernel

section .data

msg db  'Hello, world!',0xa ;our dear string
len equ $ - msg         ;length of our dear string

..., который на 32-битной Linux компиляции приводит к бинарности 360 байтов, хотя в основном это нули:

00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 03 00 01 00 00 00  80 80 04 08 34 00 00 00  |............4...|
00000020  c8 00 00 00 00 00 00 00  34 00 20 00 02 00 28 00  |........4. ...(.|
00000030  04 00 03 00 01 00 00 00  00 00 00 00 00 80 04 08  |................|
00000040  00 80 04 08 9d 00 00 00  9d 00 00 00 05 00 00 00  |................|
00000050  00 10 00 00 01 00 00 00  a0 00 00 00 a0 90 04 08  |................|
00000060  a0 90 04 08 0e 00 00 00  0e 00 00 00 06 00 00 00  |................|
00000070  00 10 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000080  ba 0e 00 00 00 b9 a0 90  04 08 bb 01 00 00 00 b8  |................|
00000090  04 00 00 00 cd 80 b8 01  00 00 00 cd 80 00 00 00  |................|
000000a0  48 65 6c 6c 6f 2c 20 77  6f 72 6c 64 21 0a 00 2e  |Hello, world!...|
000000b0  73 68 73 74 72 74 61 62  00 2e 74 65 78 74 00 2e  |shstrtab..text..|
000000c0  64 61 74 61 00 00 00 00  00 00 00 00 00 00 00 00  |data............|
000000d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000000f0  0b 00 00 00 01 00 00 00  06 00 00 00 80 80 04 08  |................|
00000100  80 00 00 00 1d 00 00 00  00 00 00 00 00 00 00 00  |................|
00000110  10 00 00 00 00 00 00 00  11 00 00 00 01 00 00 00  |................|
00000120  03 00 00 00 a0 90 04 08  a0 00 00 00 0e 00 00 00  |................|
00000130  00 00 00 00 00 00 00 00  04 00 00 00 00 00 00 00  |................|
00000140  01 00 00 00 03 00 00 00  00 00 00 00 00 00 00 00  |................|
00000150  ae 00 00 00 17 00 00 00  00 00 00 00 00 00 00 00  |................|
00000160  01 00 00 00 00 00 00 00                           |........|

Поскольку вы хотите "скомпилировать вручную", это в основном означает перевод метамотонов ассемблера выше их кодов операций, а затем завершение результата в правильный двоичный формат (ELF в приведенном выше примере)

UPDATE: как этот ответ показывает @adam-rosenfield, двоичный файл ELF для "Hello, world!". может быть вручную до 116 байт.

Здесь 32-байтная версия с использованием системных вызовов Linux:

 .globl _start
_start:
        movb $4, %al
        xor %ebx, %ebx
        inc %ebx
        movl $hello, %ecx
        xor %edx, %edx
        movb $11, %dl
        int $0x80               ;;; sys_write(1, $hello, 11)
        xor %eax, %eax
        inc %eax
        int $0x80               ;;; sys_exit(something) hello:
        .ascii "Hello world" 

При компиляции в минимальный ELF файл полный исполняемый файл - 116 байт:

 00000000  7f 45 4c 46 01 01 01 00  00 00 00 00 00 00 00 00 
|.ELF............| 00000010  02 00 03 00 01 00 00 00  54 80 04 08 34
00 00 00  |........T...4...| 00000020  00 00 00 00 00 00 00 00  34 00
20 00 01 00 00 00  |........4. .....| 00000030  00 00 00 00 01 00 00
00  00 00 00 00 00 80 04 08  |................| 00000040  00 80 04 08
74 00 00 00  74 00 00 00 05 00 00 00  |....t...t.......| 00000050  00
10 00 00 b0 04 31 db  43 b9 69 80 04 08 31 d2  |......1.C.i...1.|
00000060  b2 0b cd 80 31 c0 40 cd  80 48 65 6c 6c 6f 20 77 
|[email protected] w| 00000070  6f 72 6c 64                              
|orld| 00000074 

Ответ 2

Обычно для этого используется шестнадцатеричный редактор. Выделите код сборки, вручную соберите его, используйте шестнадцатеричный редактор, чтобы ввести двоичные значения, а затем сохраните их в файл. После того, как у вас есть файл, зайдите в монитор компьютера и загрузите файл по доступному адресу, а затем перейдите к первой инструкции. Это была довольно распространенная практика на одноплатных компьютерах и по-прежнему выполняется на микроконтроллерах сегодня, но это не то, что вы собираетесь делать на современной ОС. Если вы действительно хотите это сделать, я бы рекомендовал запустить эмулятор низкого уровня (SIMH будет работать) или работать с микроконтроллером ( вы можете получить комплект разработчика TI MSP430 для менее пяти долларов).