MCS-51单片机汇编语言程序设计
文章目錄
- 前言
- 一、匯編的方法
- 1.手工匯編:
- 2.機器匯編:
- 二、偽指令
- 一、匯編語言指令類型
- 二.偽指令 常用偽指令及功能
- 三、匯編語言程序設計步驟
- 四、常用的順序結構
- 1、 順序程序設計
- 2 、 分支程序的設計
- 3 、 多分支散轉程序的設計
- 五、 循環程序設計
- 一、初始化部分
- 二、循環體
- 三、結束部分
- 四、 單重循環,簡單循環結構:循環體中不套循環。
- 六、位操作程序設計
- 七、子程序
- 1、按子程序與主程序之間傳遞參數的方式分類。
- 總結
前言
MCS-51單片機的編程語言可以是匯編語言也可以是高級語言(如C語言)。
高級語言編程快捷,但程序長,占用存儲空間大,執行慢;
匯編語言產生的目標程序簡短,占用存儲空間小,執行快,能充分發揮計算機的硬件功能。
無論是高級語言還是匯編語言,源程序都要轉換成目標程序(機器語言)單片機才能執行。
目前很多公司將編輯器、匯編器、編譯器、連接/定位器、符號轉換程序做成集成軟件包,用戶進入該集成環境,編輯好程序后,只需點擊相應菜單就可以完成上述的各步,如KEIL 集成軟件。
一、匯編的方法
1.手工匯編:
人工查指令表,查出程序中每條指令對應的機器代碼。早期的計算機使用。
2.機器匯編:
用計算機中的匯編程序對用戶源程序進行匯編。
用機器匯編要提供給匯編一些信息,遵循匯編程序的一些約定(這些由偽指令指定)。
1)確定程序中每條匯編語言指令的指令機器碼
2)確定每條指令在存儲器中的存放地址
3)提供錯誤信息
4)提供目標執行文件(.OBJ/.HEX)和列表文件(*.LST)
二、偽指令
一、匯編語言指令類型
二.偽指令 常用偽指令及功能
1.起始指令 ORG nn
功能:定義程序或數據塊的起始地址。指示此語句后面的程序或數據塊以nn為起始地址,連續存放在程序存儲器中。
指令地址 機器碼 源程序
ORG 2000H
2000H 78 30 MAIN: MOV R0,#30H
2002H E6 MOV A,@R0
2.字節定義 標號: DB(字節常數,或字符或表達式)
功能:指示在程序存儲器中以標號為起始地址的單元里存放的數為字節數據(八位二進制數)。
例如:
LN:DB 32,’C’,25H,-1;
LN~LN+2 地址單元依次存放20H , 43H , 25H ,FFH
作用: 指示在程序存儲器中以標號為起始地址
的單元里存放的數為字數據(即16位的二進制數)
例如:
GH :DW 1234H,5678H,08
4.保留字節 標號:DS (數值表達式)
作用: 指示在程序存儲器中保留以標號為起始地
址的若干字節單元,其單元個數由數值表達式指定。
例如 L1:DS 32 ; 從L1地址開始保留32個存儲單元。
作用: 同EQU指令,不過定義的是位操作地址。
例如 AIC BIT P1.1。
7.匯編結束 END
作用: 指示源程序段結束。
END指令放在程序的最后。
三、匯編語言程序設計步驟
一.確定方案和計算方法
二.了解應用系統的硬件配置、性能指標
三.建立系統數學模型,確定控制算法和操作步驟
四.合理分配存儲器單元和了解I/O接口地址
五. 編制源程序
1.按功能設計程序,明確各程序之間的相互關系
2. 用流程圖表示程序結構和功能
3.程序中用注釋說明指令在程序中的作用,方便閱讀、調試和修改
四、常用的順序結構
順序程序
分支程序
循環程序
子程序
1、 順序程序設計
順序程序(簡單程序),程序走向只有一條路徑
例1:編程將外部數據存儲器的000EH和000FH單元的內容相換
分析: 外部數據存儲器的數據操作只能用MOVX指令,且只能和A之間傳送,因此必須用一個中間環節作暫存,設用20H單元。使用DPTR指示地址。編程過程如下:
MOV DPTR, #000EH
MOVX A, @DPTR
MOV R0, A
MOV DPTR, #000FH
MOVX A, @DPTR
XCH A, R0
MOVX @DPTR, A
MOV A,R0
MOV DPTR, #000EH
MOVX @DPTR, A
2 、 分支程序的設計
由條件轉移指令構成程序判斷框部分,形成分支結構
一個判斷決策框,兩種分支結構圖。
例1 求8位有符號數的絕對值,數據存放在A中。
ORG 0000H
MOV A,R2
JNB ACC.7,N ;為正數?
CPL A ;負數變補
INC A
MOV R2,A
N: SJMP $ ;結束
3 、 多分支散轉程序的設計
情況一:該類分支程序根據不同的輸入條件或不同的運算結果,轉向不同的處理程序,也稱之為散轉程序。這類程序通常利用
JMP @A+DPTR間接轉移指令實現轉移。有如下兩種設計方法:
將轉移地址列成表格,將表格的內容作轉移的目標地址。
將轉移到不同程序的轉移指令列成表格,判斷條件后查表,轉到表中指令執行,下面舉例說明。
五、 循環程序設計
循環程序的構成:
一、初始化部分
循環準備工作。如:清結果單元、設指針、設循環控制變量初值等。二、循環體
循環工作部分:需多次重復處理的工作
循環控制部分:
1.修改指針和循環控制變量。
2.檢測循環條件:滿足循環條件繼續循環;否則退出循環。
三、結束部分
處理和保存循環結果。四、 單重循環,簡單循環結構:循環體中不套循環。
循環控制方法:計數控制、特征標志控制。
一、特征控制:設定循環結束標志實現循環控制。
二、 多重循環,循環體中套循環結構。以雙重循環使用較多。
六、位操作程序設計
MCS-51單片機有著優異的位邏輯功能,可以方便的實現各種復雜的邏輯運算。這種用軟件替代硬件的方法可以大大簡化甚至完全不用硬件,但比硬件要多花運算時間。
能夠進行位操作的區域之前我們已經說過了
大家只有記住這兩張圖就行了。其中的位尋址區,和特殊功能寄存器區
七、子程序
子程序:完成確定任務,并能為其他程序反復調用的程序段。要求子程序在結構上具有通用性和獨立性.
子程序編寫注意的問題:
① 子程序入口用標號作為子程序名,子程序調用:ACALL、LCALL ;
② 調用子程序之前設置好堆棧;
③ 用返回指令RET結束子程序,并保證堆棧棧頂為調用程序的返回地址
④ 子程序嵌套須考慮堆棧容量,即嵌套深度與堆棧區大小的問題
⑤ 注意子程序數據存儲器的使用不要與主程序及其它子程序沖突
⑥提供足夠的調用信息:
如:子程序名、子程序功能、入口參數和出口參數、子程序占用的硬件資源、子程序中調用的其他子程序名。
1、按子程序與主程序之間傳遞參數的方式分類。
入口參數:調用子程序之前,需要傳給子程序的參數。
出口參數:子程序送回調用程序的結果參數。
設計子程序應滿足通用性的要求,一般不針對具體數據編程。
如:1.子程序功能為求單字節數的立方:
A?A3,入口參數和輸出參數為A。
2.子程序功能為求單字節數的n次方: (41H)(42H)?(40H)A,入口參數為(40H)和A,出口參數
為(42H)(41H)。
選用不同的參數傳遞方式。
1.寄存器傳送參數
2.存儲器傳送參數
3.堆棧傳送參數
總結
1、程序設計的關鍵在于指令熟悉和算法(思路)正確、清晰,對復雜的程序應先畫出流程圖。只有多做練習多上機調試,熟能生巧,才能編出高質量的程序。
2、偽指令是非執行指令,提供匯編程序以匯編信息,應正確使用。
總結
以上是生活随笔為你收集整理的MCS-51单片机汇编语言程序设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 多线程开发-线程创建pthr
- 下一篇: STM32的I2C主从机通信