LINUX.ORG.RU

hello word без компилятора

 


4

3

здрасьте здрасьте люди добрые. научите пожалуйста, что нужно чтобы написать программку в двоичном коде и запустить ее на выполение без обработки компилятором. в каком формате должен быть исполняемый файл?


 10e88 15000000 00000000 00000000 00000000  
 10e98 03000000 00000000 e80f0100 00000000  
 10ea8 02000000 00000000 60000000 00000000  
 10eb8 14000000 00000000 07000000 00000000

или так не получится?

Ответ на: комментарий от EXL

спасибо огромное за ссылку. но скажите а можно ли совсем обойтись без компилятора? поймет ли bios мою писанину не обработанную компилятором? то есть я хочу написать программку в машинных кодах, и запистить с помощью bios. ключевая фраза без компилятора.

Assembler
() автор топика
Ответ на: комментарий от Assembler

Можно, но в этом нет абсолютно никакого смысла.

$ echo '7f454c46010101486920576f726c640a0200030001000000808004083400000000b804000000cd80eb582000020028000500040001000000000000000080040800800408a2000000a2000000050000000010000001000000a4000000a4900408a49004080900000009000000ba09000000b907900408bb01000000eba4000000ebeabb00000000b801000000cd80' | xxd -r -p - > test

$ chmod +x test

$ ./test
Hi World
EXL ★★★★★
()
Ответ на: комментарий от Assembler

Расширение не нужно, достаточно, чтобы был атрибут исполняемого файла, в данном случае оно как раз устанавливается командой chmod +x test.

hobbit ★★★★★
()
Ответ на: комментарий от wandrien

А это не ко мне вопрос, в ОП, кстати, про биос не было, он потом всплыл.

hobbit ★★★★★
()
Ответ на: комментарий от Assembler

Классический биос ничего не понимает, он просто кладет 512 байт из mbr по адресу 7c00h и джампит туда (другие детали сам нагуглишь). Уефи загрузчик не знаю как работает.

anonymous
()

в каком формате должен быть исполняемый файл?

Исполняемый файл должен быть в том формате, который понимает и умеет запускать на выполнение загрузчик.

или так не получится?

Напишите свой загрузчик-пускальщик, и получится.

anonymous
()
Ответ на: комментарий от Assembler

Для BIOS в теории ещё проще – ему не нужен ELF-header, и вроде как опкоды должны там быть из мира 16-bit real mode. Можно посмотреть сперва что GCC компилирует с флагом -m16, чтобы соориентироваться и написать подобную программу.

См. https://www.briansteffens.com/2020/01/15/hello-world-from-a-bootloader.html

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)

Ты решил взять чужой vmlinuz и превратить его в свой биос наклея бирочку маде ин компани яндекс маил групп или гугл , но так не получиться есть люди по умнее.

anonymous
()
Ответ на: комментарий от EXL

Аналогичные команды «для BIOS», как и ожидалось, без ELF-заголовка всё значительно короче:

$ printf '\xbe\x10\x7c\xac\x3c\x00\x74\x06\xb4\x0e\xcd\x10\xeb\xf5\xeb\xfe\x48\x69\x2c\x20\x41\x73\x73\x65\x6d\x62\x6c\x65\x72\x20\x66\x72\x6f\x6d\x20\x4c\x49\x4e\x55\x58\x2e\x4f\x52\x47\x2e\x52\x55\x21' > boot.bin

$ dd if=/dev/zero bs=1 count=462 >> boot.bin

$ printf '\x55\xaa' >> boot.bin

$ qemu-system-x86_64 boot.bin

Итог:

https://habrastorage.org/webt/f0/38/s-/f038s-c-rcfocrn2zy1wyefkut0.png

Комментарии:

1. Первая длинная строка, собственно, сама Hello World программа.
2. Вторая строка — «добиваем» NULL'ами до 510 байт.
3. В конец добавляем два нужных байта.
4. Запускаем эмулятор QEMU с нашим файлом.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от anonymous

А можешь так же в бивесе емоджи 🍎🍏 🐎🐴🎠 вывести?

Извините, я гетеросексуал.

Но за ваши деньги – любой каприз.

EXL ★★★★★
()
Ответ на: комментарий от anonymous

Уефи загрузчик не знаю как работает.

Он запускает исполняемый файл PE (тот же формат что и в Windows) на FAT разделе, который находится в /efi/boot/boot<arch>.efi или как указано в NVRAM. В точку входа передаётся таблица функций boot services.

X512 ★★★★★
()
Ответ на: комментарий от anonymous

А можешь так же в бивесе емоджи 🍎🍏 🐎🐴🎠 вывести?

UEFI понимает юникод, но я сомневаюсь что там есть соответствующие шрифты.

X512 ★★★★★
()

в каком формате должен быть исполняемый файл?

Сильно зависит от того где запускать. Если в Линуксе, то ELF, если в UEFI, то PE, если в BIOS, то 512 байт кода.

X512 ★★★★★
()
Ответ на: комментарий от X512

Можно тогда с помощью GOP вывести

anonymous
()
Ответ на: комментарий от EXL

Ну вы и извращенцы. На nasm за 10 минут hello world для бивиса пишется. Надо только найти файл с описанием API. Впрочем, нынче всё гуглится.

А раньше у меня был в виде DOS-приложения такой цветной гипертекстовый справочник по основным API… эх, вот умели же сделать красиво практически из ничего.

wandrien ★★
()
Ответ на: комментарий от EXL

Извините, я гетеросексуал. Но за ваши деньги – любой каприз.

Так… что за торговля телом без лицензии?

wandrien ★★
()
Ответ на: комментарий от wandrien

Я NASM и взял. А с GCC просто интересно, возможно ли с флажком -m16 что-то запускаемое собрать или нет.

EXL ★★★★★
()
Ответ на: комментарий от anonymous

Ыыы, в детстве не задумывался, зачем там два лица.

Black Lives Matter!

wandrien ★★
()
Ответ на: комментарий от EXL

C GCC можно собрать и для биоса. Нужно будет объяснить линкеру, что нужен не elf формат. а просто код. Я сейчас уже не вспомню, как это делается. Но факт, что ld такое тоже умеет.

hibou ★★★★★
()
Ответ на: комментарий от hibou

Ну как минимум, лет 10 назад умел.

Сейчас там вроде понакрутили сложностей с линкёр-скриптами. Я когда последний раз нестандартный файл собирал, пришлось старый скрипт править методом гугления.

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от wandrien

Да-да, там какой-то другой линкер-скрипт указываешь, не тот, что по-умолчанию и все.

hibou ★★★★★
()

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

так что, мне непонятен этот тренд.

я понимаю, если бы ассемблеры и другие компиляторы были недоступны..

окей, если предположить что начнётся война и вражеские ассемблеры и компиляторы окажутся заблокированы БЛМами.. но тогда нам и процессоры америконские станут недоступны..

ктоте! какие есть опенсорцные процессоры, которые реально заказать (а ещё лучше самостоятельно собрать) и пощупать

anonymous
()
Ответ на: комментарий от anonymous

У автора все топики такие. За это мы его и ценим.

wandrien ★★
()
Ответ на: комментарий от wandrien

Я им пользовался, а потом купил по случаю мягкую книжку по 80486 инструкциям, оказалось удобнее.

vvn_black ★★★★★
()
Ответ на: комментарий от interrupted

так что можешь использовать dos для загрузки своего кода. из реального режима там можешь дальше что угодно творить

interrupted
()
Ответ на: комментарий от anonymous

mips, кажется, передан в общественное достояние. Но терминология может быть не точной, юридическая в смысле.

Вот что нашел по этому поводу: https://www.mips.com/mipsopen/

hibou ★★★★★
()
Последнее исправление: hibou (всего исправлений: 2)
Ответ на: комментарий от anonymous

так что, мне непонятен этот тренд

Просто красиво. Вы не ходили по ссылке из первого комментария? Интересно там человек рассуждает.

Я вот так сам и не допёр фокус - бросился было разбирать код от EXL на заголовки - Elf32_Ehdr, Elf32_Phdr, Elf32_Shdr - после них там ничего не остаётся, практически, кроме выхода.

Пришлось в ссылку заглядывать. И данные запихал в неиспользуемую часть заголовка ELF, и syscall один использует. Бывают же люди с такими головами. Увлекательно.

Toxo2 ★★★
()
Ответ на: комментарий от Toxo2

И, кстати, вот в ELF смогли запихать в 142 байта «Нi World» страшными хаками. А в .com запихивали в 100 байт целый фрактал Мандельброта. И без хаков с форматом. Тоже, в общем, интересно и познавательно.

Toxo2 ★★★
()
Ответ на: комментарий от wandrien

Да, ради интереса погуглил – нашёл такой способ (отсюда):

$ cat main.c
asm(".code16gcc");

__asm__("jmpl $0x0000, $main\n");

void cout(const char* str) {
    while(*str) {
        __asm__ __volatile__("int $0x10" : : "a"(0x0e00 | *str), "b"(0x0007));
        ++str;
    }
}

void main() {
    __asm__ __volatile__ ("xor %ax, %ax\n");
    __asm__ __volatile__ ("mov %ax, %ds\n");
    cout("Hello World!");
    __asm__ __volatile__("cli\n");
    __asm__ __volatile__("hlt\n");
}

$ gcc -m16 -c main.c -o main.o

$ cat boot.ld 
ENTRY(main);
SECTIONS {
    . = 0x7C00;
    .text : AT(0x7C00) {
        *(.text);
    }
    .sig : AT(0x7DFE) {
        SHORT(0xaa55);
    }
}

$ ld -melf_i386 -static -Tboot.ld -nostdlib --nmagic -o boot.elf main.o

$ objcopy -O binary boot.elf main.bin

$ qemu-system-x86_64 main.bin
(Hello, World!)

https://habrastorage.org/webt/cl/qf/cz/clqfcz4ldh2kkdimvelwirwiypq.png

Со скриптами линковщика коряво конечно выглядит. Интересно, есть ли способ избавиться от них.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 4)
Ответ на: комментарий от Toxo2

Меня когда-то больше всего вот это впечатлило:

$ echo 'B013CD10C51F380F10276BDBE58A0F0209028FBFFE02483F4BE460FEC875E7C3' | xxd -r -p - dirojed.com
$ dosbox dirojed.com
<32-байтная магия>

https://habrastorage.org/webt/rd/8i/wr/rd8iwrsg8r0nsmc31qkrhck9gee.png

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 4)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.