學習目標:
編程實現兩個數:#8888H 和 #79H 的乘除運算。
一、實驗要求
能夠熟練掌握算術運算匯編指令的使用;熟練掌握子程序設計的基本方法;熟練掌握程序的調試方法。
二、實驗設計
?1.整體思路
乘法:將單字節的乘數由低位字節到高位字節依次相乘(MUL AB),將當前字節運算的積的低位字節A與上一字節的運算結果的進位(B+Cy)相加所得結果存入寄存器,反復跳轉循環,直至完成運算。
除法:將被除數由高位字節到低位字節依次不斷減去除數,當進行減法的被減數字節不夠減去除數時,向上一字節的運算結果的余數進行借位,直至上一字節的運算結果的余數變為0,且當前字節小于除數時,被除數進入下一位運算,直至完成最低位運算,并存入余數。
2.流程圖
乘法程序:
除法程序:
3.主要模塊設計思路及分析
(1)乘法模塊/子程序
(2)除法模塊/子程序
三、?實現效果
(1)乘法運行結果?
(2)除法運行結果
四、學習總結
1.對多字節的運算,可以通過合理的轉換,轉換成多次的單字節運算。
2.注意現場保護和恢復現場。
3.在實驗開始前,不清楚應該怎樣去移位,要移幾位,也不知道商和余數具體怎樣去計算。學習過程中,通過翻找指令集,一點一點把這部分編程完成了,感覺收獲很多,且學到了很多新的指令。
附錄:
(1)乘法:
ORG 0000H
NUM1: DW 8888H
NUM2: DB 79H
START:MOV DPTR,#0000HMOVC A,@A+DPTR MOV R0,A ;將88H(高位)存入R0CLR AINC DPTR MOVC A,@A+DPTR MOV R1,A ;將88H(低位)存入R1CLR AINC DPTR MOVC A,@A+DPTRMOV R2,A ;將79H存入R2
MUL_LOOP:MOV B,R1MUL AB ;高位->R1,低位->AMOV R5,A MOV R1,B MOV A,R0 MOV B,R2MUL AB ;高位->R2,低位->AADDC A,R1 ;R2*R1結果的高8位與R2*R0結果的低8位做進位加法MOV R4,AMOV A,BADDC A,#00HMOV R3,AEND除法:ORG 0000H
NUM1: DW 8888H
NUM2: DB 79HMOV DPTR,#0000HMOVC A,@A+DPTRMOV R0,A ;將88H(高位)存入R0
CLR A
INC DPTR MOVC A,@A+DPTRMOV R1,A ;將88H(低位)存入R1CLR AINC DPTR MOVC A,@A+DPTRMOV R2,A ;將79H存入R2MOV R6,#0000H
START:;低位累次相減MOV A,R0CLR CSUBB A,R2JNC LOOP1 ;若R0>R2則跳轉到LOOP1
LOOP:MOV A,R6INC AMOV R6,ASUBB A,#08HJZ LOOP_END ;若累加器為0則跳轉至LOOP_ENDMOV A,R1 CLR C ;將進位清零RLC A ;R1帶進位循環左移,最高位->CyMOV R1,A ;將循環左移后的數保存回R1MOV A,BRLC A ;余數循環左移MOV B,A ;將循環左移后的余數存回B中JNC LOOP ;循環這一操作,直到余數最高位為1RRC A ;將余數循環右移至最高位為1nopMOV R7,A MOV A,R1RRC A ;余數循環右移nopCLR C ;將進位清零SUBB A,R2 ;判斷是否夠減JNC LOOP2 ;若進位標志為0則跳轉至LOOP2LOOP1:MOV A,R0MOV B,R2DIV AB ;R0-R2MOV R3,A ;取低位為余數AJMP LOOP ;返回LOOP繼續循環
LOOP2:MOV A,R7MOV B,R2DIV AB ;R7-R2MOV R4,A ;取低位為余數AJMP LOOP ;返回LOOP
LOOP_END: END