算術運算類指令
算術運算類指令的功能是進行加、減、乘、除4種基本算術運算。它包括加法指令、減法指令、乘法指令、除法指令和十進位數調整指令。
1.加法指令
加法指令又分不帶進位的加法指令、帶進位的加法指令和加1指令。
(1)不帶進位的加法指令
不帶進位的加法指令的操作碼助記符是「ADD」。
指令格式:ADD A,操作數2
指令的功能是將操作數2與累加器A中的數據相加,結果保存在A中。
不帶進位的加法指令有4條,各條指令的形式和功能如下:
下面舉兩個例子來說明不帶進位的加法指令的功能。
① ADD A,#36H。在指令執行前,如果累加器A中的數據為56H,那麼指令執行後,累加器A中的數據為8CH(36H+56H)。
② ADD A,R6。在指令執行前,如果累加器A 中的數據為78H(01111000),R6 中的數據為89H(10001001),那麼指令執行後,相加得到的數據為101H(100000001),由於累加器A是一個8位寄存器,所以只能存儲8位數00000001(01H),而最高位D7的進位會保存在PSW的進位標誌位(CY)中,讓(CY)=1,另外兩個數據的低4位相加(1000+1001)時,D3位會向高位D4位進位,在進位的同時會將PSW的輔助進位標誌位(AC)置「1」。
(2)帶進位的加法指令
帶進位的加法指令的操作碼助記符是「ADDC」。
指令格式:ADDC A,操作數2
指令的功能是將操作數2與累加器A中的數據相加,再與PSW中CY位的數據相加,結果保存在累加器A中。
帶進位的加法指令有4條,各條指令的形式和功能如下:
下面舉例說明帶進位的加法指令的功能。
例如:ADDC A,#36H
在指令執行前,如果累加器A中的數據為56H,寄存器PSW中CY位的數據為「1」,那麼指令執行後,累加器A中的數據為8DH(36H+56H+1)。
(3)加1指令
加1指令又稱增量指令,它的操作碼助記符是「INC」。
指令格式:INC 操作數
指令的功能是將操作數加1,結果仍保存在該操作數中。加1指令有5條,各條指令的形式和功能如下:
下面舉例說明加1指令的功能。
例如:INC @R0
在指令執行前,如果寄存器R0中的地址為56H,56H單元中的數據為35H,那麼指令執行後,56H單元中的數據為36H。
2.減法指令
減法指令又分帶借位的減法指令和減1指令。
(1)帶借位的減法指令
帶借位的減法指令的操作碼助記符是「SUBB」。
指令格式:SUBB A,操作數2
指令的功能是將累加器A中的數據減去操作數2,再減去PSW中CY位的數據,結果保存在累加器A中。
帶借位的減法指令有4條,各條指令的形式和功能如下:
下面舉例說明帶借位的減法指令的功能。
例如:SUBB A,R6
在指令執行前,如果累加器A中的數據為89H,寄存器R6中的數據為78H,CY位中的數據為1,那麼指令執行後,累加器A中的數據為10H(89H78H1)。
如果不需要借位,可先將CY位清0,清0指令將在後面介紹。
(2)減1指令
減1指令的操作碼助記符是「DEC」。
指令格式:DEC 操作數
指令的功能是將操作數減1,結果仍保存在該操作數中。
減1指令有4條,各條指令的形式和功能如下:
下面舉例說明減1指令的功能。
例如:DEC @R0
在指令執行前,如果寄存器R0中的地址為56H,56H單元中的數據為35H,那麼指令執行後, 56H單元中的數據為34H。
3.乘法指令
乘法指令的操作碼助記符是「MUL」。
乘法指令只有1條,該條指令的形式和功能如下:
下面以一個程序段為例來說明乘法指令的功能。例如:
MOV A,#36H
MOV B,#07H
MUL AB
上面的第 1 條指令是將數據 36H(00110110)送到累加器 A 中;第 2 條指令是將數據 07H (00000111)送到寄存器B中;第3條指令是將A和B中的數據相乘(00110110×00000111);將相乘的結果0000000101111010(017AH)的低8位(7AH)保存在A中,高8位(01H)保存在B中。
4.除法指令
除法指令的操作碼助記符是「DIV」。
除法指令只有1條,該條指令的形式和功能如下:
下面以一個程序段為例來說明除法指令的功能。例如:
MOV A,#0FBH
MOV B,#12H
DIV AB
上面的第 1 條指令是將數據 0FBH(11111011)送到累加器 A 中;第 2 條指令是將數據 12H (00010010)送到寄存器B中;第3條指令是將A和B中的數據相除(11111011÷00010010);得到的商1101(0DH)保存在A中,餘數10001(11H)保存在B中。
5.十進位數調整指令
單片機在對十進位數進行加法運算時,用BCD碼(由4位二進位數構成)來表示十進位數,再對BCD碼進行加法運算,得到的結果仍要用BCD碼表示,但有時得到的結果可能不是BCD碼。例如:
在例(1)中,兩個BCD碼相加後的運算結果仍是BCD碼;在例(2)中,兩個BCD碼相加後的結果不是BCD碼,因為BCD碼只有9個(0000~1001),1110不是BCD碼;在例(3)中,兩個BCD碼相加後的結果是錯誤的BCD碼,因為BCD碼只有4位,如果把10001當作是2位BCD碼,還原就成了11,結果錯誤。採用十進位數調整指令可以解決這個問題。
十進位數調整指令又稱BCD調整指令,它的操作碼助記符是「DA」。
十進位數調整指令的形式和功能如下:
下面以一個BCD碼加法程序段為例來說明十進位數調整指令的功能。例如:
MOV A,#56H
ADD A,#67H
DA A
上面的第1條指令是將數據56H送到累加器A中;第2條指令是將A中的數據56H(01010110)與數據67H(01100111)相加,得到的結果是BDH(10111101),顯然結果不是BCD碼(因為1011和1101都不是BCD碼);第3條指令是將第2條指令相加後的運算結果BDH(10111101)進行BCD調整。調整過程如下:
從上面的豎式中可以看出,指令先判斷相加結果的低4位是否大於9(1001),若大於9,則將低4位加6(0110),然後判斷低4位加6後得到結果的高4位是否大於9,若大於9,再將高4位加6,這樣修正的結果是100100011(123H=56H+67H)。
在進行普通的加法運算時,後面不用加「DA A」指令;如果在加法運算指令後加上該指令,進行的加法運算將是BCD加法運算。