重溫51匯編指令(附實驗)
寫在前面:
在電子控制的課上,老師帶我們重溫了一些51的匯編指令,有了一些新的思考,感覺非常的有趣,所以這里進行總結和嘗試。
正文:
實驗平台:
keil5
實驗目標MCU:
intel的80C51BH
51寄存器的簡單介紹:
通過debug窗口可以進行觀察
符號以及寄存器意義:
1、r0~r7寄存器組的八個工作寄存器
2、a是累加器,用於運算以及存放數據
3、b是專用寄存器,用於MUL(乘法)、DIV(除法)存放第二操作數、乘積的高位字節、除法余數等。
4、psw屬於程序狀態字

4.1 p是奇偶標志位
p=1則累加器a中1的個數為奇數;p=0則累加器a中1的個數為偶數。
4.2 ov是溢出標志位,ov=0沒有溢出;ov=1溢出
這里進行完ab的乘法運算很顯然是溢出了,高8位放到了b中,低8位放在了a里。
4.3 rs是當前寄存器選擇位,就是說選擇不同的寄存器組。
4.4 f0用戶標志位,用戶可用軟件自定義的一個標志位。
4.5 cy進位標志位,存放算術運算的進位標志,布爾運算中作累加位使用。
執行add指令之前,a是80H,r4是8aH,相加應該是10aH(都是16進制)。
執行完add指令之后,a變成了0aH,進位標志位cy變成了1。
ac輔助進位標志位,做BCD運算時,低四位向高四位進位或錯位時,置1。
5、sp棧指針寄存器
默認sp的值位0x07,在執行堆棧操作、程序調用、子程序返回以及中斷返回等指令時,sp的值自動+1或-1
6、dptr數據指針寄存器
7、pc程序計數器
程序執行到什么位置了
states沒有查到專門解釋,我覺的可能是指令執行的數目,因為沒執行一條指令會+1,但有時候執行復雜一點的指令,會+3或者+4。
sec這個也沒有查到,我感覺應該和時間有關。
匯編指令:
每一種MCU都有自己獨特的匯編指令,有相似的地方,但也有很大的不同。所以匯編語言可移植性很不好,但勝在簡單高效。
指令格式
[標號]:操作碼 [目的操作數],[源操作數] ; [注釋]
指令分類
-
數據傳送指令 29條
- 把源地址中的操作數傳送到目的地址(寄存器)中
-
算術運算指令 24條
- 加減乘除等,第一操作數放在累加器A中,第二操作數放在某個寄存器或者片內RAM中,運算結果會保存在A中,因為運算產的進位標志、奇偶標志和溢出標志等保存在PSW中。
-
邏輯運算操作指令 24條
-
邏輯操作與循環移位兩類指令
-
邏輯運算:邏輯乘、邏輯加、邏輯取反、異或等。
-
也是先把一個操作數放在A中,執行結果也放在A中
-
-
位操作指令 17條
-
控制轉移指令 17條
尋址方式
-
直接尋址
- MOV A,36H把內部RAM 36H中的數據放在累加器A中
-
立即尋址
- MOV A,#20H操作數前加‘#’號就是立即數,不加就是直接地址
-
寄存器尋址
- MOV A,R0把當前R6中的內容送到累加器A中
-
間接尋址
-
MOV R0,#40H
-
MOV A,@R0
-
數據傳送類指令
MOV內部數據傳送指令
MOVC程序存儲器讀指令
MOVX外部數據傳送指令
XCH整字節交換指令
XCHD半字節交換指令
算術運算類指令
ADD不帶進位的加法指令
ADDC帶進位的加法指令
- 一開始給累加器a=0ach,再向累加器a中加98h,1010 1100 +1001 1000=1 0100 0101
- 會出現進位,所以這個時候進位標志位cy為1,輔助進位標志位ac為1,溢出標志位ov為1
INC加1指令
SUBB減法指令
DEC減一指令
DA十進制調整指令
68+89=157 結果a=57 進位標志位cy=1,這就是BCD加法程序
MUL乘法指令
注意乘積,高八位再b中,低八位在a中
DIV除法指令
邏輯運算指令
- ANL與
- ORL或
- XRL異或
- CLR清零
移位指令
- RL累加器左環移
- RR累加器右環移
- RLC累加器帶進位左環移
- RRC累加器帶進位右環移
控制轉移類指令
- LJMP長轉移指令
- AJMP絕對轉移指令
- SJMP短轉移指令
- JMP間接轉移指令
- JZ條件轉移指令(a=0)
- JNZ條件轉移指令(a不等於0)
- CJNE比較轉移指令
- DJNZ減一條件轉移指令
- LCALL調用指令(長)
- ACALL絕對調用指令
- RET返回指令(子程序)
- RETI返回指令(中斷服務程序)
寫在最后:
最后,希望上海疫情早點過去,我不想我的學生生活天天呆在宿舍里。/(ㄒoㄒ)/~~
祝大家早安、午安和晚安
