算術運算指令共有24條,算術運算主要是執行加、減、乘、除法四則運算。另外MCS-51指令系統中有相當一部分是進行加、減1操作,BCD碼的運算和調整,我們都歸類為運算指令。雖然MCS-51單片機的算術邏輯單元ALU僅能對8位無符號整數進行運算,但利用進位標志C,則可進行多字節無符號整數的運算。同時利用溢出標志,還可以對帶符號數進行補碼運算。需要指出的是,除加、減1指令外,這類指令大多數都會對PSW(程序狀態字)有影響。這在使用中應特別注意。
????[1].?加法指令(4條)
????這4條指令的作用是把立即數,直接地址、工作寄存器及間接地址內容與累加器A的內容相加,運算結果存在A中。
????????ADD ?A,#data ??;(A)+#data→(A) 累加器A中的內容與立即數#data相加,結果存在A中
????????ADD ?A,data ???;(A)+(data)→(A) 累加器A中的內容與直接地址單元中的內容相加,結果存在A中
????????ADD ?A,Rn ????;(A)+(Rn)→(A) 累加器A中的內容與工作寄存器Rn中的內容相加,結果存在A中
????????ADD ?A,@Ri ???;(A)+((Ri))→(A) 累加器A中的內容與工作寄存器Ri所指向地址單元中的內容相加,結果存在A中
????[2].?帶進位加法指令(4條)
????這4條指令除與[1]功能相同外,在進行加法運算時還需考慮進位問題。
????????ADDC ?A,data ???;(A)+(data)+(C)→(A) 累加器A中的內容與直接地址單元的內容連同進位位相加,結果存在A中
????????ADDC ?A,#data ??;(A)+#data +(C)→(A) 累加器A中的內容與立即數連同進位位相加,結果存在A中
????????ADDC ?A,Rn??????;(A)+Rn+(C)→(A) 累加器A中的內容與工作寄存器Rn中的內容、連同進位位相加,結果存在A中
????????ADDC ?A,@Ri?????;(A)+((Ri))+(C)→(A) 累加器A中的內容與工作寄存器Ri指向地址單元中的內容、連同進位位相加,結果存在A中
????[3].?帶借位減法指令(4條)
????這組指令包含立即數、直接地址、間接地址及工作寄存器與累加器A連同借位位C內容相減,結果送回累加器A中。
????這里我們對借位位C的狀態作出說明,在進行減法運算中,CY=1表示有借位,CY=0則無借位。OV=1聲明帶符號數相減時,從一個正數減去一個負數結果為負數,或者從一個負數中減去一個正數結果為正數的錯誤情況。在進行減法運算前,如果不知道借位標志位C的狀態,則應先對CY進行清零操作。
????????SUBB ?A,data??????;(A)-(data) - (C)→(A) 累加器A中的內容與直接地址單元中的內容、連同借位位相減,結果存在A中
????????SUBB ?A,#data?????;(A)-#data -(C)→(A) 累加器A中的內容與立即數、連同借位位相減,結果存在A中
????????SUBB ?A,Rn???????;(A)-(Rn) -(C)→(A) 累加器A中的內容與工作寄存器中的內容、連同借位位相減,結果存在A中
????????SUBB ?A,@Ri??????;(A)-((Ri)) -(C)→(A) 累加器A中的內容與工作寄存器Ri指向的地址單元中的內容、連同借位位相減,結果存在A中
????[4].?乘法指令(1條)
????這個指令的作用是把累加器A和寄存器B中的8位無符號數相乘,所得到的是16位乘積,這個結果低8位存在累加器A,而高8位存在寄存器B中。如果OV=1,說明乘積大于FFH,否則OV=0,但進位標志位CY總是等于0。
????????MUL ?AB???????;(A)×(B)→(A)和(B) 累加器A中的內容與寄存器B中的內容相乘,結果存在A、B中
????[5].? 除法指令(1條)
????這個指令的作用是把累加器A的8位無符號整數除以寄存器B中的8位無符號整數,所得到的商存在累加器A,而余數存在寄存器B中。除法運算總是使OV和進位標志位CY等于0。如果OV=1,表明寄存器B中的內容為00H,那么執行結果為不確定值,表示除法有溢出。
????????DIV ?AB???????;(A)÷(B)→(A)和(B) 累加器A中的內容除以寄存器B中的內容,所得到的商存在累加器A,而余數存在寄存器B中。
????[6].?加1指令(5條)
????這5條指令的的功能均為原寄存器的內容加1,結果送回原寄存器。上述提到,加1指令不會對任何標志有影響,如果原寄存器的內容為FFH,執行加1后,結果就會是00H。這組指令共有直接、寄存器、寄存器減間址等尋址方式:
????????INC ?A??????????;(A)+1→(A) 累加器A中的內容加1,結果存在A中
????????INC ?data???????;(data)+1→(data) 直接地址單元中的內容加1,結果送回原地址單元中
????????INC ?@Ri???????;((Ri))+1→((Ri)) 寄存器的內容指向的地址單元中的內容加1,結果送回原地址單元中
????????INC ?Rn?????????;(Rn)+1→(Rn)寄存器Rn的內容加1,結果送回原地址單元中
????????INC ?DPTR??????;(DPTR)+1→(DPTR)數據指針的內容加1,結果送回數據指針中
????????在INC ?data這條指令中,如果直接地址是I/O,其功能是先讀入I/O鎖存器的內容,然后在CPU進行加1操作,再輸出到I/O上,這就是“讀—修改—寫”操作。
????[7].? 減1指令(4條)
????這組指令的作用是把所指的寄存器內容減1,結果送回原寄存器,若原寄存器的內容為00H,減1后即為FFH,運算結果不影響任何標志位,這組指令共有直接、寄存器、寄存器間址等尋址方式,當直接地址是I/O口鎖存器時,“讀—修改—寫”操作與加1指令類似。
????????DEC ?A?????????;(A)-1→(A)累加器A中的內容減1,結果送回累加器A中
????????DEC ?data??????;(data)-1→(data)直接地址單元中的內容減1,結果送回直接地址單元中
????????DEC ?@Ri??????;((Ri))-1→((Ri))寄存器Ri指向的地址單元中的內容減1,結果送回原地址單元中
????????DEC ?Rn??????;(Rn)-1→(Rn)寄存器Rn中的內容減1,結果送回寄存器Rn中
????[8].?十進制調整指令(1條)
????在進行BCD碼運算時,這條指令總是跟在ADD或ADDC指令之后,其功能是將執行加法運算后存于累加器A中的結果進行調整和修正。
????????DA ?A
????[1].?加法指令(4條)
????這4條指令的作用是把立即數,直接地址、工作寄存器及間接地址內容與累加器A的內容相加,運算結果存在A中。
????????ADD ?A,#data ??;(A)+#data→(A) 累加器A中的內容與立即數#data相加,結果存在A中
????????ADD ?A,data ???;(A)+(data)→(A) 累加器A中的內容與直接地址單元中的內容相加,結果存在A中
????????ADD ?A,Rn ????;(A)+(Rn)→(A) 累加器A中的內容與工作寄存器Rn中的內容相加,結果存在A中
????????ADD ?A,@Ri ???;(A)+((Ri))→(A) 累加器A中的內容與工作寄存器Ri所指向地址單元中的內容相加,結果存在A中
????[2].?帶進位加法指令(4條)
????這4條指令除與[1]功能相同外,在進行加法運算時還需考慮進位問題。
????????ADDC ?A,data ???;(A)+(data)+(C)→(A) 累加器A中的內容與直接地址單元的內容連同進位位相加,結果存在A中
????????ADDC ?A,#data ??;(A)+#data +(C)→(A) 累加器A中的內容與立即數連同進位位相加,結果存在A中
????????ADDC ?A,Rn??????;(A)+Rn+(C)→(A) 累加器A中的內容與工作寄存器Rn中的內容、連同進位位相加,結果存在A中
????????ADDC ?A,@Ri?????;(A)+((Ri))+(C)→(A) 累加器A中的內容與工作寄存器Ri指向地址單元中的內容、連同進位位相加,結果存在A中
????[3].?帶借位減法指令(4條)
????這組指令包含立即數、直接地址、間接地址及工作寄存器與累加器A連同借位位C內容相減,結果送回累加器A中。
????這里我們對借位位C的狀態作出說明,在進行減法運算中,CY=1表示有借位,CY=0則無借位。OV=1聲明帶符號數相減時,從一個正數減去一個負數結果為負數,或者從一個負數中減去一個正數結果為正數的錯誤情況。在進行減法運算前,如果不知道借位標志位C的狀態,則應先對CY進行清零操作。
????????SUBB ?A,data??????;(A)-(data) - (C)→(A) 累加器A中的內容與直接地址單元中的內容、連同借位位相減,結果存在A中
????????SUBB ?A,#data?????;(A)-#data -(C)→(A) 累加器A中的內容與立即數、連同借位位相減,結果存在A中
????????SUBB ?A,Rn???????;(A)-(Rn) -(C)→(A) 累加器A中的內容與工作寄存器中的內容、連同借位位相減,結果存在A中
????????SUBB ?A,@Ri??????;(A)-((Ri)) -(C)→(A) 累加器A中的內容與工作寄存器Ri指向的地址單元中的內容、連同借位位相減,結果存在A中
????[4].?乘法指令(1條)
????這個指令的作用是把累加器A和寄存器B中的8位無符號數相乘,所得到的是16位乘積,這個結果低8位存在累加器A,而高8位存在寄存器B中。如果OV=1,說明乘積大于FFH,否則OV=0,但進位標志位CY總是等于0。
????????MUL ?AB???????;(A)×(B)→(A)和(B) 累加器A中的內容與寄存器B中的內容相乘,結果存在A、B中
????[5].? 除法指令(1條)
????這個指令的作用是把累加器A的8位無符號整數除以寄存器B中的8位無符號整數,所得到的商存在累加器A,而余數存在寄存器B中。除法運算總是使OV和進位標志位CY等于0。如果OV=1,表明寄存器B中的內容為00H,那么執行結果為不確定值,表示除法有溢出。
????????DIV ?AB???????;(A)÷(B)→(A)和(B) 累加器A中的內容除以寄存器B中的內容,所得到的商存在累加器A,而余數存在寄存器B中。
????[6].?加1指令(5條)
????這5條指令的的功能均為原寄存器的內容加1,結果送回原寄存器。上述提到,加1指令不會對任何標志有影響,如果原寄存器的內容為FFH,執行加1后,結果就會是00H。這組指令共有直接、寄存器、寄存器減間址等尋址方式:
????????INC ?A??????????;(A)+1→(A) 累加器A中的內容加1,結果存在A中
????????INC ?data???????;(data)+1→(data) 直接地址單元中的內容加1,結果送回原地址單元中
????????INC ?@Ri???????;((Ri))+1→((Ri)) 寄存器的內容指向的地址單元中的內容加1,結果送回原地址單元中
????????INC ?Rn?????????;(Rn)+1→(Rn)寄存器Rn的內容加1,結果送回原地址單元中
????????INC ?DPTR??????;(DPTR)+1→(DPTR)數據指針的內容加1,結果送回數據指針中
????????在INC ?data這條指令中,如果直接地址是I/O,其功能是先讀入I/O鎖存器的內容,然后在CPU進行加1操作,再輸出到I/O上,這就是“讀—修改—寫”操作。
????[7].? 減1指令(4條)
????這組指令的作用是把所指的寄存器內容減1,結果送回原寄存器,若原寄存器的內容為00H,減1后即為FFH,運算結果不影響任何標志位,這組指令共有直接、寄存器、寄存器間址等尋址方式,當直接地址是I/O口鎖存器時,“讀—修改—寫”操作與加1指令類似。
????????DEC ?A?????????;(A)-1→(A)累加器A中的內容減1,結果送回累加器A中
????????DEC ?data??????;(data)-1→(data)直接地址單元中的內容減1,結果送回直接地址單元中
????????DEC ?@Ri??????;((Ri))-1→((Ri))寄存器Ri指向的地址單元中的內容減1,結果送回原地址單元中
????????DEC ?Rn??????;(Rn)-1→(Rn)寄存器Rn中的內容減1,結果送回寄存器Rn中
????[8].?十進制調整指令(1條)
????在進行BCD碼運算時,這條指令總是跟在ADD或ADDC指令之后,其功能是將執行加法運算后存于累加器A中的結果進行調整和修正。
????????DA ?A
評論
查看更多