計算機概論[2]
講師:溫室蔡
在紙帶上左右移動
讀取所在格子的符號
寫入所在格子的符號
儲存一個狀態
Python、JavaScript |
C/C++ |
組合語言 |
機器碼 |
int main(void) {
int a = 2;
int b = a + 3;
if (b < 4) {
return 1;
}
return 0;
}
預處理
編譯
連結
組譯
原始碼
機器碼
展開巨集
組合語言
機器碼
+函式庫
編譯
原始碼
組合語言
Lexer
Parser
Code
Generator
原始碼
組合語言
Tokens
AST
Lexer
Parser
Code
Generator
原始碼
組合語言
Tokens
AST
int main(void) {
int a = 2;
int b = a + 3;
if (b < 4) {
return 1;
}
return 0;
}
[關鍵字 int][識別符 main][左括號][關鍵字 void][右括號][左大括號]
[關鍵字 int][識別符 a][等號][數字 2][分號]
[關鍵字 int][識別符 b][等號][識別符 a][加號][數字 3][分號]
[關鍵字 if][左括號][識別符 b][小於][數字 4][右括號][左大括號]
[關鍵字 return][數字 1][分號]
[右大括號]
[關鍵字 return][數字 0][分號]
[右大括號]
[expression] =
3 [數字]
a [識別符]
a + 3 [識別符][加號][數字]
a < 4 [識別符][小於][數字]
a = 5 [識別符][等號][數字]
func() [識別符][左括號][右括號]
func1() + func2()
[expression][加號][expression]
if (...) {
...
} else {
...
}
while (...) {
...
}
for (...;...;...) {
...
}
int func(...) {
...
}
[關鍵字 if][左括號][expression][右括號][左大括號]
[expression]
[右大括號][關鍵字 else][左大括號]
[expression]
[右大括號]
[關鍵字 while][左括號][expression][右括號][左大括號]
[expression]
[右大括號]
[關鍵字 for][左括號][expression][分號][expression][分號][expression][右括號][左大括號]
[expression]
[右大括號]
[關鍵字 型別名稱][識別符][左括號][關鍵字 型別名稱][識別符][右括號][左大括號]
[expression]
[右大括號]
main
=
a
2
=
b
+
a
3
if
條件
本體
a
<
4
return
1
return
0
rax
eax
ax
ah
al
64 位元
32 位元
16 位元
8 位元
.text
.data
Heap
Free space
Stack
位址高
位址低
程式碼
全域變數
動態配置的記憶體
各函式的區域變數
位址高
位址低
main 的空間
< rsp(stack 頂)
< rbp
(main 空間底)
舊 rbp
位址高
位址低
main 的空間
< rsp
< rbp
舊 rbp
位址高
位址低
main 的空間
< rbp
舊 rbp
< rsp / rbp
func 的空間
位址高
位址低
main 的空間
< rbp
舊 rbp
< rsp
func 的空間
位址高
位址低
main 的空間
< rbp
舊 rbp
< rsp / rbp
func 的空間
位址高
位址低
main 的空間
< rsp
< rbp
舊 rbp