Как машините интерпретират двоичен код?

Просто си мислех, как машините интерпретират двоичен код? Всичко, което разбирам, е, че вашият код е превърнат в 1 и 0, така че машината да може да ги разбере, но как го правят? Това просто нормален превод на текст в двоичен код ли е?


person TheBlueCat    schedule 03.03.2012    source източник


Отговори (3)


Първо, „двоичен“ не означава това, което мислите, че означава (всички данни на компютъра, включително текстът вече са двоични, просто начинът, по който решаваме да ги покажем и обработим, е различен).

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

Ще покажа пример за MIPS инструкции. Ако се интересувате, можете да продължите да четете и да получите някои действителни знания по темата, опитайте връзките в края на публикацията ми.

MIPS е популярен уводен предмет, защото неговият формат на инструкции е един от по-лесно смилаемите. MIPS инструкциите са с ширина 32 бита. В MIPS има 3 вида инструкции: "R", "I" и "J". Ще разгледаме инструкциите "I".

Когато процесорът получи инструкция (32 бита данни), той я прочита и решава какво да прави с нея. Инструкциите "I" изглеждат така:

|------|-----|-----|----------------|
 opcode   rs    rt    immediate
   6      5     5     16               (the numbers show how wide are each part)

Значението на тези:

  • opcode казва какъв вид инструкция е това (например: събиране, изваждане, умножение и много други). Всички инструкции (включително типовете "R" и "J") започват с 6-битов код на операцията и по този начин процесорът знае кой вид е той.
  • rs и rt са регистри, вид памет в процесора, която може да съхранява 32-битови стойности. MIPS има 32 от тях и те се идентифицират по техния брой. Това не е същото като паметта, това е вътре в самия процесор.
  • незабавно е число. Нарича се така, защото номерът е "точно там" в инструкцията, а не в регистър или памет.

Конкретен пример за добавяне на незабавно към номер, съхранен в регистър:

001000 00001 00010 0000000000000011

В този пример разделих инструкцията на части, както по-горе. Значението на стойностите е следното:

  • операционен код: 001000 означава addi или „незабавно добавяне“.
  • rs: 00001 е 1 в десетичен знак, така че тази част от инструкцията казва на процесора, че искаме да използваме регистър 1 като rs.
  • rd: 00010 е 2 в десетичен знак, същата идея като при rs.
  • незабавно: 0000000000000011 е 3 в десетичен знак.

Инструкцията addi работи по следния начин: взема стойността, намерена в rs, и добавя стойността незабавно към нея. След това поставя резултата в rd. Така че, когато инструкцията е готова, rd ще съдържа 3+2=5.

Накратко, компилаторите анализират вашия текст и генерират инструкции към целевия процесор, който прави същото нещо, което сте възнамерявали да направите с вашата програма. Както можете да видите, има огромна разлика между текстовото представяне на програмата, която ние програмистите пишем, и изпълняваемия машинен код.

Няколко полезни ресурса за MIPS и компютърната архитектура:

person Tamás Szelei    schedule 03.03.2012

Това, което питате, е огромна тема. Бих препоръчал отличната книга Елементите на компютърните системи за преглед на това как компютрите и компилаторите са конструирани по принцип. Доста лесно е за следване и упражненията са забавни за изпълнение. Повечето от тях са достъпни онлайн на предоставената връзка.

Този въпрос също има няколко добри връзки по темата.

person Dervall    schedule 03.03.2012

Мислете за това по този начин. Имате 8 превключвателя за захранване, всеки от които е изключен (0) или включен (1). Компютърът ще види всичките 8 превключвателя като 1. Сега много прилича на кодова ключалка. Всеки символ на вашата клавиатура има своя комбинация.

person CRC3    schedule 27.10.2013