Как мога да използвам машинен език, без да използвам асемблера и операционната система?

Как мога да използвам машинен език, без да използвам асемблера и операционната система?

Как мога да въведа 0 и 1 директно? Знам, че това е глупаво, но искам само да знам как работи и мога ли да напиша програма на машинен език, без да използвам асемблера и операционната система и да инсталирам допълнителни инструменти в операционната система?

Мога ли да въвеждам 0 и 1 отделно от клавиатурата си? без да използвате операционната система? Всъщност програмиране, от нулата!


person Community    schedule 24.06.2015    source източник
comment
Благодаря ти. Но аз казвам Програмиране на най-ниското ниво. В миналото не е имало операционна система. Така че програмистите не са използвали знаци за кодиране. Те са използвали щракване и щракване (0 и 1).   -  person    schedule 24.06.2015
comment
Чувствайте се свободни да напишете bootsector, който използва прекъсвания на BIOS, за да прочете 0s и 1s от клавиатурата, съхранява битовете в RAM и след това прескача до това място в паметта. Как всъщност бихте направили това е извън обхвата на отговора на StackOverflow.   -  person Michael    schedule 24.06.2015
comment
Навремето компютрите често имаха преден панел с превключватели за ръчно въвеждане на двоичен код за стартиране. По очевидни причини съвременните потребители не биха се примирили с това и затова такива интерфейси са изоставени, но не би трябвало да е твърде трудно да се изрови стар PDP-11 миникомпютър или подобен. Или може би микрокомпютър Altair 8800 или някой от неговите конкуренти, макар че това би ви върнало малко назад. По същия начин ръчното пробиване на перфокарта не е твърде трудно за система, способна да стартира по този начин, просто е ужасно досадно.   -  person doynax    schedule 24.06.2015
comment
За да можете да го въведете на клавиатурата си, това вече означава, че има работещ софтуер, който може да чете клавиатурата. Така че изглежда това, което питате, е малко противоречие. :p Механизмът за програмиране на най-ниското ниво зависи от вашата хардуерна настройка. Хардуерът на вашия компютър не е проектиран да улеснява това. Може би най-близкото, което бихте получили, е да препрограмирате флаш BIOS на вашия компютър с какъвто и код да сте създали с някакъв вид двоичен редактор. Но изглежда, че не търсите точно това? Неясен...   -  person lurker    schedule 24.06.2015
comment
За да обобщим: Купете си едно от тези неща.   -  person doynax    schedule 24.06.2015


Отговори (1)


Сериозна част

Както беше посочено в коментарите, вече не можете да заредите програма в паметта на съвременния компютър, като бъркате с превключватели, тя трябва да бъде в някаква форма на носител, в широк смисъл, така че фърмуерът да може да я зареди и изпълни.

Човек може да програмира фърмуер в ROM (или подобен) с програмист, това е възможно най-близко до записването на нули и единици в паметта на компютъра. Имайте предвид, че обикновено машинният код е написан в шестнадесетичен, а не в двоичен код.

В една модерна операционна система можете да пишете машинен код с всеки шестнадесетичен редактор, проблемът е, че двоичните файлове на програмата не съдържат само изпълним код. Те също така съдържат заглавки и много "мета" (да ги наречем така) данни. Така че ще трябва да изградите валидна структура с всички заглавки, секции и т.н.
Това не е невъзможно, всичко се свежда до някаква основна математика и добра справка, просто е много досадно.

Игрова част

Като игра, ако искате да усетите старата тръпка от писането на програми в двоичен код, можете да следвате предложението на Michael и да използвате програма за зареждане, която ви позволява да записвате числа в паметта.

Написах ви един за IA32 (вероятно вашата архитектура), трябва да използвате NASM, за да го сглобите и да запишете 512-байтовия изходен файл на всеки стартиращ носител (Google ще ви помогне). След това рестартирайте компютъра си.

Ето някои ограничения (функции?)

  • Можете да използвате само 0, 1 и enter, всичко останало се игнорира.
  • Не можете да коригирате грешки или да презапишете предишен написан машинен код.
  • Веднага щом бъдат въведени 8 бита, един байт се записва в паметта.
  • Байтовете се записват един след друг в реда, в който са събрани.
  • Не можете да запишете повече от 3,5KiB данни, ако имате нужда от повече, първо трябва да напишете нова програма за запис в паметта и след това да я използвате.
  • Ако натиснете enter, програмата ще изпълни машинния код, който сте въвели.
  • Ако натиснете enter преди да сте завършили байт, вмъкнатите битове се отхвърлят.

Тук вмъквам машинен код за програма, която пише Здравей на екрана .

Ето кода

BITS 16
jmp 07c0h:WORD __START__

__START__:
  mov ax, cs
  mov ss, ax
  xor sp, sp
  push cs
  pop ds
  push 0b800h
  pop es



  mov di, 200h  ;Write binary code from 7c0h:200h to 7c0h:ffffh, i.e. 3,5KiB 


.screen_input:  
  mov ax, 03h
  int 10h
  xor si, si

.byte_input:
  mov cx, 0800h

.bit_input:
  xor ah, ah
  int 16h

  cmp al, 0dh
  je .jump

  cmp al, '0'
  jb .bit_input

  cmp al, '1'
  ja .bit_input

  mov ah, 0ch
  mov WORD [es:si], ax
  add si, 02h

  shr al, 1
  rcl cl, 1

  dec ch
  jnz .bit_input

  mov BYTE [di], cl
  inc di

  add si, 90h
  cmp si, 0fa0h
  jae .screen_input

jmp .byte_input

.jump:
  jmp 7c0h:200h

  TIMES 505-($-__START__) db 0
  dw 0aa55h
person Community    schedule 24.06.2015