5,7 → 5,7 |
; ®«¨ç¥á⢮ § ª®¢ ç¨á« ¯®á«¥ § ¯ï⮩ (1-17) |
NumberSymbolsAD DW 5 |
; ®áâ âë (10 ¢ á⥯¥¨ N) |
MConst DQ 1.0E1,1.0E2,1.0E3,1.0E4,1.0E5 |
MConst: DQ 1.0E1,1.0E2,1.0E3,1.0E4,1.0E5 |
DQ 1.0E6,1.0E7,1.0E8,1.0E9,1.0E10 |
DQ 1.0E11,1.0E12,1.0E13,1.0E14,1.0E15 |
DQ 1.0E16,1.0E17,1.0E18,1.0E19,1.0E20 |
31,6 → 31,7 |
DQ 1.0E116,1.0E117,1.0E118,1.0E119,1.0E120 |
DQ 1.0E121,1.0E122,1.0E123,1.0E124,1.0E125 |
DQ 1.0E126,1.0E127,1.0E128 |
.end: |
; ¨á«® á ¯« ¢ î饩 § ¯ï⮩ ¤¢®©®© â®ç®á⨠|
Data_Double DQ ? |
; ¨á«® ¢ BCD-ä®à¬ ⥠|
39,9 → 40,10 |
Data_Flag DB ? |
; ª १ã«ìâ â (¥á«¨ ¥ 0 - ®âà¨æ ⥫쮥 ç¨á«®) |
Data_Sign DB ? |
; ª १ã«ìâ â - 0 ¤«ï ..e+.. ¨ 1 ¤«ï ..e-.. |
Data_Sign_Exp DB ? |
|
|
db 0 ;㪠§ ⥫ì ᤢ¨£ ¢ ¯ ¬ï⨠|
align 4 |
; âப ¤«ï åà ¥¨ï ç¨á« ¢ ª®¤¥ ASCII |
Data_String DB 32 DUP (?) |
|
59,10 → 61,11 |
;* ëå®¤ë¥ ¯ à ¬¥âàë: * |
;* Data_String - áâப -१ã«ìâ â. * |
;******************************************************* |
align 4 |
DoubleFloat_to_String: |
pushad |
; ¥§ã«ìâ â § ¯¨áë¢ âì ¢ áâபã Data_String |
lea EDI, [Data_String] |
mov EDI, Data_String |
|
; ¤¢¨£ ¥¬ ç¨á«® ¢«¥¢® NumberSymbolsAD |
; ¤¥áïâ¨çëå à §à冷¢ |
74,9 → 77,7 |
je .NoShifts ;¥â æ¨äà ¯®á«¥ § ¯ï⮩ |
jl .Error ;®è¨¡ª |
dec BX |
shl BX, 3 ;㬮¦ ¥¬ 8 |
lea eax,[MConst] |
add EBX, eax |
lea ebx,[MConst+8*ebx] |
fmul qword [EBX] ;㬮¦¨âì ª®áâ âã |
.NoShifts: |
; §¢«¥çì ç¨á«® ¢ ª®¤¥ BCD |
130,8 → 131,8 |
stosb |
|
; ¡à âì ¥§ ç 騥 㫨 á«¥¢ |
lea EDI, [Data_String] |
lea ESI, [Data_String] |
mov EDI, Data_String |
mov ESI, Data_String |
; யãáâ¨âì § ª ç¨á« , ¥á«¨ ® ¥áâì |
cmp byte [ESI],'-' |
jne .N2 |
151,10 → 152,11 |
; 訡ª - ¥â § ç é¨å æ¨äà |
jmp .Error |
; ª®¯¨à®¢ âì § ç éãî ç áâì ç¨á« ¢ ç «® áâப¨ |
align 4 |
.N4: rep movsb |
jmp .End |
|
; 訡ª |
align 4 |
.Error: |
mov AL,'E' |
stosb |
166,6 → 168,7 |
stosb |
jmp .End |
; ¥à¥¯®«¥¨¥ à §à冷© á¥âª¨ |
align 4 |
.Overflow: |
mov AL,'#' |
stosb |
172,6 → 175,7 |
xor AL,AL |
stosb |
; ®¥æ ¯à®æ¥¤ãàë |
align 4 |
.End: |
popad |
ret |
184,6 → 188,7 |
;* ëå®¤ë¥ ¯ à ¬¥âàë: * |
;* Data_Double - ç¨á«® ¢ ¤¢®¨ç®¬ ª®¤¥. * |
;**************************************************** |
align 4 |
String_to_DoubleFloat: |
pushad |
cld |
193,110 → 198,200 |
mov word [Data_BCD+8],0 |
; ç¨é ¥¬ ¡ ©â § ª |
mov [Data_Sign],0 |
; ®á¨¬ ¢ SI 㪠§ ⥫ì áâபã |
lea ESI, [Data_String] |
; ®á¨¬ ¢ esi 㪠§ ⥫ì áâபã |
mov esi, Data_String |
; யã᪠¥¬ ¯à®¡¥«ë ¯¥à¥¤ ç¨á«®¬ |
mov ecx,64 ;§ é¨â ®â § 横«¨¢ ¨ï |
.ShiftIgnore: |
lodsb |
cmp AL,' ' |
cmp al,' ' |
jne .ShiftIgnoreEnd |
loop .ShiftIgnore |
jmp .Error |
align 4 |
.ShiftIgnoreEnd: |
; ஢¥à塞 § ª ç¨á« |
cmp AL,'-' |
cmp al,'-' |
jne .Positive |
mov [Data_Sign],80h |
lodsb |
.Positive: |
mov [Data_Flag],0 ;¯à¨§ ª «¨ç¨ï â®çª¨ |
mov DX,0 ;¯®§¨æ¨ï â®çª¨ |
xor edx,edx ;¯®§¨æ¨ï â®çª¨ |
mov ecx,18 ;¬ ªá. ç¨á«® à §à冷¢ |
align 4 |
.ASCIItoBCDConversion: |
cmp AL,'.' ;â®çª ? |
cmp al,'.' ;â®çª ? |
jne .NotDot |
cmp [Data_Flag],0 ;â®çª ¥ ¢áâà¥ç « áì? |
jne .Error |
jne .Error ;¥á«¨ â®çª 㦥 ¡ë« |
mov [Data_Flag],1 |
lodsb |
cmp AL,0 ;ª®¥æ áâப¨? |
jne .NotDot |
or al,al ;ª®¥æ áâப¨? |
jnz .NotDot |
jmp .ASCIItoBCDConversionEnd |
align 4 |
.NotDot: |
; ¢¥«¨ç¨âì 1 § 票¥ ¯®§¨æ¨¨ â®çª¨, |
; ¥á«¨ ® ¥é¥ ¥ ¢áâà¥ç « áì |
cmp [Data_Flag],0 |
jnz .Figures |
inc DX |
inc edx |
.Figures: |
cmp al,'e' |
je .exp_form |
cmp al,'E' |
jne @f |
.exp_form: |
call string_ExpForm ;¥á«¨ ç¨á«® ¢ ä®à¬ ⥠..e.. |
or al,al |
jnz .Error |
jmp .ASCIItoBCDConversionEnd |
@@: |
; ¨¬¢®«ë ç¨á« ¤®«¦ë ¡ëâì æ¨äà ¬¨ |
cmp AL,'0' |
cmp al,'0' |
jb .Error |
cmp AL,'9' |
cmp al,'9' |
ja .Error |
; ¨è¥¬ ®ç¥à¥¤ãî æ¨äàã ¢ ¬« ¤èãî â¥âà ¤ã BCD |
and AL,0Fh |
or byte [Data_BCD],AL |
and al,15 ;ᨬ¢®«ë 0-9 ¯¥à¥¢®¤¨¬ ¢ ç¨á«® |
or byte [Data_BCD],al |
; ஢¥àª ª®¥æ áâப¨ |
cmp byte [ESI],0 |
cmp byte [esi],0 |
je .ASCIItoBCDConversionEnd |
; ¤¢¨£ ¥¬ BCD 4 à §àï¤ ¢«¥¢® |
; (ᤢ¨£ ¥¬ áâ à訥 2 ¡ ©â ) |
mov AX,word [Data_BCD+6] |
shld word [Data_BCD+8],AX,4 |
mov ax,word [Data_BCD+6] |
shld word [Data_BCD+8],ax,4 |
; (ᤢ¨£ ¥¬ á।¨¥ 4 ¡ ©â ) |
mov EAX, dword [Data_BCD] |
shld dword [Data_BCD+4],EAX,4 |
mov eax,dword [Data_BCD] |
shld dword [Data_BCD+4],eax,4 |
; (ᤢ¨£ ¥¬ ¬« ¤è¨¥ 4 ¡ ©â ) |
shl dword [Data_BCD],4 |
; £à㦠¥¬ á«¥¤ãî騩 ᨬ¢®« ¢ AL |
lodsb |
loop .ASCIItoBCDConversion |
loop .ASCIItoBCDConversion ;¥á«¨ ¥ ª®¬¯¨«. â® ¯®áâ ¢¨âì dec ecx, jnz ... |
;
᫨ 19-© ᨬ¢®« ¥ 0 ¨ ¥ â®çª , |
; â® ®è¨¡ª ¯¥à¥¯®«¥¨ï |
cmp AL,'.' |
cmp al,'.' |
jne .NotDot2 |
inc ecx |
inc ecx ;¯à®¯ã᪠â®çª¨ ¢ ª®æ¥ ®ç¥ì ¡®«ì讣® ç¨á« |
lodsb |
.NotDot2: |
cmp AL,0 |
jne .Error ;¯¥à¥¯®«¥¨¥ à §à冷© á¥âª¨ |
or al,al ;¯¥à¥¯®«¥¨¥ à §à冷© á¥âª¨? |
jz .ASCIItoBCDConversionEnd |
align 4 |
.Error: ; ਠ«î¡®© ®è¨¡ª¥ ®¡ã«¨âì १ã«ìâ â |
fldz ;§ ¥á⨠®«ì á á⥪ ᮯà®æ¥áá®à |
fstp [Data_Double] |
jmp .End |
|
;
BCD
|
.ASCIItoBCDConversionEnd: |
; ¯¨á âì § ª ¢ áâ à訩 ¡ ©â |
mov AL,[Data_Sign] |
mov byte [Data_BCD+9],AL |
mov al,[Data_Sign] |
mov byte [Data_BCD+9],al |
; ¡à®á¨âì ॣ¨áâàë ᮯà®æ¥áá®à |
fninit |
; £à㧨âì ¢ ᮯà®æ¥áá®à ç¨á«® ¢ BCD-ä®à¬ ⥠|
fbld [Data_BCD] |
; ëç¨á«¨âì ®¬¥à ¤¥«¨â¥«ï |
mov EBX,18+1 |
sub BX,CX |
sub BX,DX |
cmp EBX,0 |
je .NoDiv |
dec EBX |
shl EBX,3 ;㬮¦ ¥¬ 8 |
lea eax,[MConst] |
add EBX,eax |
fdiv qword [EBX] ;à §¤¥«¨âì ª®áâ âã |
; ëç¨á«¨âì ®¬¥à ¤¥«¨â¥«ï ¨«¨ ¬®¦¨â¥«ï |
lea ebx,[ecx+edx-18] |
cmp ebx,0 |
jle .NoMul ;¥á«¨ ç¨á«® e-.. |
dec ebx |
jz .NoDiv ;¥á«¨ ç¨á«® e+0 |
dec ebx |
lea ebx,[MConst+8*ebx] |
cmp ebx,MConst.end |
jl @f |
ffree st0 |
fincstp |
jmp .Error ;¥á«¨ ®ç¥ì ¡®«ì讥 ç¨á«® e+** |
@@: |
fmul qword [ebx] ;㬮¦¨âì ª®áâ âã (¤«ï ç¨á¥« á ¯à¨áâ ¢ª®© e+..) |
jmp .NoDiv |
.NoMul: |
neg ebx |
lea ebx,[MConst+8*ebx] |
cmp ebx,MConst.end |
jl @f |
ffree st0 |
fincstp |
jmp .Error ;¥á«¨ ®ç¥ì ¬ «¥ìª®¥ ç¨á«® e-** |
@@: |
fdiv qword [ebx] ;à §¤¥«¨âì ª®áâ âã |
.NoDiv:; ë£à㧨âì ç¨á«® ¢ ¤¢®¨ç®¬ ä®à¬ ⥠|
fstp [Data_Double] |
jmp .End |
|
.Error:; ਠ«î¡®© ®è¨¡ª¥ ®¡ã«¨âì १ã«ìâ â |
fldz ;§ ¥á⨠®«ì á á⥪ ᮯà®æ¥áá®à |
fstp [Data_Double] |
.End: |
popad |
ret |
|
;output: |
; eax - 1 if error |
; edx += size |
align 4 |
proc str_cat, str1:dword, str2:dword |
push eax ecx edi esi |
proc string_ExpForm uses ebx |
mov [Data_Sign_Exp],0 |
xor eax,eax |
lodsb |
cmp al,'+' |
jne @f |
lodsb |
@@: |
cmp al,'-' |
jne @f |
inc [Data_Sign_Exp] |
lodsb |
@@: |
|
xor ebx,ebx |
.cycle0: |
cmp al,0 |
je .cycle0end |
cmp al,9 |
je .cycle0end |
cmp al,10 |
je .cycle0end |
cmp al,13 |
je .cycle0end |
cmp al,' ' |
je .cycle0end |
cmp al,'0' |
jb .Error |
cmp al,'9' |
ja .Error |
|
imul ebx,10 |
and eax,15 ;ᨬ¢®«ë 0-9 ¯¥à¥¢®¤¨¬ ¢ ç¨á«® |
add ebx,eax |
lodsb |
jmp .cycle0 |
.cycle0end: |
|
cmp ebx,328 ;308 - ¬ ªá. à §¬¥à á⥯¥¨ ¤«ï double + 20 - ç¨á«® à §à冷¢ ¢ BCD |
ja .Error |
cmp [Data_Sign_Exp],0 |
je @f |
neg ebx |
@@: |
cmp [Data_Flag],0 ;â®çª ¥ ¢áâà¥ç « áì? |
jne @f |
dec edx |
@@: |
add edx,ebx |
|
xor eax,eax |
jmp @f |
.Error: |
xor eax,eax |
inc eax |
@@: |
ret |
endp |
|
align 4 |
proc str_cat uses eax ecx edi esi, str1:dword, str2:dword |
mov esi,dword[str2] |
stdcall str_len,esi |
mov ecx,eax |
306,7 → 401,6 |
add edi,eax |
cld |
repne movsb |
pop esi edi ecx eax |
ret |
endp |
|
323,4 → 417,34 |
@@: |
sub eax,[str1] |
ret |
endp |
|
align 4 |
proc String_crop_0 uses eax ebx ecx edi |
mov edi,Data_String |
mov al,'.' |
mov ecx,32 |
repne scasb |
mov ebx,edi |
mov edi,Data_String |
xor al,al |
mov ecx,32 |
repne scasb |
cmp ebx,edi |
jg .end_f |
dec edi |
.cycle0: |
dec edi |
cmp edi,Data_String |
jle .end_f |
cmp byte[edi],'0' |
jne .cycle0end |
mov byte[edi],0 |
jmp .cycle0 |
.cycle0end: |
cmp byte[edi],'.' |
jne .end_f |
mov byte[edi],0 |
.end_f: |
ret |
endp |