算術運算指令包括加、減、乘和除法指令,其語法格式見表3-7。由表3-7可知,算術運算指令會對PSW中的某些位產生影響。
1.加法指令ADD和ADDC
ADD指令將源操作數(shù)和累加器A中的數(shù)相加,加法的結果存入累加器A,并且運算結果會影響PSW中的CY、OV、AC和P標志位。ADD指令對標志位的影響如下:當加法結果的第7位有進位時,則進位標志位CY被置1,否則被清0;如果加法結果的第3位有進位,則輔助進位標志位AC被置1,否則被清0;如果加法結果的第6位和第7位的進位情況不一致,則溢出標志位OV被置1,否則被清0;運算結束時,奇偶標志位P的值由累加器A中的數(shù)決定,若累加器A中的值以二進制表示后,其中“1”的個數(shù)為奇數(shù)個,則P為1,否則P為0。
ADDC指令與ADD指令的唯一區(qū)別是,前者在源操作數(shù)和累加器A的加法基礎上再加上CY中的值。
2.十進制調整指令DA
指令ADD和ADDC將其源操作數(shù)和目的操作數(shù)作為二進制數(shù)(或十六進制數(shù))進行加法計算,遵循“逢2進1”(或“逢16進1”)的二進制(或十六進制)計算規(guī)則,得到的運算結果為二進制數(shù)(或十六進制數(shù))。如果用ADD和ADDC指令進行壓縮BCD碼(十進制數(shù))的加法計算,則得不到正確的十進制計算結果,而使用DA指令可以將ADD和ADDC指令的運算結果調整為十進制的運算結果。
使用“DA A”指令進行十進制調整時,必須滿足以下要求:在DA指令之前必須進行ADD或ADDC加法運算,并且參與加法運算的操作數(shù)必須是壓縮BCD碼數(shù)。
“DA A”指令調整時,先處理“個位”,再處理“十位”,“個位”的處理結果將影響“十位”的調整,具體步驟如下:
(1)調整BCD碼運算結果的“個位”
1)若累加器A中運算結果的“個位”(即低4位)數(shù)大于9(非BCD碼),則在累加器A的“個位”上加“6”。這樣做是因為:在BCD碼計算時,結果大于9則應產生進位,但是ADD和ADDC按照十六進制進行計算,只有結果大于15時才進位,從而導致“晚”進位,所以此時加“6”相當于將“逢16進1”的十六進制運算強制調整為“逢10進1”十進制運算。
2)若累加器A中運算結果的“個位”(即低4位)產生進位(輔助進位標志位(AC)=1),則在累加器A的“個位”上加“6”。這樣處理的理由是:“個位”產生進位,意味著BCD碼加法結果的個位大于15而產生了進位,但是該進位將使BCD碼加法結果的個位數(shù)被減去16,而正常的十進制加法進位應該使個位數(shù)被減去10,所以需通過加“6”操作補上多減去的“6”。
(2)調整BCD碼運算結果的“十位”
若累加器A中運算結果的“十位”(即高4位)數(shù)大于9(非BCD碼)或累加器A中“十位”產生進位(進位標志位(CY)=1),則在累加器A的“十位”上加“6”。這樣做的原因與步驟(1)相似。
【例3-34】DA指令舉例。
以下程序段可以完成壓縮BCD碼的加法運算88H+02H=90H。
3.減法指令SUBB
SUBB指令將累加器A中的數(shù)減去源操作數(shù)和進位標志位CY,并將減法結果存入累加器A,其運算結果會影響PSW中的CY、OV、AC和P標志位。SUBB指令對標志位的影響如下:當減法的第7位有借位時,則進位標志位CY被置1,否則被清0;如果減法結果的第3位有借位,則輔助進位標志位AC被置1,否則被清0;如果減法結果的第6位和第7
位的借位情況不一致,則溢出標志位被置1,否則被清0;運算結束時,奇偶標志位P的值由累加器A中的數(shù)決定,若累加器A中的值以二進制表示后,其中“1”的個數(shù)為奇數(shù)個,則(P)=1,否則(P)=0。
【例3-35】SUBB指令舉例。確定下段程序執(zhí)行后,累加器A和PSW的值。
解:運行結果是(A)=8CH、(PSW)=0C1H(即P=1、OV=0、AC=1和CY=1)。
4.加1指令INC和減1指令DEC
INC指令和DEC指令分別對指令中唯一的操作數(shù)進行加1和減1操作,并將結果送回操作數(shù)。除了“INC A”和“DEC A”指令將影響奇偶標志位P以外,其他INC和DEC指令均不影響任何標志位。注意:這里所說的“不影響”是指標志位原來的狀態(tài)保持不變。另外,“INC DPTR”指令進行16位數(shù)加1操作,該指令執(zhí)行時,先將DPL加1,若產生進位,則將DPH加1,并且DPL加1和DPH加1產生的進位不影響AC和CY。另外,無“DEC DPTR”指令。
還需特別注意的是:若用INC和DEC修改單片機并行I/O口(P0~P3)的引腳狀態(tài),如指令“INC P0”,則指令執(zhí)行時采用的是“讀-修改-寫”方式,即先從端口的輸出鎖存器(而不是端口的引腳)讀取端口數(shù)據(jù),然后修改該數(shù)據(jù)(INC指令進行加1操作,DEC指令進行減1操作),最后將修改結果輸出到端口引腳上。
5.乘法指令MUL
乘法指令的格式見表3-7,乘法的被乘數(shù)和乘數(shù)均為8位無符號數(shù),且默認存放在累加器A和寄存器B中。乘積為16位無符號數(shù),其低8位存放于累加器A中,高8位存放在寄存器B中,如圖3-2所示。
圖3-2乘法指令示意圖
乘法指令對標志位的影響為:若乘積大于0FFH,則溢出標志位OV被置1,否則被清0;進位標志位總會被乘法指令清0。
6.除法指令DIV
除法指令的格式見表3-7。與乘法指令相似,除法指令的被除數(shù)和除數(shù)均為8位無符號數(shù),被除數(shù)默認放在累加器A中,除數(shù)默認放在寄存器B中。除法的商和余數(shù)均為8位無符號數(shù),分別存于累加器A中和寄存器B中,如圖3-3所示。
圖3-3除法指令示意圖
除法指令對標志位的影響:若除數(shù)不為0,則溢出標志位OV和進位標志位CY均被清0;若除數(shù)為0,則溢出標志位(OV)被置為1,且累加器A和寄存器B的值是不確定的。