您的位置:網站首頁 > 電器維修資料網 > 正文 >
單片機偽指令
來源: 日期:2013-11-17 19:40:20 人氣:標簽:
單片機偽指令又叫做匯編控制指令,它是在匯編過程中起作用的指令,用來對匯編過程進行某種控制,或者對符號、標號賦值。偽指令和指令是完全不同的,在匯編過程中,偽指令并不產生可執行的目標代碼,大部份偽指令甚至不會影響存儲器中的內容。
org(匯編起始命令)org的功能為規定下面目標程序的起始地址。
格式:[標號:] org 16位地址。
其中括號內是任選項,可以沒有。
org偽指令總是出現在每段源程序或數據塊的起始位置,故稱為匯編起始命令。在一個源程序中,可以多次使用org指令,以規定不同的程序段的起始位置。但所規定的地址應該是從小到大,而且不允許有重疊,即不同的程序段之間不能有重疊。一個源程序若不用org指令開始,則從ooooh開始存放目標碼。
如:
表示主程序從0030h單元開始存放。
end(匯編結束命令)格式:[標號:] end其中括號內是任選項,可以沒有。
end是匯編語言源程序的結束標志,在end以后所寫的指令,匯編程序都不予處理。一個源程序只能有一個end命令。在同時包含有主程序和子程序的源程序中,也只能有一個end命令,并放到所有指令的 后。否則,在end之后就有一部分指令不能被匯編(編譯)。
equ(等值命令)equ的功能是將一個數或者特定的匯編符號賦予規定的字符名稱。
格式:字符名稱 equ數或匯編符號。注意,這里使用的是“字符名稱”,不是標號,而且也不用“:”來作分隔符,若加上“:”反而被匯編程序認為是一種錯誤。用equ指令賦值以后的字符名稱,可以用作數據地址、代碼地址、位地址或者直接當作一個立即數使用。因此,給字符名稱所賦的值可以是8位數,也可以是16位二進制數。使用equ偽指令時必須先賦值,后使用。而不能先使用,后賦值。
如:
表示經定義后,允許在指令中用fa代替rl。
又如:
表示經定義后,即給add賦以地址值1000h。
db或defb(定義字節命今)db的功能是從指定的地址單元開始,定義若干個字節作為內存單元的內容。
格式:[標號:]db字節形式的數據表這個偽指令是在程序存儲器的某一部分存入一組規定好的8位二進制數,或者是將一個數據表格存入程序存儲器。該偽指令在匯編以后,將影響程序存儲器的內容。
db命令所確定的單元地址可以由下述兩種方法之一來確定:若db命令是緊接著其它源程序的,則由源程序 后一條指令的地址加上該指令的字節數來確定;由org命令來規定首地址。
如:
表示首地址從0800h開始的一組數據表格。
dw或defw(定義字命令)其功能是從指定地址開始,定義若干個16位數據。
每個16位數要占rom的兩個單元,在51系列單片機中,16位二進制數的高8位先存入(低地址字節),低8位后存入(高地址字節)。
如:
表示表示首地址從0800h開始的一組16位數據表格。
db、dw偽指令都只對程序存儲器起作用,即不能用它們來對數據存儲器的內容進行賦值或其它初始化的工作。
ds或defs(預留存儲區命令)其功能是從指定地址開始,定義一個存儲區,以備源程序使用。存儲區預留的存儲單元數由表達式的值決定。
格式:[標號:]ds表達式值女口:
即由0500h地址開始保留連續的10個存儲單元存儲區。
bit(定義位命令)其功能用于給字符名稱定義位地址。
格式:字符名稱bit位地址如:
經定義后,允許在指令中用fl代替pl.l。
data(定義數據地址命令)其功能用于給字符名稱定義16位地址。通常用來定義數據地址。
格式:字符名稱data16位地址4.字節交換指令xcha,rn表示將寄存器rn中的內容與累加器a的內容相互交換。
xcha,direct表示把直接尋址單元direct中的內容與累加器a的內容相互交換。
xcha,@ri表示將寄存器ri中內容作為地址的單元內容(寄存器間接尋址單元)與累加器a的內容相互交換。
xchda,@ri表示將寄存器ri間接尋址單元的低4位內容與累加器a的低4位內容相互交換,而各自的高4位維持不變。
內部ram接下來做實驗,具體認識所學這些指令的作用。
現在我們做實驗,在s2板上實現:按下0~9鍵后,將立即數0~9輸入到累加器a中,左邊第二個數碼管用作輸入顯示。單片機根據累加器a中的數查其平方表,并且在右邊的兩個數碼管上顯示出來。在我的文檔中建立一個文件目錄(s13),然后建立s13.uv2的工程項目, 后建立源程序文件(s13.asm)。
輸入下面的程序:
編譯通過后,將s13文件夾中的hex文件燒錄到89c51芯片中,將芯片插入到s2型數碼管試驗板上,按下o鍵,左邊第二個數碼管顯示0,右邊的兩個數碼管上顯示00;按下1鍵,左邊第二個數碼管顯示1.右邊的兩個數碼管上顯示01:……按下9鍵,左邊第二個數碼管顯示9,右邊的兩個數碼管上顯示81。實現了根據輸入數查其平方表的功能。
我們對程序進行分析解釋。
序號1(程序解釋,以下同):程序開始。
序號2:跳轉到main主程序處。
序號3:主程序main從地址0030h開始。
序號4:調用鍵掃描子程序。
序號5:若累加器為o,跳轉到main處。
序號6:調用loms延時子程序,避開鍵抖動干擾。
序號7:再調用鍵掃描子程序。
序號8:若累加器a為0,說明無鍵輸入,跳轉到main處。否則說明有鍵輸入,順序執行。
序號9:向p3口送數7fh,準備讀取鍵輸入狀態。
序號10:有3鍵按下轉l3。
序號11:有6鍵按下轉l6。
序號12:有9鍵按下轉l9。
序號13:向p3口送數bfh,準備讀取鍵輸入狀態。
序號14:有2鍵按下轉l2。
序號15:有5鍵按下轉l5。
序號16:有8鍵按下轉l8。
序號17:有0鍵按下轉l0。
序號18:向p3口送數dfh,準備讀取鍵輸入狀態。
序號19:有1鍵按下轉ll。
序號20:有4鍵按下轉la。
序號21:有7鍵按下轉l7。
序號22:無有效鍵按下,跳轉到標號main處。
序號23:向累加器a送立即數00。
序號24:跳轉到標號goon處。
序號25:向累加器a送立即數01。
序號26:跳轉到標號goon處。
序號27:向累加器a送立即數02。
序號28:跳轉到標號goon處。
序號29:向累加器a送立即數03。
序號30:跳轉到標號goon處。
序號31:向累加器a送立即數04。
序號32:跳轉到標號goon處。
序號33:向累加器a送立即數05。
序號34:跳轉到標號goon處。
序號35:向累加器a送立即數06。
序號36:跳轉到標號goon處。
序號37:向累加器a送立即數07。
序號38:跳轉到標號goon處。
序號39:向累加器a送立即數08。
序號40:跳轉到標號goon處。
序號41:向累加器a送立即數09。
序號42:將累加器a內容送30h單元暫存。
序號43:將數碼管字段碼數據表格的首地址(0350h)存入16位數據地址指針dptr中。
序號44:根據a中內容查表。
序號45:查表結果送p2口顯示。
序號46:將30h單元內容送回累加器a。
序號47:將0—9平方表數據表格的首地址(0300h)存入16位數據地址指針dptr中。
序號48:根據a中內容查表。
序號49:將數碼管字段碼數據表格的首地址(0350h)存入16位數據地址指針dptr中。
序號50:將累加器a中內容壓棧。
序號51:屏蔽累加器a高4位。
序號52:根據a中內容查表。
序號53:累加器a中內容送po口顯示。
序號54:恢復累加器a中原內容。
序號55:交換累加器的高、低4位。
序號56:屏蔽累加器a高4位。
序號57:根據a中內容查表。
序號58:累加器a中內容送pl口顯示。
序號59:調用延時子程序,維持數碼管點亮。
序號60:跳轉到main處循環執行。
序號61:鍵掃描子程序從地址0200h開始。
序號62:鍵掃描子程序開始,向p3口送數ofh,準備讀鍵輸入。
序號63:將p3口狀態讀入累加器a中。
序號64:累加器a與立即數foh相或。
【看看這篇文章在百度的收錄情況】