关于汇编语言与接口技术——算术运算程序的设计
学习目标:能够熟练掌握算术运算汇编指令的使用、理解有符号数和无符号数运算、熟练掌握简单程序设计的基本方法、熟练掌握程序的调试方法。
一、设计方案
1.整体思路
将两个操作数NUMB1,NUMB2的低位、中位、高位分离开,存放在指定的地址单元内,分别进行相加减,最后得出结果。
2.流程图
3.主要模块设计思路及分析
(1)加法模块实现:
低位:首先读取NUMB1的低位地址2H的内容77,将其放入R0暂存;接着读取NUMB2的低位地址5H的内容99,放入累加器,然后与R0相加后得出结果再重新放入R0,更新结果。
中位:首先读取NUMB1的中位地址1H的内容88,将其放入R1暂存;接着读取NUMB2的中位地址4H的内容88,放入累加器,然后与R1相加后得出结果再重新放入R1,更新结果。
高位:首先读取NUMB1的高位地址0H的内容99,将其放入R2暂存;接着读取NUMB2的高位地址3H的内容77,放入累加器,然后与R2相加后得出结果再重新放入R2,更新结果。
低位相加部分主要代码(中位高位同理):
(2)减法模块实现:
低位:首先读取NUMB2的低位地址5H的内容77,将其放入R0暂存;接着读取NUMB1的低位地址2H的内容99,放入减法器,然后低位相减后得出结果再重新放入R0,更新结果。
中位:首先读取NUMB2的中位地址4H的内容88,将其放入R1暂存;接着读取NUMB1的中位地址1H的内容88,放入减法器,然后中位相减后得出结果再重新放入R1,更新结果。
高位:首先读取NUMB2的中位地址3H的内容99,将其放入R2暂存;接着读取NUMB1的高位地址0H的内容77,放入减法器,然后高位相减后得出结果再重新放入R2,更新结果。
低位相减部分主要代码(中位高位同理):
二、实现效果
(1)加法部分:
低位相加(77H+99H):单步运行后R0内容变为0x10
PSW内ov位为0,cy为1,表示有进位,无溢出
中位相加(88H+88H):单步运行后R1内容变为0x11
PSW内ov位为1,cy为1,表示有进位,有溢出
高位相加(99H+77H):单步运行后R2内容变为0x11
PSW内ov位为0,cy为1,表示有进位,无溢出
(该步与低位相加结果一致,但由于有进位,R2内容变为0x10+1=0x11)
最后运行结果如图:
(2)减法部分:
低位相减(77H-99H):单步运行后R0内容变为0xde
PSW内ov位为1,cy为1,表示有借位,有溢出
中位相减(88H-88H):单步运行后R1内容变为0xff
PSW内ov位为0,cy为1,表示有借位,无溢出
高位相减(99H-77H):单步运行后R2内容变为0x21
PSW内ov位为1,cy为0,表示有溢出,无借位
最后运行结果如图:
三、学习小结
1.在实验开始前,我对于Keil软件的使用还不是很熟悉,经常误点到错误的位置,连简单的文件保存和程序运行都没法操作。在后来询问了舍友之后得到解决。
2.在本次实验中,我学会了简单程序设计的基本方法,掌握了程序的调试和运行。将数据内容传入指定寄存器,通过累加器和减法器进行相应操作,而不用清空原数据的内容,超越了我之前对这两个器件的认知,这是让我觉得最神奇的地方。
3.在实验后,我还产生了一个小小的困惑:最后得出的结果是分别存在R0,R1,R2里面,但要如何将这三个分离的数据合成为一个具体相加减得出的结果呢?目前还没有得到一个确定的答案。希望在之后的实验中,可以以此为鉴,再接再厉,解决这个问题,得到满意的结果。
附录:
加法部分:ORG 0000h
NUM1: DW 9988H DB 77H ; data: 99 88 77; addr: 0H 1H 2H
NUM2: DB 77H,88H,99H ; data: 77 88 99; addr: 3H 4H 5HSTART:MOV DPTR, #0H ; 加法模块//低位 MOV A, #2H MOVC A, @A+DPTR ; 读取程序存储器地址 2H 数据 77(低位)MOV R0, A ; 使用 R0 暂时存储数据MOV A, #5HMOVC A, @A+DPTR ; 读取程序存储器地址 5H 数据 99(低位)ADDC A,R0 ; 低位相互加MOV R0, A ; 将低位相加后得到的结果放入R0//中位MOV A, #1H ; 读取程序存储器地址 1H 数据 88(中位)MOVC A, @A+DPTR ; 使用 R1 暂时存储数据MOV R1, AMOV A, #4H MOVC A, @A+DPTR ; 读取程序存储器地址 4H 数据 88(中位)ADDC A,R1 ; 中位相互加MOV R1, A ; 将中位相加后得到的结果放入R1//高位MOV A, #0H ; 读取程序存储器地址 0H 数据 99(高位)MOVC A, @A+DPTR ; 使用 R2 暂时存储数据MOV R2, AMOV A, #3HMOVC A, @A+DPTR ; 读取程序存储器地址 3H 数据 77(高位)ADDC A,R2 ; 高位相互加MOV R2, A ; 将高位相加后得到的结果放入R2END减法部分:ORG 0000h
NUM1: DW 9988H DB 77H ; data: 99 88 77; addr: 0H 1H 2H
NUM2: DB 77H,88H,99H ; data: 77 88 99; addr: 3H 4H 5HSTART: MOV DPTR, #0H ; 减法模块//低位 MOV A, #5H MOVC A, @A+DPTR ; 读取程序存储器地址 5H 数据 77(低位)MOV R0, A ; 使用 R0 暂时存储数据MOV A, #2HMOVC A, @A+DPTR ; 读取程序存储器地址 2H 数据 99(低位)SUBB A, R0 ; 低位相减MOV R0, A ; 将低位相减后得到的结果放入R0//中位MOV A, #4HMOVC A, @A+DPTR ; 读取程序存储器地址 4H 数据 88(中位)MOV R1, A ; 使用 R1 暂时存储数据MOV A, #1HMOVC A, @A+DPTR ; 读取程序存储器地址 1H 数据 88(中位)SUBB A, R1 ; 中位相减MOV R1, A ; 将中位相减后得到的结果放入R1//高位MOV A, #3HMOVC A, @A+DPTR ; 读取程序存储器地址 3H 数据 99(高位)MOV R2, A ; 使用 R2 暂时存储数据MOV A, #0HMOVC A, @A+DPTR ; 读取程序存储器地址 0H 数据 77(高位)SUBB A, R2 ; 高位相减MOV R2, A ; 将高位相减后得到的结果放入R2END