ftoa_slow.s
来自「从iccavr7中破解得到的lib库源代码」· S 代码 · 共 1,145 行 · 第 1/2 页
S
1,145 行
.dbsym r sp 20 pc
.dbsym l int_digit 6 D
.dbsym l mantissa 2 D
.dbsym r dp 20 pS[.1]
.dbsym l z 24 L
.dbend
.area bss(ram, con, rel)
.dbfile ftoa_slow.c
L29:
.blkb 9
.area text(rom, con, rel)
.dbfile ftoa_slow.c
.dbfunc e fcvt _fcvt fpc
.dbunion 0 4 .2
.dbfield 0 f D
.dbfield 0 i L
.dbend
.dbsym s sp L29 A[9:9]c
; x -> y+15
; d -> y+2
; i -> R22,R23
; n -> R20,R21
; sign -> y+33
; dec_scale -> y+31
; ndigits -> R10,R11
; v -> y+25
.even
_fcvt::
rcall push_arg4
rcall push_xgsetF00C
sbiw R28,19
ldd R10,y+29
ldd R11,y+30
.dbline -1
.dbline 107
; }
;
; char *fcvt(float v, int ndigits, int *dec_scale, int *sign)
; {
.dbline 113
; int i, n;
; FI_union_t x;
; EFG_data_t d;
; static unsigned char sp[8+1];
;
; memset(sp, '\0', 8+1);
ldi R24,9
ldi R25,0
std y+1,R25
std y+0,R24
clr R18
clr R19
ldi R16,<L29
ldi R17,>L29
rcall _memset
.dbline 114
; x.f = v;
ldd R2,y+25
ldd R3,y+26
ldd R4,y+27
ldd R5,y+28
std y+15,R2
std y+16,R3
std y+17,R4
std y+18,R5
.dbline 115
; SP_EFG_convert(x.i, &d);
mov R24,R28
mov R25,R29
adiw R24,2
std y+1,R25
std y+0,R24
ldd R16,y+15
ldd R17,y+16
ldd R18,y+17
ldd R19,y+18
rcall _SP_EFG_convert
.dbline 116
; memcpy(sp, d.mantissa_BCD, 8);
ldi R24,8
ldi R25,0
std y+1,R25
std y+0,R24
mov R18,R28
mov R19,R29
subi R18,252 ; offset = 4
sbci R19,255
ldi R16,<L29
ldi R17,>L29
rcall _memcpy
.dbline 117
; if (ndigits)
tst R10
brne X8
tst R11
breq L31
X8:
.dbline 118
; {
.dbline 119
; n = ndigits + d.scale_bin+1;
ldd R2,y+3
clr R3
mov R20,R10
mov R21,R11
add R20,R2
adc R21,R3
subi R20,255 ; offset = 1
sbci R21,255
.dbline 120
; if (0 <= n && n <= 7)
clr R2
cp R20,R2
cpc R21,R3
brlt L34
X9:
ldi R24,7
ldi R25,0
cp R24,R20
cpc R25,R21
brlt L34
X10:
.dbline 121
; round_to_n_places(sp, n+1, &d.scale_bin);
mov R24,R28
mov R25,R29
adiw R24,3
std y+1,R25
std y+0,R24
mov R18,R20
mov R19,R21
subi R18,255 ; offset = 1
sbci R19,255
ldi R16,<L29
ldi R17,>L29
rcall _round_to_n_places
rjmp L40
L34:
.dbline 123
; else
; n = 7;
ldi R20,7
ldi R21,0
.dbline 124
; }
rjmp L40
L31:
.dbline 126
; else
; n = 7;
ldi R20,7
ldi R21,0
.dbline 129
;
; /* find the rightmost nonzeroes */
; for (; 0 <= n && sp[n] == 0; --n)
rjmp L40
L37:
.dbline 130
; ;
L38:
.dbline 129
subi R20,1
sbci R21,0
L40:
.dbline 129
clr R2
clr R3
cp R20,R2
cpc R21,R3
brlt L41
X11:
ldi R24,<L29
ldi R25,>L29
mov R30,R20
mov R31,R21
add R30,R24
adc R31,R25
ldd R2,z+0
tst R2
breq L37
X12:
L41:
.dbline 131
; for (i = 0; i <= n; i++)
clr R22
clr R23
rjmp L45
L42:
.dbline 132
; sp[i] += '0';
ldi R24,<L29
ldi R25,>L29
mov R2,R22
mov R3,R23
add R2,R24
adc R3,R25
mov R30,R2
mov R31,R3
ldd R24,z+0
subi R24,208 ; addi 48
std z+0,R24
L43:
.dbline 131
subi R22,255 ; offset = 1
sbci R23,255
L45:
.dbline 131
cp R20,R22
cpc R21,R23
brge L42
X13:
.dbline 133
; sp[n+1] = 0;
ldi R24,<L29+1
ldi R25,>L29+1
mov R30,R20
mov R31,R21
add R30,R24
adc R31,R25
clr R2
std z+0,R2
.dbline 135
;
; *dec_scale = d.scale_bin + 1;
ldd R24,y+3
clr R25
adiw R24,1
ldd R30,y+31
ldd R31,y+32
std z+1,R25
std z+0,R24
.dbline 136
; *sign = (x.i < 0); /* what ^%&$&( purpose is served by this???? */
ldi R24,0
ldi R25,0
ldi R26,0
ldi R27,0
ldd R2,y+15
ldd R3,y+16
ldd R4,y+17
ldd R5,y+18
cp R2,R24
cpc R3,R25
cpc R4,R26
cpc R5,R27
brge L48
X14:
ldi R20,1
ldi R21,0
rjmp L49
L48:
clr R20
clr R21
L49:
ldd R30,y+33
ldd R31,y+34
std z+1,R21
std z+0,R20
.dbline 137
; return sp;
ldi R16,<L29
ldi R17,>L29
.dbline -2
L28:
.dbline 0 ; func end
adiw R28,19
rcall pop_xgsetF00C
adiw R28,4
ret
.dbsym l x 15 S[.2]
.dbsym l d 2 S[.1]
.dbsym r i 22 I
.dbsym r n 20 I
.dbsym l sign 33 pI
.dbsym l dec_scale 31 pI
.dbsym r ndigits 10 I
.dbsym l v 25 D
.dbend
.area bss(ram, con, rel)
.dbfile ftoa_slow.c
L51:
.blkb 11
.area text(rom, con, rel)
.dbfile ftoa_slow.c
.dbfunc e ftoa _ftoa fpc
.dbsym s sbuf L51 A[11:11]c
; sign -> y+8
; scale -> y+6
; buf -> R20,R21
; s -> R10,R11
; status -> y+18
; f -> y+14
.even
_ftoa::
rcall push_arg4
rcall push_xgset300C
sbiw R28,10
.dbline -1
.dbline 142
; }
;
; /* buf should be at least 8+3=11 bytes long... */
; char *ftoa(float f, int *status)
; {
.dbline 147
; int scale, sign;
; char *s, *buf;
; static char sbuf[11];
;
; *status = 0;
clr R2
clr R3
ldd R30,y+18
ldd R31,y+19
std z+1,R3
std z+0,R2
.dbline 148
; if (f == 0.0)
ldd R2,y+14
ldd R3,y+15
ldd R4,y+16
ldd R5,y+17
ldi R16,<L54
ldi R17,>L54
rcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
mov R16,R2
mov R17,R3
mov R18,R4
mov R19,R5
rcall fpcmp2
brne L52
X15:
.dbline 149
; {
.dbline 150
; sbuf[0] = '0'; sbuf[1] = '.'; sbuf[2] = '0'; sbuf[3] = 0;
ldi R24,48
sts L51,R24
.dbline 150
ldi R24,46
sts L51+1,R24
.dbline 150
ldi R24,48
sts L51+2,R24
.dbline 150
clr R2
sts L51+3,R2
.dbline 151
; return sbuf;
ldi R16,<L51
ldi R17,>L51
rjmp L50
L52:
.dbline 153
; }
; buf = sbuf;
ldi R20,<L51
ldi R21,>L51
.dbline 154
; s = fcvt(f, 0, &scale, &sign);
mov R24,R28
mov R25,R29
adiw R24,8
std y+5,R25
std y+4,R24
mov R24,R28
mov R25,R29
adiw R24,6
std y+3,R25
std y+2,R24
clr R2
clr R3
std y+1,R3
std y+0,R2
ldd R16,y+14
ldd R17,y+15
ldd R18,y+16
ldd R19,y+17
rcall _fcvt
mov R10,R16
mov R11,R17
.dbline 155
; if (sign)
ldd R2,y+8
ldd R3,y+9
tst R2
brne X16
tst R3
breq L58
X16:
.dbline 156
; *buf++ = '-';
ldi R24,45
mov R30,R20
mov R31,R21
st Z+,R24
mov R20,R30
mov R21,R31
L58:
.dbline 157
; if (scale <= 0)
clr R2
clr R3
ldd R4,y+6
ldd R5,y+7
cp R2,R4
cpc R3,R5
brge X21
rjmp L66
X21:
X17:
.dbline 158
; {
.dbline 159
; *buf++ = '0';
ldi R24,48
mov R30,R20
mov R31,R21
st Z+,R24
.dbline 160
; *buf++ = '.';
ldi R24,46
st Z+,R24
mov R20,R30
mov R21,R31
rjmp L63
L62:
.dbline 162
; while (scale)
; {
.dbline 163
; *buf++ = '0';
ldi R24,48
mov R30,R20
mov R31,R21
st Z+,R24
mov R20,R30
mov R21,R31
.dbline 164
; scale++;
ldd R24,y+6
ldd R25,y+7
adiw R24,1
std y+7,R25
std y+6,R24
.dbline 165
; }
L63:
.dbline 161
ldd R2,y+6
ldd R3,y+7
tst R2
brne L62
tst R3
brne L62
X18:
.dbline 166
; }
rjmp L69
L65:
.dbline 170
; else
; {
; while (scale)
; {
.dbline 171
; *buf++ = *s++;
mov R30,R10
mov R31,R11
mov R26,R20
mov R27,R21
ld R0,Z+
mov R10,R30
mov R11,R31
st X+,R0
mov R20,R26
mov R21,R27
.dbline 172
; scale--;
ldd R24,y+6
ldd R25,y+7
sbiw R24,1
std y+7,R25
std y+6,R24
.dbline 173
; }
L66:
.dbline 169
ldd R2,y+6
ldd R3,y+7
tst R2
brne L65
tst R3
brne L65
X19:
.dbline 174
; *buf++ = '.';
ldi R24,46
mov R30,R20
mov R31,R21
st Z+,R24
mov R20,R30
mov R21,R31
.dbline 175
; }
rjmp L69
L68:
.dbline 177
; while (*s)
; *buf++ = *s++;
mov R30,R10
mov R31,R11
mov R26,R20
mov R27,R21
ld R0,Z+
mov R10,R30
mov R11,R31
st X+,R0
mov R20,R26
mov R21,R27
L69:
.dbline 176
mov R30,R10
mov R31,R11
ldd R2,z+0
tst R2
brne L68
X20:
.dbline 178
; *buf = 0;
clr R2
mov R30,R20
mov R31,R21
std z+0,R2
.dbline 179
; return sbuf;
ldi R16,<L51
ldi R17,>L51
.dbline -2
L50:
.dbline 0 ; func end
adiw R28,10
rcall pop_xgset300C
adiw R28,4
ret
.dbsym l sign 8 I
.dbsym l scale 6 I
.dbsym r buf 20 pc
.dbsym r s 10 pc
.dbsym l status 18 pI
.dbsym l f 14 D
.dbend
.area lit(rom, con, rel)
L54:
.word 0x0,0x0
L24:
.word 0x0,0x3f80
L21:
.word 0x0,0x4120
L20:
.word 0x0,0x4120
L17:
.word 0x209b,0x3e9a
L16:
.word 0x0,0x4b00
; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?