教科书:系统程式-第7章、高阶语言.PPT

  1. 1、本文档共56页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
教科书:系统程式-第7章、高阶语言

直譯器的演算法 (2) 直譯器的演算法 (3) 7.5 實務案例:C 語言 C 語言的語法及語意 基本單元、指定結構、運算結構、循序結構、分支結構、迴圈結構、函數結構 C 語言的執行環境 程式段、資料段、BSS段 使用框架存取參數與區域變數 C 語言的語法及語意 基本單元 x, 35, hello!, x[3], f(x), f(), rec.x, rec-x, x++, x– 指定結構 a=3*x 運算結構 a * 3 + b[5] 循序結構 i=1; x=f(3); t=a; a=b; b=t; 分支結構 if(ab) x=a; else x=b; 迴圈結構 for (i=0; i10; i++) sum += i; 函數結構 int max(x,y) { return xy?x:y; } c = max(a,b); 語法:基本單元 範例 X 35 hello!“ x[3] f(x) f() rec.x rec-x x++ x– 語法:指定結構 範例 a=3*x a = b = 3*x a = (x != y) 語法:運算結構 範例:a * 3 + b[5] additive_exp (a*3+b) : additive_exp (a*3) + mult_exp (b[5]) 語法:循序結構 範例 i=1; x=f(3); t=a; a=b; b=t; 語法:分支結構 範例: if (ab) x=a; else x=b; switch (c) { case ‘a’: x+=a; case ‘b’: x+=b; default: x+=c; } 語法:迴圈結構 範例 while (true) { …} do { … } while (! end) for (i=0; i10; i++) { sum += i; } 語法:函數結構 函數結構的範例 語法 function_def = decl_specs declarator decl_list compound_stat 範例 static int f(n) int n; {return n*n; } decl = static spec = int declarator = f(n) decl_list = int n; compound_stat = {return n*n; } C 語言的執行環境 編譯式語言 C 語言通常採用編譯的方式, 先將程式編譯為機器碼 (目的檔或執行檔), 然後才在目標平台上執行 C 語言。 目標:特定 CPU 的機器碼 C 語言編譯後的機器碼通常是與平台相關的, 是可以直接被 CPU 執行的 2 進位碼, 因此速度非常的快, 這也是 C 語言的優點之一。 編譯與執行環境 編譯後 C 語言在執行時, 通常會編譯為目的檔或執行檔的形式, 這個些檔案包含程式段、資料段、BSS 段等區域 執行時 在執行時還會多出堆疊 (Stack) 與堆積 (Heap) 等兩個區段。 圖 7.17 C 語言的執行時的記憶體配置圖 程式段 .text 堆積段 (heap) 堆疊段 (stack) 資料段 .data 未初始化資料 .bss 使用中堆積區塊 使用中堆積區塊 已釋放區塊 使用中堆積區塊 已釋放區塊 使用中堆積區塊 程式段 .text 資料段 .data 未初始化資料 .bss 堆積段 (heap) 堆疊段 (stack) (a) 程式開始時的記憶體分配情況 (b) 程式執行中的記憶體分配情況 使用中的堆疊 堆疊與堆積 堆疊段的用途: 儲存「區域變數」、 「參數」、 「返回點」 堆積段的用途: 提供 malloc() 的空間,並在 free() 時回收。 比較 與堆積段的成長方向是相反的, 假如堆積由上往下成長, 堆疊段的成長方向就會是由下往上。堆疊與堆積兩段共用同一塊記憶體空間, 但是起始點與成長方向完全相反。 C 語言如何存取堆疊中的區域變數 問題:必須支援遞回呼叫 當 C 語言的函數想要存取參數或區域變數時, 通常不能透過變數名稱存取這些變數, 否則就不能支援遞迴呼叫了。 因為在遞迴呼叫的過程中, 參數名稱與區域變數的名稱雖然相同, 但是不同層次的遞迴所『看見的』變數內容是不同的。 框架 一個函數的參數與區域變數所形成的堆疊區塊, 通常稱之為框架 (Frame) 為了要存取這個框架, 我們可以設定一個框架暫存器 (Frame Pointer, FP), 然後使用相對定址的方式存取這些變數。 在 CPU0 中, 我們會習慣以 R11 作為框架暫存器, 因此我們也用 FP 稱呼 R11。 使用框架

文档评论(0)

2105194781 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档