Tartalomjegyzék:

A számítógép kódolása és tesztelése gépi nyelven: 6 lépés
A számítógép kódolása és tesztelése gépi nyelven: 6 lépés

Videó: A számítógép kódolása és tesztelése gépi nyelven: 6 lépés

Videó: A számítógép kódolása és tesztelése gépi nyelven: 6 lépés
Videó: Joscha Bach Λ John Vervaeke: Elme, idealizmus, számítás 2024, November
Anonim
Image
Image

Ebben az utasításban megmutatom, hogyan lehet gépi nyelven kódolni és tesztelni egy számítógépes programot. A gépi nyelv a számítógépek anyanyelve. Mivel 1 -es és 0 -as karakterláncokból áll, az emberek nem könnyen értik. Ennek elkerülése érdekében először kódoljuk a programokat magas szintű nyelven, mint például a C ++ vagy a Java, majd speciális számítógépes programok segítségével fordítsuk le azokat az 1 -es és 0 -as számokra, amelyeket a számítógépek értenek. A magas szintű nyelven történő kódolás megtanulása minden bizonnyal nem gond, de a gépi nyelv rövid bevezetése értékes betekintést nyújthat a számítógépek működésébe, és növelheti e nagyon fontos technológia megbecsülését.

A gépi nyelvi program kódolásához és teszteléséhez hozzá kell férnünk egy egyszerű számítógéphez, amelynek gépi nyelve könnyen érthető. A személyi számítógépek túl bonyolultak ahhoz, hogy figyelembe vegyük őket. A megoldás a Logisim, egy logikai szimulátor használata, amely személyi számítógépen fut. A Logisim segítségével az igényeinknek megfelelő számítógépet szimulálhatunk. A fenti videó ötletet ad Önnek, hogy mit érhetünk el a Logisim segítségével.

A számítógép tervezéséhez egyet adaptáltam a Kindle e -könyvemből: Build Your Own Computer - From Scratch. Az ott leírt BYOC számítógéppel kezdtem, és lecsökkentettem azt az alapvető BYOC-I (I for Instructable) alaplapot, amelyet ebben az utasításban fogunk használni.

A BYOC-I gépi nyelve egyszerű és könnyen érthető. Nincs szüksége speciális számítógépes vagy programozási ismeretekre. Mindehhez csak kíváncsi elme és tanulni akarás szükséges

További irodalom

Elgondolkodhat azon, miért használjuk a "gépet" a számítógép leírására, ha az nem mechanikus eszköz. Az ok történelmi; az első számítástechnikai eszközök mechanikusak voltak, amelyek fogaskerekekből és kerekekből álltak. Allan Sherman dalszövege: „Az összes sebességfokozat csattanó-csattanó volt…” csak egy-két évszázadon belül volt. A korai számításról itt olvashat bővebben.

1. lépés: Alkatrészlista

Gépnyelv -hierarchia és kódok
Gépnyelv -hierarchia és kódok

Az alkatrészlista rövid. Csak ez a két elem szükséges, mindkettő ingyenesen letölthető:

  1. "Logisim-win-2.7.1.exe"-A Logisim egy népszerű és könnyen használható logikai szimulátor. Töltse le innen a Logisim futtatható fájlt, majd hozzon létre egy parancsikont egy kényelmes helyen, például az asztalon. Az indításhoz kattintson duplán a Logisim ikonra. Megjegyzés: A Logisim itt található Java Runtime csomagot használ. Lehet, hogy felkérik, hogy töltse le.
  2. BYOC-I-Full.cir "-Töltse le az alábbi Logisim áramkör fájlt.

Indítsa el a Logisim programot, majd kattintson a "File-Open" gombra, és töltse be a BYOC-I-Full.cir fájlt. A fenti kép a Logisim munkakörnyezetét mutatja. A BYOC-I-t az alkörös blokk képviseli. Külsőleg két bemenet, a Reset és Run, valamint a BYOC-I regisztereinek és programmemóriájának hexadecimális kijelzői vannak csatlakoztatva.

A BYOC-I programmemóriája előre telepített egy egyszerű programmal, amely 1-től 5-ig számít az A regiszterben. A program futtatásához (futtatásához) kövesse az alábbi lépéseket.

1. lépés - Kattintson a Poke eszközre. A kurzornak piszkáló "ujj" -ra kell váltania. 2. lépés - Piszkálja kétszer a Reset bemenetet, egyszer "1" -re, majd ismét "0" -ra. Ezzel visszaállítja a BYOC -I -t, hogy a programot a 0. címen indítsa. Az A regiszternek meg kell jelenítenie a számot 1 -ről 5 -re változó, majd ismétlődő. 4. lépés - Ha a program nem fut, nyomja meg a Control -K gombot, és elindul.

Ha szeretné felfedezni a Logisim képességeit, kattintson a menüsor Súgó linkjére. Innen felfedezheti a Logisim "Oktatóanyagot", "Felhasználói útmutatót" és "Könyvtári hivatkozást". Kiváló videó bemutató található itt.

2. lépés: A gépi nyelv hierarchiája és kódjai

Gépnyelv -hierarchia és kódok
Gépnyelv -hierarchia és kódok

A BYOC-I számítógép gépi nyelven írt programok alapján hajt végre feladatokat. A BYOC-I programok viszont jól meghatározott sorrendben végrehajtott utasításokból állnak. Minden utasítás rögzített hosszúságú kódokból áll, amelyek a BYOC-I különböző működési összetevőit képviselik. Végül ezek a kódok 1-es és 0-as karakterláncokból állnak, amelyek a BYOC-I által ténylegesen végrehajtott gépi nyelvet alkotják.

Magyarázatként kezdjük a kódokkal, és feljutunk a program szintjére. Ezután egy egyszerű programot kódolunk, betöltjük a BYOC-I memóriájába, és végrehajtjuk.

A kódok rögzített számú bináris (1 és 0) számjegyből vagy bitből állnak, röviden. Például az alábbi táblázat az összes lehetséges kódot (összesen 16) mutatja egy 4 bit széles kódhoz. Az oldal mellett látható a kód hexadecimális (16. bázis) és tizedes megfelelője. A hexadecimális értéket a bináris értékekre való hivatkozáshoz használják, mivel kompaktabb, mint a bináris, és binárisból könnyebben konvertálható, mint tizedes. A "0x" előtag tudatja, hogy a következő szám hexadecimális vagy "hex" rövid.

Bináris - Hexadecimális - Tizedes

A kód szélessége határozza meg, hogy hány elemet lehet ábrázolni. Amint megjegyeztük, a fenti 4 bites széles kód legfeljebb 16 elemet (0-15) jelenthet; azaz kétszer 2 négyszer, vagy 2-4. hatvány egyenlő 16. Általánosságban elmondható, hogy a reprezentálható tételek száma 2 az n -edik hatványra emelkedik. Itt található az n-bites kódkapacitások rövid listája.

n - Elemek száma 1 22 43 84 165 326 647 1288 256

A BYOC-I számítógép kódszélességét úgy választjuk meg, hogy megfeleljen a kód által megjelenítendő elemek számának. Például négy utasítás típus létezik, ezért 2 bites széles kód alkalmas. Íme a BYOC-I kódok, mindegyik rövid magyarázatával.

Utasítás típuskód (tt) Négy utasítástípus létezik: (1) MVI - Azonnali 8 bites állandó érték áthelyezése a memóriaregiszterbe. A memóriaregiszter olyan eszköz, amely a számításhoz felhasználandó adatokat tárolja, (2) MOV - Adatok áthelyezése az egyik regiszterből a másikba, (3) RRC - Végezzen regiszter -regiszter számítást, és (4) JMP - Ugrás más utasításra, ahelyett, hogy a következő utasításnál folytatná. A BYOC-I utasítás típuskódjai a következők:

00 MVI01 MOV10 RRC11 JMP

Regisztrációs kód (dd és ss) A BYOC-I négy 8 bites regiszterrel rendelkezik, amelyek 0 és 255 közötti értékek tárolására alkalmasak. A négy regiszter kijelöléséhez elegendő egy 2 bites kód:

00 F regiszter01 E regiszter10 D regiszter11 A regiszter

Számítási kód (ccc) A BYOC-I négy aritmetikai/logikai műveletet támogat. A jövőben nyolc számításra történő bővítés érdekében 3 bites kódot használunk:

000 ADD, adjon hozzá két 8 bites értéket a kijelölt regiszterekhez, és tárolja az eredményt a 001 SUB regiszterek egyikében, vonjon le két 8 bites értéket a kijelölt regiszterekben, és tárolja az eredményt az egyik regiszterben 010-011 Fenntartva a későbbi használatra100 ÉS, logikailag ÉS két 8 bites értéket a kijelölt regiszterekben, és tárolja az eredményt az egyik regiszterben

Ugrókód (j) 1 bites kód, amely azt jelzi, hogy az ugrás feltétel nélküli (j = 1), vagy nem nulla számítási eredménytől függ (j = 0).

Adatok/Címkód (v… v)/(a… a) A 8 bites adatok bizonyos utasításokban szerepelhetnek, amelyek a 00000000 és 11111111 közötti értékeket vagy 0 és 255 tizedes közötti értékeket képviselnek. Ezek az adatok 8 bit szélesek a BYOC-I 8 bites regisztereiben való tároláshoz. A tizedes aritmetika esetén nem mutatjuk a kezdő nullákat. A számítógépes aritmetika esetében a kezdő nullákat mutatjuk, de ezek nem befolyásolják az értéket. A 00000101 számszerűen ugyanaz, 101 vagy 5 tizedes.

Javasolt hivatkozások

Bináris jelölés - https://learn.sparkfun.com/tutorials/binaryHexadecimal Notation -

További irodalom

Az ötlet, hogy kódokat használnak egy folyamat meghajtására, hosszú múltra tekint vissza. Az egyik lenyűgöző példa a Jacquard Loom. Az automatizált szövőszéket egy fából készült kártya lánca vezérelte, amelyben lyukakat fúrtak, amelyek különböző szövésű fonalak kódjait jelzik. Az elsőt Skóciában láttam, ahol színes tartánokat készítettek belőle. A Jacquard Looms -ról itt olvashat bővebben.

3. lépés: A BYOC-I utasítások anatómiája

A BYOC-I utasítások anatómiája
A BYOC-I utasítások anatómiája

Tekintettel a BYOC-I kódjaira, felmegyünk a következő szintre, az utasításokhoz. Utasítás létrehozásához a BYOC-I számára a kódokat meghatározott sorrendben és meghatározott helyen helyezzük el az utasításon belül. Nem minden kód jelenik meg minden utasításban, de ha megjelenik, akkor egy adott helyet foglal el.

Az MVI utasítás típusához a legtöbb bit szükséges, összesen 12. Ha az utasítás szót 12 bit hosszúvá tesszük, minden utasítást elfogadunk. A nem használt (úgynevezett "nem érdekel") bitek értéke 0. Itt található a BYOC-I utasításkészlet.

  1. Azonnali áthelyezés (MVI) - 00 dd vvvvvvvv Funkció: 8 bites V = vvvvvvvv adatérték áthelyezése a dd célregiszterbe. A végrehajtás után a dd regiszter értéke vvvvvvvv lesz. Rövidítés: MVI R, V ahol R jelentése A, D, E vagy F. Példa: 00 10 00000101 - MVI D, 5 - Helyezze át az 5 értéket a D regiszterbe.
  2. Regisztráció áthelyezése regiszterbe (MOV) - 01 dd ss 000000Funkció: Az adatok áthelyezése az ss forrásregiszterből a dd deszignációs nyilvántartásba. A végrehajtás után mindkét regiszter értéke megegyezik a forrásregiszter értékével. Rövidítés: MOV Rd, Rs ahol Rd az A, D, E vagy F célregiszter, Rs pedig az A, D, E vagy F forrásregiszter. Példa: 01 11 01 000000 - MOV A, E - Az érték áthelyezése az E nyilvántartásban az A nyilvántartásba.
  3. Funkció: Végezze el a kijelölt ccc számítást a forrás regiszter ss és a dd célregiszter használatával, majd tárolja az eredményt a célregiszterben. Rövidítések: ADD Rd, Rs (ccc = 000 Rd + Rs Rd); SUB Rd, Rs (ccc = 001 Rd - Rd tárolva az Rd -ben); ÉS Rd, Rs (ccc = 100 Rd ÉS Rd tárolva az Rd -ben); VAGY Rd, Rs (ccc = 101 Rd OR Rs tárolva az Rd -ben). Példa: 10 00 11 001 000 - F SUB, A - Vonja ki az A regiszterben szereplő értéket az F regiszterből, az F regiszterben szereplő eredménnyel.
  4. Ugrás más utasításra (JMP) - 11 j 0 aaaaaaaa Funkció: A végrehajtás megváltoztatása az aaaa aaaa (a) címen található másik utasításra Feltétel nélkül (j = 1) -11 1 0 aaaaaaaa Rövidítés: JMP L ahol L aaaa aaaa Példa: 11 1 0 00001000 - JMP 8 - Végezze el a végrehajtást a 8. címre. B) Feltételesen (j = 0), ha az előző számítás nem nulla eredményt eredményezett - 11 0 0 aaaaaaaa 0 00000100 JNZ 4 Ha az utolsó számítás nem nulla értéket eredményezett, módosítsa a végrehajtást a 4-es címre.

Az utasítás szó bitjei balról (legjelentősebb bit MSB) jobbra (legkevésbé jelentős bit LSB) vannak számozva 11 -től 0 -ig. A kódok rögzített sorrendje és helye a következő:

Bit-kód11-10 Utasítás típusa9-8 Célregiszter7-6 Forrásregiszter5-3 Számítás: 000-add; 001 - kivonás; 100 - logikai ÉS; 101 - logikai OR7-0 Állandó érték v… v és a… a (0–255)

Az utasításkészletet a fenti ábra foglalja össze. Vegye figyelembe a kódok strukturált és rendezett megjelenését minden utasításban. Az eredmény a BYOC-I egyszerűbb kialakítása, és megkönnyíti az utasítások megértését az ember számára.

4. lépés: Számítógépes utasítás kódolása

Számítógépes utasítás kódolása
Számítógépes utasítás kódolása

Mielőtt a program szintjére lépnénk, építsünk fel néhány példa utasítást a fenti BYOC-I utasításkészlettel.

1. Mozgassa az 1 értéket az A regisztrációba. A BYOC-I regiszterek 0 és 255 közötti értékeket tudnak tárolni. Ebben az esetben az A regiszter értéke 1 (00000001 bináris) lesz az utasítás végrehajtása után.

Rövidítés: MVI A, 1 Szükséges kódok: MVI -00 típus; Célnyilvántartás A - 11; Érték - 00000001Instrukciós szó: 00 11 00000001

2. Helyezze át az A regiszter tartalmát a D regiszterbe. A végrehajtás után mindkét regiszter értéke megegyezik az A nyilvántartásban szereplő értékkel.

Rövidítés: MOV D, A (Ne feledje, hogy a cél az első és a forrás a második a listában) Szükséges kódok: MOV - 01 típus; Célnyilvántartás D - 10; Forrásregiszter A - 11Instrukciós szó: 01 10 11 000000

3. Adja hozzá a D regiszter tartalmát az A regiszterhez, és tárolja az A regiszterben. A végrehajtás után az A regiszter értéke az A regiszter és a D regiszter eredeti értékének összege lesz.

Rövidítés: ADD A, D (Az eredmény a célregiszterben van tárolva) Szükséges kódok: RRC -10 típus; Célnyilvántartás A - 11; Forrásregiszter D - 10; Számítás hozzáadása - 000 Instrukciós szó: 10 11 10 000 000 (ccc az első 000 - add)

4. Ugrás nem nullára a címre 3. Ha az utolsó számítás eredménye nem volt nulla, akkor a végrehajtás a megadott címen lévő utasításra változik. Ha nulla, akkor a végrehajtás a következő utasításnál folytatódik.

Rövidítés: JNZ 3 Szükséges kódok: JMP - 11 típus; Ugrás típusa - 0; Cím - 00000003 Utasítási szó: 11 0 0 00000003 (az ugrás típusa az első 0)

5. Feltétel nélkül ugorjon a 0. címre. A végrehajtás után a végrehajtás megváltozik az utasításban a megadott címen.

Rövidítés: JMP 0Kód szükséges: JMP - 11 típus; Ugrás típusa - 1; Cím - 00000000Instruction Word; 11 1 0 00000000

Bár a gépi kódolás kissé unalmas, láthatja, hogy ez nem lehetetlen. Ha valódi gépi kódolást végezne, akkor az assembler nevű számítógépes program segítségével lefordítaná a rövidítésből (amelyet összeszerelési kódnak) gépkódnak.

5. lépés: Egy számítógépes program anatómiája

Egy számítógépes program anatómiája
Egy számítógépes program anatómiája

A számítógépes program azoknak az utasításoknak a listája, amelyeket a számítógép a lista elejétől kezdve végrehajt, a listától a végéig. Az olyan utasítások, mint a JNZ és a JMP, megváltoztathatják a következő végrehajtandó utasítást. A lista minden utasítása egyetlen címet foglal el a számítógép memóriájában 0-tól kezdődően. A BYOC-I memória 256 utasításból álló listát tartalmazhat, ami több mint elég a célunkhoz.

A számítógépes programokat egy adott feladat elvégzésére tervezték. A programunkhoz egy egyszerű feladatot választunk, 1-től 5-ig számolva. Nyilvánvalóan nincs "count" utasítás, ezért az első lépés a feladat bontása olyan lépésekre, amelyeket a BYOC-I nagyon jól tud kezelni korlátozott utasításkészlet.

1. lépés Mozgassa az 1 -et a regisztráláshoz. 2. lépés Az A -nyilvántartás áthelyezése a DS -be a kivonás eredménye nem volt nulla, térjen vissza a 4. lépéshez és folytassa a számolást 7. lépés Ha a kivonás eredménye nulla volt, menjen vissza és kezdje elölről

A következő lépés lefordítani ezeket a lépéseket BYOC-I utasításba. A BYOC-I programok a 0-ás címen kezdődnek és egymás után sorszámozódnak. Az ugrási célcímek utoljára kerülnek hozzáadásra, miután minden utasítás megvan.

Cím: Utasítás - Rövidítés; Leírás0: 00 11 00000001 - MVI A, 1; Mozgassa az 1 -et az A1 nyilvántartásba: 01 10 11 000000 - MOV D, A; Az A regiszter áthelyezése a D2 nyilvántartásba: 10 11 10 000 000 - ADD A, D; Adja hozzá a D regisztert az A nyilvántartáshoz, és tárolja az eredményt az A3 nyilvántartásban: 00 01 00 00000101 - MVI E, 5; Mozgassa az 5 regisztert E4: 10 01 11 001 000 - SUB E, A; kivonja az A regisztert az E nyilvántartásból, és tárolja a eredmény az E5 regiszterben: 11 0 0 00000010 - JNZ 2; Ha a kivonás eredménye nem nulla, menjen vissza a 3 -as címre, és folytassa a számlálást

A program memóriába való átvitele előtt a bináris utasításkódot hexadecimálisra kell módosítani a Logisim Hex Editor használatával. Először ossza fel az utasítást három, egyenként 4 bites csoportra. Ezután fordítsa le a csoportokat hexadecimálisra a 2. lépésben található táblázat segítségével. Csak az utolsó három hexadecimális számjegyet használja (az alábbi vastag betűvel).

Cím - Bináris utasítás - Bináris felosztási utasítás - Utasítás (hexa) 0 001100000001 0011 0000 0001 - 0x03011 011011000000 0110 1100 0000 - 0x06C02 101110000000 1011 1000 0000 - 0x0B803 000100000101 0001 0000 0101 - 0x0105000000100 111000000010 1110 0000 0000 - 0x0E00

Ideje átvinni a programot a BYOC-I memóriájába tesztelés céljából.

6. lépés: A program átvitele memóriába és tesztelés

A program átvitele a memóriába és tesztelés
A program átvitele a memóriába és tesztelés
A program átvitele a memóriába és tesztelés
A program átvitele a memóriába és tesztelés

A Logisim "fő" áramkörét tekintve a bemutatott BYOC-I blokk a tényleges számítógépes áramkör szimbóluma a "BYOC-I" feliratú panelen. Program bevitele a BYOC-I memóriába:

  1. Kattintson a jobb egérgombbal a BYOC-I blokkra (amelyet "alkörnek" neveznek), és válassza ki (vigye az egeret a bal és bal egérgombbal) "BYOC-I megtekintése".
  2. A BYOC-I áramkör megjelenik a munkaterületen. Kattintson a jobb gombbal a "Programmemória" szimbólumra, és válassza a "Tartalom szerkesztése" lehetőséget.
  3. A Logisim Hex Editor használatával írja be a hexadecimális kódot (csak félkövér), a fentiek szerint.

Most már készen áll a program végrehajtására. Térjen vissza a főáramkörhöz, ha duplán kattint a "BYOC-I" elemre az Explorer panelen. A Run és Reset bemeneteknek "0" -nak kell lenniük az induláshoz. A Poke Tool segítségével először állítsa a Reset értéket 1 -re, majd vissza 0 -ra. Ezzel a kezdőcím 0x0000 lesz, és előkészíti a BYOC-I áramkört a végrehajtásra. Most állítsa a Run bemenetet "1" -re, és a program végrehajtja. (Megjegyzés: A Logisim óra elindításához főként egyszer kell megérinteni a Control-K billentyűt. Ez a funkció lehetővé teszi, hogy leállítsa a Logisim órát és lépjen át a programon a Control-T ismételt megérintésével. Próbálja ki valamikor!)

A Logisim óra a frekvencia széles tartományára állítható. Letöltve 8 Hz (8 ciklus másodpercenként). A BYOC-I számítógép tervezésének módja szerint minden utasítás négy óra ciklusba telik. Tehát a BYOC-I sebesség kiszámításához ossza el az órajel frekvenciáját 4-vel. 8 Hz-en a sebessége 2 utasítás másodpercenként. Az órát az eszköztáron a "Szimuláció" gombra kattintva módosíthatja, és kiválaszthatja a "Kullancs gyakorisága" lehetőséget. A lehetséges tartomány 0,25 Hz - 4100 Hz. A lassú, 8 Hz -es sebességet úgy választottuk, hogy az A regiszterben lévő számokat figyelhessük.

A BYOC-I szimuláció maximális sebessége (~ 1000 utasítás másodpercenként) nagyon lassú a modern számítógépekhez képest. A könyvemben leírt BYOC számítógép hardververziója másodpercenként több mint 12 millió utasítást hajt végre!

Remélem, ez az Instructable demisztifikálta a gépi nyelv programozását, és betekintést engedett abba, hogyan működnek a számítógépek a legalapvetőbb szinten. A megértés megerősítése érdekében próbálja meg kódolni az alábbi két programot.

  1. Írjon egy programot, amely 5 -től kezdődik és 0 -ig számít vissza. (ANS. Count5to0.txt alább)
  2. 2 -től kezdve számoljon 3 -mal, amíg a szám meghaladja a 7 -et. Csinálhat egy kis mentális számítást, ellenőrizze a 8 -at, tudva, hogy ott landol, majd indítsa újra. Írja meg programját általánosabban, hogy valóban tesztelje, ha a szám "meghaladja" egy adott számot. Tipp: Fedezze fel, mi történik, ha a kivonás negatív értéket ad, például 8-9 = -1. Ezután kísérletezzen a logikai ÉS-el, és tesztelje, hogy a 8 bites szám MSB értéke "1". (ANS. ExceedsCount.txt)

Gondol más kihívásokra a BYOC-I számítógéppel kapcsolatban? Tekintettel a korlátaira, mit tehet még? Ossza meg tapasztalatait velem a [email protected] címen. Ha érdekli a mikroprocesszorok kódolása, nézze meg a www.whippleway.com webhelyemet. Ott hordozom a gépi kódolást olyan modern processzorokhoz, mint az Arduinosban használt ATMEL Mega sorozat.

Ajánlott: