Schéma počítače (upravený model von Neumanna) CPU Paměť Vstupy a výstupy CTR. BUS DATA BUS ADR. BUS CX BX AX DX SP PC INSTR. CODE STATUS ALU CLOCK Z,C,S,... ADR. BUS DATA BUSRESET CTR. BUS Instrukce (minimální sada) op2 registr, konstanta op2 registr, registr op2 registr, [adresa] op2 registr, [ registr + konstanta] op2 jsou: LOAD, STORE, ADD, SUB, CMP,... op1 registr op1 [adresa] op1 [ registr + konstanta] op1 jsou: INC, DEC, CLEAR, ... PUSH registr POP registr skok konstanta skok registr operace skoku jsou: JMP, CALL, JC, JNC, JZ, … RETURN ++ -- + - x / & | << >> CPU int main() { int a; int b; char c[5 + 1]; … a = fce(5 * 3, b); … } int fce(int p, int q) { int r; char s[10+1]; r = p + 10; s[5] = p; s[q + 1] = ’\n’; return r; } main: … LOAD AX,[SP + 6] PUSH AX LOAD AX, 15 PUSH AX CALL fce ADD SP,8 STORE AX,[SP + 10] … fce: ADD SP,-15 LOAD AX,[SP + 15 + 4 + 4] ADD AX,10 STORE AX,[SP + 11] LOAD AX,[SP + 15 + 4 + 4] STORE AL,[SP + 5] LOAD BX,[SP + 15 + 4 + 0] INC BX ADD BX,SP MOV AL,10 STORE AL,[BX] LOAD AX,[SP + 11] ADD SP,15 RETURN SP b (4 byte) a (4 byte) c (6 byte) část zásobníku obsazená předchozími funkcemi neobsazená část zásobníku int main() { int a; int b; char c[5 + 1]; … a = fce(5 * 3, b); … } int fce(int p, int q) { int r; char s[10+1]; r = p + 10; s[5] = p; s[q + 1] = ’\n’; return r; } main: … LOAD AX,[SP + 6] PUSH AX LOAD AX, 15 PUSH AX CALL fce ADD SP,8 STORE AX,[SP + 10] … fce: ADD SP,-15 LOAD AX,[SP + 15 + 4 + 4] ADD AX,10 STORE AX,[SP + 11] LOAD AX,[SP + 15 + 4 + 4] STORE AL,[SP + 5] LOAD BX,[SP + 15 + 4 + 0] INC BX ADD BX,SP MOV AL,10 STORE AL,[BX] LOAD AX,[SP + 11] ADD SP,15 RETURN SP b (4 byte) a (4 byte) c (6 byte) q (4 byte) - hodnota proměnné b int main() { int a; int b; char c[5 + 1]; … a = fce(5 * 3, b); … } int fce(int p, int q) { int r; char s[10+1]; r = p + 10; s[5] = p; s[q + 1] = ’\n’; return r; } main: … LOAD AX,[SP + 6] PUSH AX LOAD AX, 15 PUSH AX CALL fce ADD SP,8 STORE AX,[SP + 10] … fce: ADD SP,-15 LOAD AX,[SP + 15 + 4 + 4] ADD AX,10 STORE AX,[SP + 11] LOAD AX,[SP + 15 + 4 + 4] STORE AL,[SP + 5] LOAD BX,[SP + 15 + 4 + 0] INC BX ADD BX,SP MOV AL,10 STORE AL,[BX] LOAD AX,[SP + 11] ADD SP,15 RETURN SP b (4 byte) a (4 byte) c (6 byte) q (4 byte) - hodnota proměnné b p (4 byte) - hodnota 15 int main() { int a; int b; char c[5 + 1]; … a = fce(5 * 3, b); … } int fce(int p, int q) { int r; char s[10+1]; r = p + 10; s[5] = p; s[q + 1] = ’\n’; return r; } main: … LOAD AX,[SP + 6] PUSH AX LOAD AX, 15 PUSH AX CALL fce ADD SP,8 STORE AX,[SP + 10] … fce: ADD SP,-15 LOAD AX,[SP + 15 + 4 + 4] ADD AX,10 STORE AX,[SP + 11] LOAD AX,[SP + 15 + 4 + 4] STORE AL,[SP + 5] LOAD BX,[SP + 15 + 4 + 0] INC BX ADD BX,SP MOV AL,10 STORE AL,[BX] LOAD AX,[SP + 11] ADD SP,15 RETURN SP b (4 byte) a (4 byte) c (6 byte) q (4 byte) - hodnota proměnné b p (4 byte) - hodnota 15 návratová adresa zpět do main int main() { int a; int b; char c[5 + 1]; … a = fce(5 * 3, b); … } int fce(int p, int q) { int r; char s[10+1]; r = p + 10; s[5] = p; s[q + 1] = ’\n’; return r; } main: … LOAD AX,[SP + 6] PUSH AX LOAD AX, 15 PUSH AX CALL fce ADD SP,8 STORE AX,[SP + 10] … fce: ADD SP,-15 LOAD AX,[SP + 15 + 4 + 4] ADD AX,10 STORE AX,[SP + 11] LOAD AX,[SP + 15 + 4 + 4] STORE AL,[SP + 5] LOAD BX,[SP + 15 + 4 + 0] INC BX ADD BX,SP MOV AL,10 STORE AL,[BX] LOAD AX,[SP + 11] ADD SP,15 RETURN SP b (4 byte) a (4 byte) c (6 byte) q (4 byte) - hodnota proměnné b p (4 byte) - hodnota 15 návratová adresa zpět do main r (4 byte) s (11 byte) int main() { int a; int b; char c[5 + 1]; … a = fce(5 * 3, b); … } int fce(int p, int q) { int r; char s[10+1]; r = p + 10; s[5] = p; s[q + 1] = ’\n’; return r; } main: … LOAD AX,[SP + 6] PUSH AX LOAD AX, 15 PUSH AX CALL fce ADD SP,8 STORE AX,[SP + 10] … fce: ADD SP,-15 LOAD AX,[SP + 15 + 4 + 4] ADD AX,10 STORE AX,[SP + 11] LOAD AX,[SP + 15 + 4 + 4] STORE AL,[SP + 5] LOAD BX,[SP + 15 + 4 + 0] INC BX ADD BX,SP MOV AL,10 STORE AL,[BX] LOAD AX,[SP + 11] ADD SP,15 RETURN SP b (4 byte) a (4 byte) c (6 byte) q (4 byte) - hodnota proměnné b p (4 byte) - hodnota 15 návratová adresa zpět do main r (4 byte) s (11 byte) int main() { int a; int b; char c[5 + 1]; … a = fce(5 * 3, b); … } int fce(int p, int q) { int r; char s[10+1]; r = p + 10; s[5] = p; s[q + 1] = ’\n’; return r; } main: … LOAD AX,[SP + 6] PUSH AX LOAD AX, 15 PUSH AX CALL fce ADD SP,8 STORE AX,[SP + 10] … fce: ADD SP,-15 LOAD AX,[SP + 15 + 4 + 4] ADD AX,10 STORE AX,[SP + 11] LOAD AX,[SP + 15 + 4 + 4] STORE AL,[SP + 5] LOAD BX,[SP + 15 + 4 + 0] INC BX ADD BX,SP MOV AL,10 STORE AL,[BX] LOAD AX,[SP + 11] ADD SP,15 RETURN SP b (4 byte) a (4 byte) c (6 byte) q (4 byte) - hodnota proměnné b p (4 byte) - hodnota 15 návratová adresa zpět do main r (4 byte) s (11 byte) int main() { int a; int b; char c[5 + 1]; … a = fce(5 * 3, b); … } int fce(int p, int q) { int r; char s[10+1]; r = p + 10; s[5] = p; s[q + 1] = ’\n’; return r; } main: … LOAD AX,[SP + 6] PUSH AX LOAD AX, 15 PUSH AX CALL fce ADD SP,8 STORE AX,[SP + 10] … fce: ADD SP,-15 LOAD AX,[SP + 15 + 4 + 4] ADD AX,10 STORE AX,[SP + 11] LOAD AX,[SP + 15 + 4 + 4] STORE AL,[SP + 5] LOAD BX,[SP + 15 + 4 + 0] INC BX ADD BX,SP MOV AL,10 STORE AL,[BX] LOAD AX,[SP + 11] ADD SP,15 RETURN SP b (4 byte) a (4 byte) c (6 byte) q (4 byte) - hodnota proměnné b p (4 byte) - hodnota 15 návratová adresa zpět do main r (4 byte) s (11 byte) int main() { int a; int b; char c[5 + 1]; … a = fce(5 * 3, b); … } int fce(int p, int q) { int r; char s[10+1]; r = p + 10; s[5] = p; s[q + 1] = ’\n’; return r; } main: … LOAD AX,[SP + 6] PUSH AX LOAD AX, 15 PUSH AX CALL fce ADD SP,8 STORE AX,[SP + 10] … fce: ADD SP,-15 LOAD AX,[SP + 15 + 4 + 4] ADD AX,10 STORE AX,[SP + 11] LOAD AX,[SP + 15 + 4 + 4] STORE AL,[SP + 5] LOAD BX,[SP + 15 + 4 + 0] INC BX ADD BX,SP MOV AL,10 STORE AL,[BX] LOAD AX,[SP + 11] ADD SP,15 RETURN SP b (4 byte) a (4 byte) c (6 byte) q (4 byte) - hodnota proměnné b p (4 byte) - hodnota 15 návratová adresa zpět do main r (4 byte) s (11 byte) int main() { int a; int b; char c[5 + 1]; … a = fce(5 * 3, b); … } int fce(int p, int q) { int r; char s[10+1]; r = p + 10; s[5] = p; s[q + 1] = ’\n’; return r; } main: … LOAD AX,[SP + 6] PUSH AX LOAD AX, 15 PUSH AX CALL fce ADD SP,8 STORE AX,[SP + 10] … fce: ADD SP,-15 LOAD AX,[SP + 15 + 4 + 4] ADD AX,10 STORE AX,[SP + 11] LOAD AX,[SP + 15 + 4 + 4] STORE AL,[SP + 5] LOAD BX,[SP + 15 + 4 + 0] INC BX ADD BX,SP MOV AL,10 STORE AL,[BX] LOAD AX,[SP + 11] ADD SP,15 RETURN SP b (4 byte) a (4 byte) c (6 byte) q (4 byte) - hodnota proměnné b p (4 byte) - hodnota 15 návratová adresa zpět do main int main() { int a; int b; char c[5 + 1]; … a = fce(5 * 3, b); … } int fce(int p, int q) { int r; char s[10+1]; r = p + 10; s[5] = p; s[q + 1] = ’\n’; return r; } main: … LOAD AX,[SP + 6] PUSH AX LOAD AX, 15 PUSH AX CALL fce ADD SP,8 STORE AX,[SP + 10] … fce: ADD SP,-15 LOAD AX,[SP + 15 + 4 + 4] ADD AX,10 STORE AX,[SP + 11] LOAD AX,[SP + 15 + 4 + 4] STORE AL,[SP + 5] LOAD BX,[SP + 15 + 4 + 0] INC BX ADD BX,SP MOV AL,10 STORE AL,[BX] LOAD AX,[SP + 11] ADD SP,15 RETURN SP b (4 byte) a (4 byte) c (6 byte) q (4 byte) - hodnota proměnné b p (4 byte) - hodnota 15 int main() { int a; int b; char c[5 + 1]; … a = fce(5 * 3, b); … } int fce(int p, int q) { int r; char s[10+1]; r = p + 10; s[5] = p; s[q + 1] = ’\n’; return r; } main: … LOAD AX,[SP + 6] PUSH AX LOAD AX, 15 PUSH AX CALL fce ADD SP,8 STORE AX,[SP + 10] … fce: ADD SP,-15 LOAD AX,[SP + 15 + 4 + 4] ADD AX,10 STORE AX,[SP + 11] LOAD AX,[SP + 15 + 4 + 4] STORE AL,[SP + 5] LOAD BX,[SP + 15 + 4 + 0] INC BX ADD BX,SP MOV AL,10 STORE AL,[BX] LOAD AX,[SP + 11] ADD SP,15 RETURN SP b (4 byte) a (4 byte) c (6 byte) int main() { int a; int b; char c[5 + 1]; … a = fce(5 * 3, b); … } int fce(int p, int q) { int r; char s[10+1]; r = p + 10; s[5] = p; s[q + 1] = ’\n’; return r; } main: … LOAD AX,[SP + 6] PUSH AX LOAD AX, 15 PUSH AX CALL fce ADD SP,8 STORE AX,[SP + 10] … fce: ADD SP,-15 LOAD AX,[SP + 15 + 4 + 4] ADD AX,10 STORE AX,[SP + 11] LOAD AX,[SP + 15 + 4 + 4] STORE AL,[SP + 5] LOAD BX,[SP + 15 + 4 + 0] INC BX ADD BX,SP MOV AL,10 STORE AL,[BX] LOAD AX,[SP + 11] ADD SP,15 RETURN SP b (4 byte) a (4 byte) c (6 byte) Zpřístupnění dat Lokální proměnná int r; LOAD AX,[SP + k] SP q (4 byte) int p (4 byte) int návratová adresa zpět do volající funkce r (4 byte) int s (11 byte) char [11] k Parametr void fce(int p, int q) LOAD AX,[SP + k] SP q (4 byte) int p (4 byte) int návratová adresa zpět do volající funkce r (4 byte) int s (11 byte) char [11] k Reference přes pointer int * r = &q; *r LOAD BX,[SP + k] LOAD AX,[BX] SP q (4 byte) int p (4 byte) int návratová adresa zpět do volající funkce r (4 byte) int * s (11 byte) char [11] k Atribut třídy, prvek struktury (jako lokální proměnná) struct x { int r; char s[10+1]; } o; LOAD AX,[SP + (k1 + k2)] SP q (4 byte) int p (4 byte) int návratová adresa zpět do volající funkce o.r (4 byte) int o.s (11 byte) char [11] k1 t (20 byte) int [5] u (4 byte) int k2 Prvek pole s konstantním indexem (jako lokální proměnná) t[3] LOAD AX,[SP + (k1 + 3*4)] SP q (4 byte) int p (4 byte) int návratová adresa zpět do volající funkce o.r (4 byte) int o.s (11 byte) char [11] k1 t (5*4 byte) int [5] u (4 byte) int 3*4 Prvek pole s nekonstantním indexem (jako lokální proměnná) int p = 3 t[p] LOAD BX,[SP + k2] MUL BX,k3 k3 = sizeof(int) ADD BX,k1 LOAD AX,[SP + BX] alternativně poslední instrukce: ADD BX, SP LOAD AX,[BX] SP q (4 byte) int p (4 byte) int návratová adresa zpět do volající funkce o.r (4 byte) int o.s (11 byte) char [11] k1 t (5*4 byte) int [5] u (4 byte) int k2 Prvek pole s nekonstantním indexem (na haldě) int * q int p = 3 q[p] LOAD BX,[SP + k2] MUL BX,k3 k3 = sizeof(int) ADD BX,[SP + k1] LOAD AX,[SP + BX] alternativně poslední instrukce: ADD BX, SP LOAD AX,[BX] SP q (4 byte) int * p (4 byte) int návratová adresa zpět do volající funkce o.r (4 byte) int o.s (11 byte) char [11] k1 t (5*4 byte) int [5] u (4 byte) int k2 (5*4 byte) int [5] heap Atribut třídy, prvek struktury (na haldě) struct x { int r; char s[10+1]; } o; q.r LOAD BX,[SP + k1] ADD BX,k2 LOAD AX,[BX] SP q (4 byte) struct x * p (4 byte) int návratová adresa zpět do volající funkce o.r (4 byte) int o.s (11 byte) char [11] k1 t (5*4 byte) int [5] u (4 byte) int struct x heap o.r (4 byte) int k2