Professional Documents
Culture Documents
Strojový Kód, Assembler, Emulátor Počítača
Strojový Kód, Assembler, Emulátor Počítača
počítača
● Návrh architektúry hypotetického procesora
● Strojový kód
● Assemblerový jazyk
● Programovanie v assemblerovom jazyku:
– Lineárny program
– Vetvenie
– Cyklus
● Emulátor počítača
Autor: Peter Tomcsányi, Niektoré práva vyhradené v zmysle licencie Creative Commons
http://creativecommons.org/licenses/by-nc-sa/3.0/
Návrh architektúry hypotetického procesora
Náš hypotetický procesor je 8-bitový.
Má päť 8-bitových registrov
Aj adresy do pamäte sú 8-bitové, pamäť môže mať teda maximálne 256 bajtov.
Najnižší bit registra F sa nazýva „bit Z“, určuje, že porovnávané čísla boli
rovnaké alebo že výsledok aritmetickej operácie bol nula.
Ďalší bit registra F sa nazýva „bit G“, určuje, prvé z porovnávaných čísiel
bolo väčšie než druhé.
Ostatné bity registra F nemajú žiadny význam
Návrh strojového kódu
Prvý Druhý Assemblerový
bajt bajt zápis Význam
00 NOP Neurob nič
01 n LDA n Prenes bajt z adresy n do registra A
02 n STA n Prenes bajt z registra A na adresu n
Pripočiítaj k A hodnotu z adresy n
03 n ADD n Nastav bit Z: keď je výsledok nula tak 1, inak 0
Odčítaj od A hodnotu z adresy n,
04 n SUB n Nastav bit Z: keď je výsledok nula tak 1, inak 0
05 adr JMP adr Skoč na adresu adr
Nastav bit G: keď je A neznamienkovo väčšie než obsah adresy n tak 1, inak 0
06 n CMP n Nastav bit Z: keď je A rovné obsahu adresy n tak 1, inak 0
07 adr JNE adr Ak je bit Z v reg. F rovný 0, tak skoč na adresu adr
08 adr JG adr Ak je bit G v reg. F rovný 1, tak skoč na adresu adr
FF HALT Zastav procesor
x DATA x Pseudoinštrukcia - ulož do výsledného programu číslo x
sústave:
x = 0b0101
y = 0xFE
● Python pozná logické operácie s číslami rovnako, ako C:
print(x & y)
print(x | y)
Jednoduchý emulátor strojového kódu (2)
Kompletný program nájdete na: http://edi.fmph.uniba.sk/~tomcsanyi/InterpreterPython.zip
def interpretuj(kod):
pam = kod+[0]*(256-len(kod)) # doplnenie pamäte do 256
pc = 0; a = 0; f = 0 # počiatočné nastavenie
while True:
i = pam[pc]; pc = (pc+1)%256
if i == 0: # NOP neurob nič skúste:
pass interpretuj([1,5,3,6,255,2,3])
elif i == 1: # LDA
adr = pam[pc]; pc = (pc+1)%256
a = pam[adr]
elif i == 2: # STA
adr = pam[pc]; pc = (pc+1)%256
pam[adr] = a
elif i == 3: # ADD elif i == 7: # JNE
adr = pam[pc]; pc = (pc+1)%256 if f & 1 == 0: pc = pam[pc]
a =(a+pam[adr]) % 256 else: pc = (pc+1)%256
if a == 0: f = f | 1 elif i == 8: # JG
else: f = f & 0b11111110 if f & 2 == 1: pc = pam[pc]
elif i == 4: # SUB else: pc = (pc+1)%256
adr = pam[pc]; pc = (pc+1)%256 elif i == 255:
a =(a-pam[adr]) % 256 break
if a == 0: f = f | 1 else:
else: f = f & 0b11111110 raise Exception('Neznáma inštrukcia'+
elif i == 5: # JMP str(i))
pc = pam[pc] return a
elif i == 6: # CMP
adr = pam[pc]; pc = (pc+1)%256
if a == pam[adr]: f = f | 1
else: f = f & 0b11111110
if a > pam[adr]: f = f | 2
else: f = f & 0b11111101