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

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

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

от менее сложног0 к более.... я не могу вот так просто взять и написать программку для машины в двоичном коде. пока что воспользуюсь помощью bios. а в идеале нужно мне написать для машины на которой нет ни ОС ни компилятора и bios тоже видимо будет отсутствовать. так в чем и на чем писать? на assembler? мне кажется что машинный код тут как раз и уместен. hello word -это просто подводящее упраждение.

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

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

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

мне непонятен этот тренд

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

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

Расширения имени файла - это вообще из мира микрософт.

Биос ничего не знает о файлах. Файл - это понятие файловой системы. Биос имеет доступ к сектору диска, а не к файлу. И загрузит код из сектора диска. Передаст управление этому коду.

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

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

Ты решил взять чужой....

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

есть люди по умнее

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

Ты решил

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

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

Передаст управление этому коду

да это и надо было.

я не силен в тонкостях, но после компиляции я получал объектный файл. линуковщик уже соибарл исполняемый, который я запускал. это было что-то вроде

^@^@^@^@^@^@^@^@^@^@@

но писать я буду нулями и единицами.

.word 0b11101.............

и мне было не понятно сможет ли процессор понять или он может обрабатывать только

^@^@^@^@^@^@^@^@^@^@@

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

Наши серьезные ответы - насмешка над невежеством модератора. А его бездействие - насмешка над наивными комментаторами. Твой коммент - тонкое оскорбление статуса кво, а мой - рекурсивная метаирония над собой. Это же лор, глубже надо быть.

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

Если использовать Grub, то код уже должен содержать какое-то там магическое число, чтобы Grub понял, что это можно загрузить.

Там должен быть хидер мультибута.

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

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

А вот ещё такая штука есть: https://www.pouet.net/prod.php?which=85272

Из 4096 байт генерируется качественное изображение с неплохой детализацией.

А вот этот победитель Revision 2018 размером 8192 байт вообще мозг взрывает:

https://www.pouet.net/prod.php?which=75790 | https://youtu.be/8T_Um-cw0Wc

Жаль в основном под Windows такие штуки пишутся.

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

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

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

https://www.codeproject.com/Articles/664165/Writing-a-boot-loader-in-Assembly-and-C-Part

.code16                  #generate 16-bit code
.text                    #executable code location
     .globl _start;

_start:                  #code entry point

     #print letter 'H' onto the screen
     movb $'H' , %al
     movb $0x0e, %ah
     int  $0x10

     #print letter 'e' onto the screen
     movb $'e' , %al
     movb $0x0e, %ah
     int  $0x10

     #print letter 'l' onto the screen
     movb $'l' , %al
     movb $0x0e, %ah
     int  $0x10

     #print letter 'l' onto the screen
     movb $'l' , %al
     movb $0x0e, %ah
     int  $0x10

     #print letter 'o' onto the screen
     movb $'o' , %al
     movb $0x0e, %ah
     int  $0x10

     #print letter ',' onto the screen
     movb $',' , %al
     movb $0x0e, %ah
     int  $0x10

     #print space onto the screen
     movb $' ' , %al
     movb $0x0e, %ah
     int  $0x10

     #print letter 'W' onto the screen
     movb $'W' , %al
     movb $0x0e, %ah
     int  $0x10

     #print letter 'o' onto the screen
     movb $'o' , %al
     movb $0x0e, %ah
     int  $0x10

     #print letter 'r' onto the screen
     movb $'r' , %al
     movb $0x0e, %ah
     int  $0x10

     #print letter 'l' onto the screen
     movb $'l' , %al
     movb $0x0e, %ah
     int  $0x10

     #print letter 'd' onto the screen
     movb $'d' , %al
     movb $0x0e, %ah
     int  $0x10

     . = _start + 510      #mov to 510th byte from 0 pos
     .byte 0x55            #append boot signature
     .byte 0xaa            #append boot signature 
anonymous ()
Ответ на: комментарий от EXL

Юмор в том что эту ссылку ТСу в прошлых тредах давали, но он не внемлил.Он мог бы привет мир бинарный глянуть и как минимум знать как напрямую в машкодах писать по крайней мере базисно. Но эта идея глупа, он выше сказал что хочет писать единицами и нулями, только вот даже в простом калькуляторе появляются смещения по адресам, вручную набить смещение в бинарном виде даже шеснадцатибитного числа не очень то и просто, а это только одно из. Выявлять константы в бинарном коде да полезно, не спорю, точки входа всякие и прочее, а вот именно писать. На то и придумали ассемблер что-бы мнемоники делать над этим и сокращать.

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

Вот я ему и советую прочитать в начале любую книгу про «Архитектуру ПК». Жаль сам я толковых книг на эту тему не знаю, думаю достопочтенная публика ЛОРа накидает литературы.

Это даст ему понимание того как и для чего появились ассемблеры, компиляторы и такие языки программирования как C и дальше по списку. Тогда он осознает, что «писать в машинных кодах» – глупо.

Хакать и патчить, конечно, другой разговор.

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

а в идеале нужно мне написать для машины на которой нет ни ОС ни компилятора и bios тоже видимо будет отсутствовать.

Для какой машины? x86? ARM? RISC-V? Какая переферия? В некоторых архитектурах требуется специальный код для инициализации оперативной памяти, до этого работает только кэш.

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

Да, забавно. Нашел целую коллекцию этих штук. https://github.com/netspooky/hardcode/tree/master/00032/dos/32b fire effect .v2

$ echo 'b013cd10c407c507fecf3007fec3ac02040244fe02843f01c0e8020c80aaebea' | xxd -r -p - fire.com
$ dosbox fire.com

Похоже это широко известная, в узком кругу, игра была такая. )

Там и с linux есть похожие исходники, но их сильно сложнее запустить.

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

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

Ну, ум у него шальной, но пытливый и то ладно. А так, ну ух это как с ребёнком бесполезно ему говорить не кушай собачью какашку она невкусная, он в тихаря попробует разревётся и побежит со слезами назад сказав что упал лицом на какашку, зато больше не будет пробовать никогда пуки всякие. Или кто на крыше сарая без страховки лазает, как говорится до первого пиздыха. Так и тут может он даже начнёт что-то делать и напишет даже калькулятор через боль на машкодах, но у него рано или поздно взарвётся пукан как взорвался у тех кто программы тумблерами ранее набирал, а потом у тех кто в машкодах па перфокартах дырки делал, а потом у тех кто задолбался копипастить в ассемблере и так далее.

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

Нашел целую коллекцию этих штук.

На https://www.pouet.net/ полно всяких разных и можно сортировать по платформам и популярности.

Например, вот под DOS: https://www.pouet.net/prodlist.php?platform%5B0%5D=MS-Dos&page=1&order=thumbup

Исходники они тоже часто в архивах выкладывают.

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

требуется специальный код для инициализации оперативной памяти

если неошибаюсь то это все умеет делать bios.

мне просто надо было понять как и куда положить машинные команды, чтобы они выполнились. уважаемый форумчанин выше подсказал, что можно сразу записать на ssd. еще люди пишут что нужно все делать на Assembler но я же сразу сделал акцент, что без помощи компилятора. суть в том, что код должен быть полностью «рукописный» . это для понимания работы железа.

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

Не компилировать, а ассемблировать.

Всё что делает ассемблер, если упростить все технические подробности до минимума – переводит все эти «ADD», «MOV», адресса и наименования регистров в различные константы и опкоды, понятные твоему процессору. Для небольшой программы вроде Hello World ты можешь ассемблировать самостоятельно в HEX-редакторе, если будешь знать про режимы процессора и структуру исполняемых файлов для BIOS, Linux, Windows и пр. окружений. Кроме этого тебе потребуется знание Assembler’а процессора целевой платформы, табличка опкодов и знание ASCII-кодировки, опять же табличка.

Ну а дальше с усложнением программы, начинаются сложности – циклы, условные переходы, вызовы функций, прерывания и так далее. Смысла описывать всё это в машинных кодах нет никакого.

Кстати вот нашёл отличный и хорошо структурированный материал про x86, может кому пригодится освежить информацию:

http://www.c-jump.com/CIS77/CPU/x86/lecture.html

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

эту ссылку ТСу в прошлых тредах давали

ну это не то все... да я вытащил ssd из пк с операционной системой, написал код на Assembler откомпилировал сделал загрузочную дискеты и вывел на экран hello world. но это не то. большую работу сделал компилятор. многое осталось скрыто от глаз. я же хочу без компилятора, напрямую.

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

Не компилировать, а ассемблировать

код на ассемблере также предстоит компилировать. потому как именно компиляция переводит ЯП в машинный код. Ассемблер машинным кодом не является. процессор не понимает мнемонические конструкции.

Assembler ()
Ответ на: комментарий от wandrien
$ cat dirojed.asm 
; Dirojed 32b
; 32 byte intro
; original by T$, optimized 52->32 by Rrrola <rrrola@gmail.com>
; Greets to every x86 coder!

S equ 0E5h        ; like original
; S equ 0B1h        ; vertical "scouts"

org 100h          ; assumes: ah=0 bx=0 cl>0 di=0FFFEh si=0100h

mov  al,13h       ; (2)
int  10h          ; (2)
lds  bx,[bx]      ; (2) bx=20CDh ds=9FFFh
M:
cmp  [bx],cl      ; (2)
adc  [bx],ah      ; (2) if ([bx] < cl) [bx]++ (first pass increases)
imul bx,byte S    ; (3) pseudorandom generator: bx = S*bx-1 (works if S%4==1)
mov  cl,[bx]      ; (2) we don't decrease bx yet
add  cl,[bx+di]   ; (2)
add  cl,[bx-321]  ; (4)
add  cl,[bx+si+63]; (3) cl = ([bx+1]+[bx-1]+[bx-320]+[bx+320]) & 0FFh
dec  bx           ; (1)

in   al,60h       ; (2) standard ESC check
dec  al           ; (2)
jnz  M            ; (2)
ret               ; (1)

$ nasm dirojed.asm -fbin -o d.com

$ dosbox d.com

Кстати вот и код этого шедевра программерского исскуства, без проблем собирается nasm-ом и работает.

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

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

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

Ты написал какой-то бессвязный набор фраз.

Ассемблирование – один из этапов компиляции у того же GCC. Когда порождённый компилятором cc1 или cc1plus ассемблерный листинг скармливается ассемблеру as, который в свою очередь уже занимается трансляцией в машинный код.

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

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

Для BIOS на первые 512 байт диска. Они будут загружены по адресу 0x7c00 и запущены в 16 битном «реальном» режиме.

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

BIOS – программа, которая читает то, что нужно, в оперативную память. Эту программу кто-то написал с помощью компиляторов, ассемблеров, компоновщиков, программаторов и т.п.

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

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

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

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

Зачем решать какую-то задачу, когда можно создавать темы на ЛОРе?

Ну может он переживает, что поставки компиляторов прервутся. Или религия не позволяет их использовать, а он мучается. А может он control freak и не доверяет компиляторам и хочет в одно рыло владеть каждым битом. Или его одноклассники из соседних тем используют Kali, а он поломает комп завуча, запустив свой код сразу на процессоре.

anonymous ()