Presentation is loading. Please wait.

Presentation is loading. Please wait.

組合語言和程式範例.

Similar presentations


Presentation on theme: "組合語言和程式範例."— Presentation transcript:

1 組合語言和程式範例

2 程式規劃語言 高階語言 低階語言

3 高階語言特點 多對一翻譯 硬體獨立性 應用導向 通用 階層概念

4 低階語言特點 一對一翻譯 硬體相依性 系統導向 專用 無階層概念

5 階層概念 低階語言沒有明顯的階層概念。 低階語言想要建立階層概念,必須逐步地建構自己的階層機制。 電腦科學家Alan Perlis曾經說過:
因為大多數的應用程式無法直接控制底層硬體,所以某些程式規劃若涉及硬體細節時,就表示:使用的程式語言必須是低階語言,但低階語言會增加整體程式規劃的複雜度。

6 專用術語 組合語言 低階語言 專用於特定的處理器 組譯器 將組合語言翻譯成電腦硬體所認識的二進位碼 可與編譯器作一下比較

7 重要觀念 組合語言是低階語言,可以指出各種不同處理器的特點,比如:指令集、運算元定址、暫存器、…等,因此存在多少種處理器,就會存在多少種組合語言。

8 組合語言 想要把組合語言的程式,從某個處理器移植到另一個處理器時,必須改寫成另一種組合語言。
還好!大部分的組合語言都遵循著電腦結構的基本圖像,因此可以在最短的時間內,快速地學會其它的組合語言。

9 敘述格式 組譯器要求一行只能輸入一個指令,指令格式如下: 標記:運算子 運算元1, 運算元2, … 標記(選項)用來標示敘述的位置
標記:運算子 運算元1, 運算元2, … 標記(選項)用來標示敘述的位置 運算子指出該指令想要執行的運算 運算元則指出參與運算的數值

10 組合語言之指令行 標籤欄: 運算子欄 運算元欄 基本組合語言指令行為四欄式 ;註解欄 標籤(選用, 視情況需要使用)
運算子:指令助憶符號(必要) 運算元(通常需要) 註解(選用, 最好養成說明程式習慣) 標籤欄: 運算子欄 運算元欄 ;註解欄 10 10

11 運算子 指定CPU之動作, 以指令助憶符號(instruction Mnemonic)表示。 依指令用途運算元有0~3個。
標籤欄: 運算子欄 運算元欄 ;註解欄 指定CPU之動作, 以指令助憶符號(instruction Mnemonic)表示。 依指令用途運算元有0~3個。 CPU指令集格式:學習指令功能與用法。 11

12 指令助憶符號 指令助憶符號(instruction Mnemonic) :CPU指令集, 用簡短之英文字幫助記憶。 以MASM為例,如:
mov(move 搬移、複製) 、sub(substration減)、mul( multply乘)、jmp(jump跳至位址) 、call(call呼叫程序) 加法指令,英文全名為addition,組合語言簡寫為add。 分支指令,英文全名為branch,組合語言簡寫為b或br。 副程式呼叫指令,英文全名為jump to a subroutine,組合語言簡寫為jsr。 12

13 CPU指令集指令說明格式與要點 指令說明格式與要點 學組合語言要件 瞭解指令集 指令集:MASM指令集、指引指令 指令名稱:簡單說明
影響旗標(狀態暫存器) 功能與用途 指令格式 學組合語言要件 瞭解指令集 指令集:MASM指令集、指引指令 13

14 註解方式 為了增加這些指令的可讀性,設計師會適當地加入註解,來加以說明。 註解符號比如: 井字號( # ) 分號(;) 雙斜線(//)

15 註解類型 註解可以是中文,也可以是英文。 通常有兩種類型: 區塊註解說明每一段程式碼的目的; 行註解則在每一行指令後,註記該行的細節。

16 區塊註解 ####################################################
# Search linked list of free memory blocks to find a block # # of size N bytes or greater. Pointer to list must be in # # register 3, and N must be in register 4. The code also # # destroys the contents of register 5, which is used to # # walk the list #

17 行註解 loop_1: cmp r5,r0 # 測試表單是否已經達末端 bz notfnd # 如果確實到達末端,則前往notfnd標記處
ld r5,r3 # 載入表單位址到r5 loop_1: cmp r5,r0 # 測試表單是否已經達末端 bz notfnd # 如果確實到達末端,則前往notfnd標記處

18 運算元 可以是常數、記憶體變數、暫存器。 暫存器可直接使用。 常數分常數符號與數字 記憶體變數,需使用資料定義指引指令定義後,才可使用。
標籤欄: 運算子欄 運算元欄 ;註解欄 可以是常數、記憶體變數、暫存器。 暫存器可直接使用。 常數分常數符號與數字 常數符號需以指引指令先定義 記憶體變數,需使用資料定義指引指令定義後,才可使用。 18

19 運算元定義 定義運算元 定義記憶體變數運算元變數之MASM範例。 定義常數符號運算元常數符號之MASM範例。
定義暫存器運算元使用CPU內建之暫存器保留字。 19

20 運算元順序 不同的組合語言可能有不同的排列順序 範例如下: load把r3內容複製到r5,可能有二種排列: ld r5,r3 #右到左排列
程式設計師往往必須看過組合語言手冊,才能瞭解某些指令的運算元順序。

21 運算元直譯 組譯器會把組合語言翻譯成二進位碼。
本質上,”左至右”直譯法和”右到左”直譯法並沒有什麼差別,因為在翻譯期間,再重新排序運算元,即可。

22 暫存器名稱 暫存器名稱並沒有通用的標準。 常見的方式是使用r(或$ )字母開頭,隨後加上數字,來編號暫存器,比如,暫存器10的表示法:
reg10 r10 R10 $10

23 自行定義暫存器名稱 有些更彈性,組譯器可以讓程式設計師自行選擇暫存器名稱 範例: # # 自行定義暫存器名稱
# 自行定義暫存器名稱 r1 register 1 #定義r1等於暫存器1 r2 register 2 #定義r2等於暫存器2 r3 register 3 #定義r3等於暫存器3 r4 register 4 #定義r4等於暫存器4

24 有意義的暫存器名稱 程式設計師不一定使用制式名稱(像是r6),可以自行命名對自己程式更有意義的暫存器名稱,如下: #
# 自行定義連結串列程式的暫存器名稱 listhd register 6 #定義listhd等於暫存器6 listptr register 7 #定義listptr等於暫存器7

25 運算元型態 大部分的處理器會提供多重運算元型態,比如:暫存器內容、立即值、記憶體參考、間接記憶體參考。
運算元型態可以使用特定的字元或符號,來指定記憶體或常數。 mov r2,r1 #複製r1的內容到r2 mov r2,(r1) #把r1當作記憶體指標,並且把其指向 #的記憶體內容複製到r2

26 程式範例和習慣用語 大部分高階語言具有明顯的型式要求 但低階的組合語言沒有任何的限制 組合語言空間廣泛,卻存有幾許繁瑣的枝微細節。
有經驗的程式設計師瞭解:一致性和清晰度的重要性。

27 條件指令

28 另一種條件指令

29 有限迴圈指令

30 無限迴圈指令

31 程序呼叫指令

32 引數傳輸 在組合語言中,引數如何傳輸給程序呢? 組合語言通常依靠硬體,來傳輸引數。 比如,下列三種常見的硬體策略:
使用堆疊(記憶體內部),來傳輸引數。 使用暫存器視窗,來傳輸引數。 使用專用的引數暫存器,來傳輸引數。

33 對程式設計師的影響 由於組合語言在傳輸參數時,並沒有一種共同的標準,因此不同處理器可能使用各自發展的引數傳輸硬體,必要時,程式設計師甚至於可以使用不同於原先硬體機制的參數傳輸策略,來最佳化效能(比如:暫存器傳輸參數)。

34 參數程序呼叫 呼叫程序使用r1到r8,來傳輸引數。

35 函數呼叫指令 函數和程序有些相似 傳回值有多種建構的觀念,比如:
函數會有傳回值 程序不會有傳回值 傳回值有多種建構的觀念,比如: 運用堆疊 建立專用暫存器 使用通用暫存器 當函數執行ret指令,函數會把傳回值放到以上所指定的位置,等到結束函數後,呼叫程式才能取回該傳回值。

36 組合語言和高階語言的互動 高階程式可以直接呼叫組合語言所撰寫的程序或函數;組合語言程式也可以呼叫高階語言所撰寫的程序或函數。
為什麼要混合組合語言碼和高階程式碼呢?可能的原因: 底層電路硬體無法使用高階語言進行規劃 改善效能瓶頸 常見的情況就是:使用組合語言撰寫程序或函數,其它大部分程式則保留高階語言撰寫,最後由高階程式直接呼叫該組合語言所撰寫的程序或函數。

37 實作取捨 因為使用組合語言來撰寫應用程式,實在非常沒有開發效率,過程也相當複雜,因此大部分的情況下,組合語言只是輔助高階語言,局部強化某些不足的功能或進行效能的改善。

38 變數儲存指令 大部分的組合語言能讓程式設計師自行定義資料項目。 比如:宣告啟始變數或非啟始變數: .word .byte 或 .char
.long

39 等效宣告範例

40 寫入初始值 .word和.long並非一般傳統的指令 這種變數儲存指令可以控制組譯器保留變數的儲存位置,寫入初始值,比如:
x: .word 949

41 組譯器 組譯器是一種軟體 組譯器用來翻譯組合語言的程式,並將其轉譯成可執行的二進位碼。 一般組譯器使用兩階段組譯法 輸入為組合語言的原始程式
輸出則變成可執行的二進位碼 一般組譯器使用兩階段組譯法

42 組譯器和編譯器的差別 儘管,編譯器和組譯器兩者都把原始程式翻譯成等效的二進位碼,然而編譯器有更多的自由可以:選擇置放在暫存器的數值、等效解釋敘述(通常一個敘述多個二進位碼)、以及配置變數給記憶體;至於,組譯器則只是提供一對一的直接翻譯,一個原始程式的敘述會被翻譯成一個等效的二進位碼。

43 兩階段組譯法 組譯器的翻譯觀念遵循兩階段組譯法 為什麼需要兩階段組譯? 第一組譯階段(first pass)
第二組譯階段(second pass) 為什麼需要兩階段組譯? 程式內有許多指令涉及分支參考的標記 組譯器必須標明敘述的相關位址

44 組譯範例

45 組譯的一般觀念 組譯器通常會使用兩階段組譯法,來翻譯組合語言程式的二進位碼:在第一組譯階段,組譯器會指定每一個敘述的位置,等到第二組譯階段時,組譯器才能使用這些位置,來產生二進位執行碼。

46 組合語言的巨集指令 某些程式碼不斷地重複,程式設計師如果採用剪貼策略,將讓程式看起來更瑣碎、更煩心、更難規劃,容易發生錯誤。
避開程式碼重複規劃的方法,可以使用參數化巨集功能。 巨集功能必須先在原始程式上,加入兩個項目: 巨集定義(definitions) 巨集展開(expansions)

47 巨集關鍵字 大部分組合語言的巨集規劃細節雖然並不相同,但觀念相通。 比如,巨集使用特定的關鍵字來加以定義:
marco endmacro 在這兩個關鍵字的中間,加入本文指令。

48 巨集範例

49 巨集展開範例

50 巨集展開的置換動作 巨集展開的置換動作和一般的程序(或副程式)呼叫不同,下列三點: 巨集宣告不同於程序(或副程式)的二進位執行檔
巨集展開會把完整的巨集本文指令,一個一個地插入程式內部。 巨集引數會被當作字串,取代對應的參數。

51 不正常的巨集展開

52 結論 組合語言是低階語言,融合處理器的硬體特性。 一個處理器至少會有一種組合語言;多種處理器有多種組合語言。
大部分組合語言遵循相似的基本結構 。 條件執行、條件分支; 有限迴圈、無限迴圈; 副程式呼叫、副程式返回; 引數傳數、返回位址儲存; 函數的傳回值。

53 結論(Cont.) 組譯器是一種翻譯軟體,對原始程式通常有兩個組譯階段: 組譯器使用巨集,幫助程式設計師避免重複程式碼的困擾。
第一階段是指定位址 第二階段則是產生執行碼 組譯器使用巨集,幫助程式設計師避免重複程式碼的困擾。 巨集展開器會使用本文置換法,重整原始程式,建立另外一個新的原始延伸程式,然而展開過程並不偵錯,因此有可能出現不正常的原始延伸程式。


Download ppt "組合語言和程式範例."

Similar presentations


Ads by Google