一、 实验要求
分别从无符号数和有符号数角度,单步运行程序解释运算过程(PSW标志位),并用Keil截图辅助说明。
二、 实验设计
1.整体思路
编程实现两个数:#998877H 和 #778899H 的减法运算。
和加法一样,将两个数分别分割成高字节、中字节、低字节,然后分别利用SUBB运算符相减,将结果分别保存到特定的地址中,在利用一个特定的地址保存借位位。
2.流程图
3.主要模块设计思路及分析
(1)多字节减法模块
将多字节的两个数拆分成多个单字节的数,并从NUM2和NUM1中加载相应的字节(低字节、中字节、高字节)(因为SUBB A, R0;执行的是A=A-R0,所以NUM2中的数需要保存到R0中,NUM1中的数保存到A中),然后执行减法操作,并保存到特定的内存位置(33H、32H、31H)中。
(2)借位保存模块
这个模块负责保存加法操作完成后的最终借位位。通过CY的值来判断是否有借位。如果CY=1,则将借位位30H设为1H,如果CY=0,则直接结束程序,让30H保持原来的00H。
三、 实现效果
(1)低字节:
如图可以看到:低字节77H-99H的结果保存到33H中为DEH。
对于有符号减法来说OV=1表示溢出。
对于无符号减法来说CY=1表示有借位。
(2)中字节:
如图可以看到:中字节88H-88H的结果保存到32H中为FFH。
对于有符号减法来说OV=0表示没有溢出。
对于无符号减法来说CY=1表示有借位。
(3)高字节:
如图可以看到:高字节99H-77H的结果保存到31H中为21H。
对于有符号减法来说OV=1表示溢出。
对于无符号减法来说CY=0表示没有借位。
(4)最后结果:
因为高字节相减时CY=0,所以在30H中保存00H,由此可得最终结果为0021FFDEH。
四、源代码
b.减法:
ORG 0000H
NUM1: DW 9988H
DB 77H
NUM2: DB 77H, 88H, 99H
START:
//低字节减法
//将NUM2低字节保存到R0中
MOV DPTR, #NUM2
MOV A, #2
MOVC A, @A+DPTR
MOV R0, A
//将NUM1低字节保存到A中
MOV DPTR, #NUM1
MOV A, #2
MOVC A, @A+DPTR
// 进行低字节减法,保存到33H中
SUBB A,R0
MOV 33H,A
//中字节减法
//将NUM2中字节保存到R0中
MOV DPTR, #NUM2
MOV A, #1
MOVC A, @A+DPTR
MOV R0, A
//将NUM1中字节保存到A中
MOV DPTR, #NUM1
MOV A, #1
MOVC A, @A+DPTR
// 进行中字节减法,保存到32H中
SUBB A,R0
MOV 32H,A
//高字节减法
//将NUM2高字节保存到R0中
MOV DPTR, #NUM2
MOV A, #0
MOVC A, @A+DPTR
MOV R0, A
//将NUM1高字节保存到A中
MOV DPTR, #NUM1
MOV A, #0
MOVC A, @A+DPTR
// 进行高字节减法,保存到31H中
SUBB A,R0
MOV 31H,A
//保存借位位
JNC NO_BORROW //CY=0则跳转
MOV 30H, #1
NO_BORROW:
END
五、总结与思考
1.总结
(1) 多字节减法的实现艺术
实验采用了分字节处理策略,将24位数(#998877H和#778899H)分解为三个字节分别处理。这种处理方式展示了嵌入式系统中处理大数运算的经典方法:
-
低字节处理:77H-99H=DEH(CY=1)
-
中字节处理:88H-88H-CY=FFH(CY=1)
-
高字节处理:99H-77H-CY=21H(CY=0)
特别值得注意的是SUBB指令会自动考虑前一次的借位标志,这使得多字节运算能够连贯进行,这种设计体现了处理器指令集的精巧。
(2) 标志位的双重解读
这个实验最精彩的部分在于同一运算结果在不同数制解读下的不同含义:
无符号数视角:
-
CY=1表示需要借位(低字节、中字节)
-
最终结果0021FFDEH需要结合借位位理解真实值
有符号数视角:
-
OV=1表示结果超出有符号数表示范围(低字节和高字节)
-
需要特别关注运算结果的符号位变化
(3)借位处理的编程技巧
实验展示了处理借位的两种方式:
JNC NO_BORROW ; CY=0跳转
MOV 30H, #1 ; 否则设置借位标志位
NO_BORROW:
这种结构比直接操作CY标志更清晰可靠,体现了嵌入式编程中对硬件标志位的安全操作原则。
2.实践启示
(1)数制意识至关重要:实验中必须时刻保持16进制思维,任何数制混淆都会导致结果误判
(2)标志位是状态机的关键:PSW中的各个标志位构成了程序流控制的重要条件,合理利用可以大幅提升代码效率
(3)多字节运算的通用模式:这种分字节处理的方法可以推广到各种大数运算场景,包括加密算法、高精度计算等