Tyto stránky již nejsou udržovány. Obsah je postupně přesouván/aktualizován na adrese chytrosti.marrek.cz.
59/131
Každý počítač má definován vlastní sestavu (soubor, „repertoár“) strojových instrukcí, které je schopen vykonávat = tzv. instrukční soubor
=> programy musí být sestaveny právě z těchto strojových instrukcí
=> programátor musí tyto instrukce znát a spolu s nimi i další větší či menší detaily o daném počítači (např. skladbu registrů, způsoby adresování, významy příznaků, ...)
1 start: ; Storojový kód 8051
2 mov P1, #0ABH ; 75 90 AB
3 mov P3, #0CDH ; 75 B0 CD
4 mov P1, r0 ; 88 90
5 sem:
6 mov A, R0 ; E8
7 inc A ; 4A
8 inc R2 ; 0A
9 AJMP sem ; 01 08
10 END
`--> stáhnout
Můžete porovnat následující program v C a v Assembleru , který řeší stejný problém -- generování náhodného čísla na 7-segmentu
1 void main(void)
2 {
3 char cislo = 1;
4 while (1) {
5 if (TLACITKO) {
6 DISPLAY = 0b01111111;
7 cislo = cislo < 6 ? cislo + 1 : 1;
8 } else {
9 DISPLAY = segment[cislo];
10 }
11 }
12 }
`--> stáhnout
1 TL bit P1.0
2
3 mov DPTR, #segment
4 mov R0, #1d
5
6 kostka:
7 jnb TL, cykluj
8 CALL zobrazuj
9 jmp kostka
10
11 cykluj:
12 mov P2, #0FFH
13 clr P2.7
14 inc R0
15 cjne R0, #7d, nenuluj
16 mov R0, #1d
17 nenuluj:
18 jmp kostka
19
20 zobrazuj:
21 mov A, R0
22 movc A,@A+DPTR
23 mov P2, A
24 RET
`--> stáhnout
Rád bych nabídl ještě jedno porovnání. Tentokrát jde o práci s více-bytovým číslem. Program v C vypadá celkem nevině a jednoduše:
1 #include <at89x52.h>
2
3 long int i = 0;
4 void main(void)
5 {
6 while (1) {
7 i++;
8 }
9 }
`--> stáhnout
Program v Assembleru je o dost delší. Tento zdrojový kód vznik disassemblováním přeloženého C.
1 ORG 0h
2 ljmp label0
3 label4: ljmp label1
4 label0: mov SP, #0Bh
5 lcall label2
6 mov A, DPL
7 jz label3
8 ljmp label4
9 label3: mov R1, #0h
10 mov A, R1
11 orl A, #0h
12 jz label5
13 mov R2, #0h
14 mov DPTR, #084h
15 mov R0, #0h
16 mov P2, #0h
17 label7: clr A
18 movc A, @A+DPTR
19 movx @R0, A
20 inc DPTR
21 inc R0
22 cjne R0, #0h, label6
23 inc P2
24 label6: djnz R1, label7
25 djnz R2, label7
26 mov P2, #0FFh
27 label5: clr A
28 mov R0, #7Fh
29 label8: mov @R0, A
30 djnz R0, label8
31 mov R0, #0h
32 mov A, R0
33 orl A, #0h
34 jz label9
35 mov R1, #0h
36 mov P2, #0h
37 clr A
38 label10:
39 movx @R1, A
40 inc R1
41 djnz R0, label10
42 label9: mov R0, #0h
43 mov A, R0
44 orl A, #0h
45 jz label11
46 mov R1, #0h
47 mov DPTR, #000h
48 clr A
49 label12:
50 movx @DPTR, A
51 inc DPTR
52 djnz R0, label12
53 djnz R1, label12
54 label11:
55 clr A
56 mov 8h, A
57 mov 9h, A
58 mov 0Ah, A
59 mov 0Bh, A
60 ljmp label4
61 label1: inc 8h
62 clr A
63 cjne A, 8h, label13
64 inc 9h
65 cjne A, 9h, label13
66 inc 0Ah
67 cjne A, 0Ah, label1
68 inc 0Bh
69 label13:
70 sjmp label1
71 ret
72 label2: mov DPL, #0h
73 ret
74
75 END
`--> stáhnout
Fibonacciho posloupnost v Pythonu:
1 a, b = 0, 1
2 while b < n:
3 print b,
4 a, b = b, a+b
`--> stáhnout
Byte code na hranici mezi kódem vyššího programovacího jazyka a strojovým kódem.
Jeho cílem je usnadnit interpretaci kódu interpretem nebo snížit závislost na hardware a operačním systému => stejný kód běžet na různých platformách často pomocí virtuálních strojů, nebo může být před spuštěním zkompilován do strojového kódu cílové platformy, což umožní rychlejší běh kódu.
Na rozdíl od čitelných kódů je bytecode kompaktní číselný kód konstant a odkazů (číselné adresy) a jako takový kóduje výsledek parsování a sémantické analýzy. Díky tomu je jeho interpretace rychlejší než přímá interpretace původního zdrojového kódu.