📄 serial.src
字号:
?C0044:
MOV DPTR,#08H
LJMP ?C?ADDXBP
; END OF _?yyprintf
;
; void PrintN(int n,int b) reentrant //十进制显示整形数
RSEG ?PR?_?PrintN?SERIAL
_?PrintN:
USING 0
; SOURCE LINE # 383
MOV DPTR,#0FFFEH
LCALL ?C?ADDXBP
MOV A,R4
MOVX @DPTR,A
INC DPTR
MOV A,R5
MOVX @DPTR,A
MOV DPTR,#0FFFEH
LCALL ?C?ADDXBP
MOV A,R6
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
; {
; if(b==16){PrintWord(n);return;}
; SOURCE LINE # 385
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
XRL A,#010H
ORL A,R6
JNZ ?C0072
LCALL L?0213
SJMP ?C0073
?C0072:
; if(n<0){PrintChar('-');n=-n;}
; SOURCE LINE # 386
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R6,A
CLR C
MOV A,R6
XRL A,#080H
SUBB A,#080H
JNC ?C0074
MOV R7,#02DH
LCALL _?PrintChar
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
CLR C
CLR A
SUBB A,R7
MOV R7,A
CLR A
SUBB A,R6
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
?C0074:
; if(n/b)
; SOURCE LINE # 387
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV R5,AR3
MOV R4,AR2
LCALL ?C?SIDIV
MOV A,R7
ORL A,R6
JZ ?C0075
; PrintN(n/b,b);
; SOURCE LINE # 388
MOV R5,AR3
MOV R4,AR2
LCALL _?PrintN
?C0075:
; PrintChar(n%b+'0');
; SOURCE LINE # 389
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
LCALL ?C?SIDIV
MOV A,R5
ADD A,#030H
MOV R7,A
LCALL _?PrintChar
; }
; SOURCE LINE # 390
?C0073:
MOV DPTR,#04H
LJMP ?C?ADDXBP
; END OF _?PrintN
;
; void PrintUN(unsigned int n,unsigned int b) reentrant //十进制显示无符号整形数
RSEG ?PR?_?PrintUN?SERIAL
L?0210:
USING 0
MOV R4,#00H
L?0211:
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
LCALL ?C?ILDPTR
MOV R7,A
MOV R6,B
_?PrintUN:
USING 0
; SOURCE LINE # 392
MOV DPTR,#0FFFEH
LCALL ?C?ADDXBP
MOV A,R4
MOVX @DPTR,A
INC DPTR
MOV A,R5
MOVX @DPTR,A
MOV DPTR,#0FFFEH
LCALL ?C?ADDXBP
MOV A,R6
MOVX @DPTR,A
INC DPTR
MOV A,R7
MOVX @DPTR,A
; {
; if(b==16){PrintWord(n);return;}
; SOURCE LINE # 394
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
XRL A,#010H
ORL A,R6
JNZ ?C0076
LCALL L?0213
SJMP ?C0077
?C0076:
; if(n/b)
; SOURCE LINE # 395
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV R5,AR3
MOV R4,AR2
LCALL ?C?UIDIV
MOV A,R7
ORL A,R6
JZ ?C0078
; PrintUN(n/b,b);
; SOURCE LINE # 396
MOV R5,AR3
MOV R4,AR2
LCALL _?PrintUN
?C0078:
; PrintChar(n%b+'0');
; SOURCE LINE # 397
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
LCALL ?C?UIDIV
MOV A,R5
ADD A,#030H
MOV R7,A
LCALL _?PrintChar
; }
; SOURCE LINE # 398
?C0077:
MOV DPTR,#04H
LJMP ?C?ADDXBP
; END OF _?PrintUN
;
;
; void PrintLN(long n,long b) reentrant //十进制显示长整形数
RSEG ?PR?_?PrintLN?SERIAL
_?PrintLN:
USING 0
; SOURCE LINE # 401
MOV DPTR,#0FFFCH
LCALL ?C?ADDXBP
LCALL ?C?LSTXDATA
; {
; if(b==16){PrintLong(n);return;}
; SOURCE LINE # 403
CLR A
MOV R7,#010H
MOV R6,A
MOV R5,A
MOV R4,A
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
CLR C
LCALL ?C?SLCMP
JNZ ?C0079
LCALL L?0212
LJMP ?C0080
?C0079:
; if(n<0){PrintChar('-');n=-n;}
; SOURCE LINE # 404
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV A,R4
RLC A
JNC ?C0081
MOV R7,#02DH
LCALL _?PrintChar
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
LCALL ?C?LNEG
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
LCALL ?C?LSTXDATA
?C0081:
; if(n/b)
; SOURCE LINE # 405
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
LCALL ?C?SLDIV
MOV A,R4
ORL A,R5
ORL A,R6
ORL A,R7
JZ ?C0082
; PrintLN(n/b,b);
; SOURCE LINE # 406
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#0FFFCH
LCALL ?C?ADDXBP
LCALL ?C?LSTXDATA
MOV DPTR,#08H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
LCALL ?C?SLDIV
LCALL _?PrintLN
?C0082:
; PrintChar(n%b+'0');
; SOURCE LINE # 407
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
LCALL ?C?SLDIV
MOV A,R3
ADD A,#030H
MOV R7,A
LCALL _?PrintChar
; }
; SOURCE LINE # 408
?C0080:
MOV DPTR,#08H
LJMP ?C?ADDXBP
; END OF _?PrintLN
;
; void PrintLUN(unsigned long n,unsigned long b) reentrant //十进制显示无符号长整形数
RSEG ?PR?_?PrintLUN?SERIAL
_?PrintLUN:
USING 0
; SOURCE LINE # 410
MOV DPTR,#0FFFCH
LCALL ?C?ADDXBP
LCALL ?C?LSTXDATA
; {
; if(b==16){PrintLong(n);return;}
; SOURCE LINE # 412
CLR A
MOV R7,#010H
MOV R6,A
MOV R5,A
MOV R4,A
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
CLR C
LCALL ?C?ULCMP
JNZ ?C0083
LCALL L?0212
LJMP ?C0084
?C0083:
; if(n/b)
; SOURCE LINE # 413
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
LCALL ?C?ULDIV
MOV A,R4
ORL A,R5
ORL A,R6
ORL A,R7
JZ ?C0085
; PrintLUN(n/b,b);
; SOURCE LINE # 414
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV DPTR,#0FFFCH
LCALL ?C?ADDXBP
LCALL ?C?LSTXDATA
MOV DPTR,#08H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
LCALL ?C?ULDIV
LCALL _?PrintLUN
?C0085:
; PrintChar(n%b+'0');
; SOURCE LINE # 415
MOV DPTR,#04H
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
MOV DPH,?C_XBP
MOV DPL,?C_XBP+01H
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
LCALL ?C?ULDIV
MOV A,R3
ADD A,#030H
MOV R7,A
LCALL _?PrintChar
; }
; SOURCE LINE # 416
?C0084:
MOV DPTR,#08H
LJMP ?C?ADDXBP
; END OF _?PrintLUN
;
; //============================================================================================
; //KEIL C51的float类型采用IEEE-754标准存储,占4字节。
; // S E E E E E E E E E (1) M M M M M M M M M M M M M M M M M M M M M M M
; // S 1bit 正负标志位0=正;1=负
; // E 8bit 二进制阶码=(EEEEEEEE)-127
; // M 23bit 24bit尾数,只存储23位,最高位固定为1。此方法用最较少的位数实现了较高的有效数,提高了精度。
; //
; // 尾数为24bit,最高可表达的整数值为2^24-1=16777215,也就是说,小于等于16777215的整数可以被精确
; //显示。这决定了十进制浮点数的有效位数为7位,10^7<16777215<10^8,10的7次方以内的数小于16777215,
; //可以精确表示。使用科学记数法时,整数部分占1位,所以小数部分最大占7-1=6位,即最大有6位精度。
; // 长整形数和浮点数都占4字节,但表示范围差别很大。浮点数的范围为+-1.175494E-38到+-3.402823E+38,
; //无符号长整形数范围为0到4294967295。显示浮点数要用到长整形数保存数据,可他们范围差这么多,怎么办呢?
; // 仔细观察十进制浮点数的显示,有一个尾数和一个阶码,由上面论证可知32位浮点数最大有效数字为7位十进制
; //数,超出此范围的数字有截断误差,不必理会,因此,使浮点数尾数能够放在长整形数里保存。阶码为-38到38,
; //一个char型变量就可以保存。
; // 综上所述,以10^7的最大跨度为窗口(小于10^7也可以,如:10,100...10000等,但决不能大于它,那样会
; //超出精度范围),定位浮点数的量级,然后取出7位尾数的整数值,再调整阶码,就可以精确显示此浮点数。
; // 量级尺度如下:
; // (-38)-(-35)-(-28)-(-21)-(-14)-(-7)-(0)-(7)-(14)-(21)-(28)-(35)-(38)
; // 请严格按照KEIL手册给出的浮点数范围显示,因为数值空间没有完全使用,有些值用于错误指示和表示正负无穷。
; //小于1.175494E-38的数仍可以显示一些,但最好不用,以免出错。我采用直接判断的方法,剔除此种情况。
; // 在计算机里结合律不成立,(a*b)*c!=a*(b*c),原则是先让计算结果值动态范围小的两个数运算,请注意程序里
; //的写法。
; // 注:(1E38/b)*1E6不要写成1E44/b,因为无法在32位浮点数里保存1E44,切记!
; // 计算机使用二进制数计算,能有效利用电子器件高速开关的特性,而人习惯于十进制数表示,二进制和十进制
; //没有方便的方法转换,只能通过大量计算实现,浮点数的十进制科学记数法显示尤其需要大量的运算,可见,显示
; //一个浮点数要经过若干次浮点运算,没有必要就不要显示,花在显示上的时间比计算的耗时都要多得多。
; //============================================================================================
; void DispF(float f) reentrant //用科学记数法显示浮点数,在float全范围内精确显示,超出范围给出提示。
RSEG ?PR?_?DispF?SERIAL
_?DispF:
USING 0
; SOURCE LINE # 446
MOV DPTR,#0FFFCH
LCALL ?C?ADDXBP
LCALL ?C?LSTXDATA
MOV DPTR,#0FFF2H
LCALL ?C?ADDXBP
; { //+-1.175494E-38到+-3.402823E+38
; float tf,b;
; unsigned long w;
; char i,j;
; if(f<0){
; SOURCE LINE # 451
CLR A
MOV R7,A
MOV R6,A
MOV R5,A
MOV R4,A
MOV DPTR,#0EH
LCALL ?C?XBPOFF
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
LCALL ?C?FPCMP3
JNC ?C0086
; PrintChar('-');
; SOURCE LINE # 452
MOV R7,#02DH
LCALL _?PrintChar
; f=-1.0*f;
; SOURCE LINE # 453
MOV DPTR,#0EH
LCALL ?C?XBPOFF
PUSH DPH
PUSH DPL
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -