关于汇编语言与程序设计——子程序设计
学习目标:
编程实现两个数:#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