嵌入式系統 - 組合語言



組合語言的開發是為了為機器級程式碼指令提供**助記符**或符號。組合語言程式由助記符組成,因此它們應該被翻譯成機器程式碼。負責這種轉換的程式被稱為**彙編器**。組合語言通常被稱為低階語言,因為它直接與 CPU 的內部結構互動。要使用匯編語言程式設計,程式設計師必須瞭解 CPU 的所有暫存器。

C、C++、Java 等不同的程式語言以及其他各種語言被稱為高階語言,因為它們不涉及 CPU 的內部細節。相反,彙編器用於將組合語言程式翻譯成機器程式碼(有時也稱為**目的碼**或**操作碼**)。類似地,編譯器將高階語言翻譯成機器程式碼。例如,要使用 C 語言編寫程式,必須使用 C 編譯器將程式翻譯成機器語言。

組合語言的結構

組合語言程式是一系列語句,這些語句要麼是組合語言指令(例如 ADD 和 MOV),要麼是稱為**指令**的語句。

**指令**告訴 CPU 要做什麼,而**指令**(也稱為**偽指令**)則向彙編器發出指令。例如,ADD 和 MOV 指令是 CPU 執行的命令,而 ORG 和 END 是彙編器指令。當使用 ORG 指令時,彙編器將操作碼放置到記憶體位置 0,而 END 指示原始碼的結尾。程式語言指令由以下四個欄位組成:

[ label: ]   mnemonics  [ operands ]   [;comment ] 

方括號([ ])表示該欄位是可選的。

  • **標號欄位**允許程式透過名稱引用程式碼行。標號欄位不能超過一定數量的字元。

  • **助記符**和**運算元欄位**一起執行程式的實際工作並完成任務。語句如 ADD A , C & MOV C, #68 其中 ADD 和 MOV 是助記符,它們生成操作碼;“A, C”和“C, #68”是運算元。這兩個欄位可能包含指令。指令不會生成機器程式碼,僅供彙編器使用,而指令則被翻譯成機器程式碼供 CPU 執行。

1.0000         ORG  0H            ;start (origin) at location 0 
2 0000 7D25    MOV  R5,#25H       ;load 25H into R5 
3.0002 7F34    MOV  R7,#34H       ;load 34H into  R7 
4.0004 7400    MOV  A,#0          ;load 0 into A 
5.0006 2D      ADD  A,R5          ;add contents of R5 to A 
6.0007 2F      ADD  A,R7          ;add contents of R7 to A
7.0008 2412    ADD  A,#12H        ;add to A value 12 H 
8.000A 80FE    HERE: SJMP HERE    ;stay in this loop 
9.000C END                        ;end of asm source file
  • **註釋欄位**以分號開頭,分號是註釋指示符。

  • 請注意程式中的標號“HERE”。任何引用指令的標號都應後跟冒號。

彙編和執行 8051 程式

這裡我們將討論組合語言的基本形式。建立、彙編和執行組合語言程式的步驟如下:

  • 首先,我們使用編輯器鍵入類似於上述程式的程式。所有 Microsoft 作業系統附帶的像 MS-DOS EDIT 程式這樣的編輯器可用於建立或編輯程式。編輯器必須能夠生成 ASCII 檔案。原始檔的“asm”副檔名在下一步由彙編器使用。

  • “asm”原始檔包含在步驟 1 中建立的程式程式碼。它被饋送到 8051 彙編器。然後,彙編器將組合語言指令轉換為機器程式碼指令,並生成一個**.obj 檔案**(目標檔案)和一個**.lst 檔案**(列表檔案)。它也稱為**原始檔**,因此某些彙編器要求此檔案具有“src”副檔名。“lst”檔案是可選的。它對程式非常有用,因為它列出了所有操作碼和地址以及彙編器檢測到的錯誤。

  • 彙編器需要第三步,稱為**連結**。連結程式獲取一個或多個目標檔案,並生成一個副檔名為“abs”的絕對目標檔案。

  • 接下來,“abs”檔案被饋送到一個名為“OH”(目標到十六進位制轉換器)的程式,該程式建立一個副檔名為“hex”的檔案,該檔案已準備好刻錄到 ROM 中。

Steps to create program

資料型別

8051 微控制器包含一個 8 位的單一資料型別,每個暫存器也是 8 位大小。程式設計師必須將大於 8 位(00 到 FFH,或十進位制 255)的資料分解,以便它可以由 CPU 處理。

DB(定義位元組)

DB 指令是彙編器中使用最廣泛的資料指令。它用於定義 8 位資料。它還可以用於定義十進位制、二進位制、十六進位制或 ASCII 格式的資料。對於十進位制,十進位制數後的“D”是可選的,但對於“B”(二進位制)和“Hl”(十六進位制)是必需的。

要指示 ASCII,只需將字元放在引號中('像這樣')。彙編器會自動為數字/字元生成 ASCII 程式碼。DB 指令是唯一可用於定義大於兩個字元的 ASCII 字串的指令;因此,它應該用於所有 ASCII 資料定義。下面給出了一些 DB 的示例:

        ORG  500H 
DATA1:  DB   28                     ;DECIMAL (1C in hex) 
DATA2:  DB   00110101B              ;BINARY  (35 in hex) 
DATA3:  DB   39H                    ;HEX 
        ORG  510H 
DATA4:  DB   "2591"                 ;ASCII  NUMBERS 
        ORG  520H                         
DATA6:  DA   "MY NAME IS Michael"   ;ASCII CHARACTERS 

ASCII 字串周圍可以使用單引號或雙引號。DB 也用於以位元組大小的塊分配記憶體。

彙編器指令

8051 的一些指令如下:

  • **ORG(原點)** - 原點指令用於指示地址的開始。它採用十六進位制或十進位制格式的數字。如果數字後提供 H,則該數字將被視為十六進位制,否則為十進位制。彙編器將十進位制數轉換為十六進位制。

  • **EQU(等價)** - 它用於定義常量而不佔用記憶體位置。EQU 將一個常數值與資料標號關聯,以便標號出現在程式中,其常數值將替換為標號。在執行指令“MOV R3, #COUNT”時,暫存器 R3 將載入值為 25(注意 # 符號)。使用 EQU 的優點是程式設計師可以更改它一次,彙編器將更改其所有出現;程式設計師不必搜尋整個程式。

  • **END 指令** - 它指示源(asm)檔案的結尾。END 指令是程式的最後一行;END 指令後的任何內容都會被彙編器忽略。

組合語言中的標號

組合語言中的所有標號都必須遵循以下規則:

  • 每個標號名稱必須唯一。組合語言程式設計中用於標號的名稱由大寫和小寫字母、數字 0 到 9 以及特殊字元組成,例如問號(?)、句點(.)、@ 符號、下劃線(_)和美元符號($)。

  • 第一個字元應為字母字元;它不能是數字。

  • 保留字不能用作程式中的標號。例如,ADD 和 MOV 字是保留字,因為它們是指令助記符。

廣告