第1个问题,代码如下,不过我认为直接把带符号的十进制数转化为二进制,再加法更好。
;设R2 R3为带符号的十进制加数,R2高4位为符号位,0表示正数,1表示负数
;设R4 R5为带符号的十进制被加数,R4高4位为符号位,0表示正数,1表示负数
;设R6 R7为带符号的十进制和,R6高4位为符号位,0表示正数,1表示负数;低四位为进位,
;先判断符号位,符号位相同,直接BCD加;符号位不同,判断值的大小,再决定符号
CLR A
MOV R6,A
MOV R7,A ;和清0
MOV A,R2
JZ STEP2 ;加数为正数转移
MOV A,R4
JZ STEP0 ;被加数为正数转移
ACALL NTOR6 ;负数符号存到R6高四位
JMP STEP5 ;转下一步
STEP0:
CLR C
MOV A,R3
SUBB R5
JC STEP5 ;如果R3
JMP STEP3
STEP2:
MOV A,R4
JZ STEP5 ;被加数为正数转移
CLR C
MOV A,R3
SUBB R5
JC STEP4 ;如果R3
MOV A,R5
ACALL R100
ADD A,R3
DA
MOV R7,A ;十进制数相加,保存到R7
JMP STEP6
STEP4:
ACALL NTOR6 ;负数符号存到R6高四位
STEP5:
MOV A,R3
ACALL R100
ADD A,R5
DA
MOV R7,A ;十进制数相加,保存到R7
JMP STEP6
STEP5:
MOV A,R3 ;十进制数相加,存到R7
ADD R5
DA
MOV R7,A
JNC STEP6 ;结果无进位转移
MOV A,R6
ORL A,#1
MOV R6,A ;进位存到R6低四位
STEP6: JMP $
NTOR6:
MOV A,R6
ORL A,#10H
MOV R6,A ;负数符号存到R6高四位
RET
R100:
ADD A,#99H ;100D减去累加器,保存到累加器
DA
ADD A,#1
DA
RET
第2个问题:散转程序中,代表+-*/的符号用0、1、2、3表示时,因要跳转的处理地址每个地址占2字节,乘以2才能正确跳转。
第3个问题:8255控制字D7=1时,D6~D0为口模式控制,D7=0时控制字为PC口的位操作模式,如控制字=00H,PC0复位;控制字=01H,PC0置位;控制字=0EH,PC7复位;控制字=0FH,PC7置位;其中D6~D4没定义,D3~D1从000B~111B分别指定PC0~PC7脚,D0位为相应的电平高低,0为低电平,1为高电平。
关注