重溫51彙編指令(附實驗) 寫在前面: 在電子控制的課上,老師帶我們重溫了一些51的彙編指令,有了一些新的思考,感覺非常的有趣,所以這裡進行總結和嘗試。 正文: 實驗平臺: keil5 實驗目標MCU: intel的80C51BH 51寄存器的簡單介紹: 通過debug視窗可以進行觀察 符號以及寄存 ...
重溫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ㄒ)/~~
祝大家早安、午安和晚安