一、 实验要求
- 编程实现两个数:#8888H 和 #79H 的乘除运算。
- 结合实验1的代码,将加减乘除四则运算写成四个子程序,注意现场保护。
二、 实验设计
1.整体思路
- 主程序 MAIN:
- 通过 ACALL 指令调用四个不同的子程序,分别进行加法、减法、乘法和除法。
- 在每次调用子程序之前,清零寄存器,以确保没有之前的结果干扰当前运算。
- ADDI 子程序实现加法,SUBI 子程序实现减法,MULI 子程序实现乘法,DIVI 子程序实现除法。
- 加法子程序 ADDI:
- 将两个数 NUM1 和 NUM2 分别加载到寄存器,并执行加法。
- 结果存储在 R1和R0 寄存器中,需要考虑进位。
- 减法子程序 SUBI:
- 将两个数 NUM1 和 NUM2 分别加载到寄存器,并执行减法。
- 结果存储在 R1和R0 寄存器中,需要考虑借位。
- 乘法子程序 MULI:
- 将两个数 NUM1 和 NUM2 分别加载到寄存器,并执行乘法。
- 结果以低位存储在 R2,R1,R0 寄存器,高位存储在 R1 寄存器。
- 除法子程序 DIVI:
- 初始化被除数 NUM1 和除数 NUM2。
- 通过一个循环,一次减去除数,同时记录商。
- 当被除数高位发生借位时,进入 DOWN 部分,修正商和余数。
- 在最后,将商存储在 R6和R7 寄存器中。
2.流程图
图2-1 流程图
3.主要模块设计思路及分析
- 主程序模块 (MAIN):
- 这是程序的入口点,负责调用四个不同的子程序来执行加法、减法、乘法和除法操作。
- 在每次调用子程序之前,初始化相关寄存器和标志位,以确保结果不会受到之前运算的影响。
- 加法子程序 (ADDI):
- 这个子程序实现两个数的加法操作。
- 加载要相加的两个数到寄存器。
- 执行加法操作,并考虑进位情况。
- 将结果存储在适当的寄存器中。
- 减法子程序 (SUBI):
- 这个子程序实现两个数的减法操作。
- 加载被减数和减数到寄存器。
- 执行减法操作,并考虑借位情况。
- 将结果存储在适当的寄存器中。
- 乘法子程序 (MULI):
- 这个子程序实现两个数的乘法操作。
- 加载被乘数和乘数到寄存器。
- 执行乘法操作,并将结果的低位和高位分别存储在不同的寄存器中。
- 除法子程序 (DIVI):
- 这个子程序实现两个数的除法操作。
- 初始化被除数和除数。
- 使用循环来重复减去除数,并记录商。
- 处理高位借位情况以及余数的计算,最终将商和余数存储在适当的寄存器中。
三、 实现效果
图3-1
8888
- 79
————
880F
结果分别存在R0,R1。
图3-2
调用完之后,进行清零操作,避免影响后续计算。
图3-3
调用完加法指令:
8888
+ 79
—————
8901
结果分别存在R0,R1。
图3-4
调用除法:
8888
- 79
————
一直减,直到高位发生借位
最终结果保存到R7与R6。
图3-5
乘法调用:
8888
x 79
—————
4048
4048
—————
408848
最终结果保存在R2,R1,R0
-
总结
通过实验,我成功地设计并实现了一个基于汇编语言的程序,能够对两个16位的数进行加法、减法、乘法和除法运算。在主程序中,我使用了 ACALL 指令来调用四个不同的子程序,每个子程序负责一个特定的运算。
在加法子程序(ADDI)中,我加载了两个数到寄存器,并执行了加法操作,同时考虑了进位的情况。减法子程序(SUBI)类似,加载了被减数和减数,并执行减法操作,处理了借位的情况。
乘法子程序(MULI)实现了乘法运算,将两个数加载到寄存器中,并计算了结果的低位和高位。除法子程序(DIVI)则通过循环减去除数的方式,计算商和余数,并处理了高位借位的情况。
实验结果表明,程序能够正确地执行加法、减法、乘法和除法操作,得到了预期的结果。通过流程图和模块设计,成功地组织了程序结构,使其清晰易懂。
这个实验可以加深我们对汇编语言和低级计算机操作的理解,特别是在处理进位、借位和循环等方面。通过实践,我们更深入地了解了计算机底层运算的细节,对编程和计算机体系结构也有了更深刻的认识。