39,9 → 39,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 (?) |
|
75,8 → 76,7 |
je .NoShifts ;¥â æ¨äà ¯®á«¥ § ¯ï⮩ |
jl .Error ;®è¨¡ª |
dec BX |
shl BX, 3 ;㬮¦ ¥¬ 8 |
add EBX, MConst |
lea ebx,[MConst+8*ebx] |
fmul qword [EBX] ;㬮¦¨âì ª®áâ âã |
.NoShifts: |
; §¢«¥çì ç¨á«® ¢ ª®¤¥ BCD |
197,13 → 197,13 |
mov word [Data_BCD+8],0 |
; ç¨é ¥¬ ¡ ©â § ª |
mov [Data_Sign],0 |
; ®á¨¬ ¢ SI 㪠§ ⥫ì áâபã |
mov ESI, Data_String |
; ®á¨¬ ¢ esi 㪠§ ⥫ì áâபã |
mov esi, Data_String |
; யã᪠¥¬ ¯à®¡¥«ë ¯¥à¥¤ ç¨á«®¬ |
mov ecx,64 ;§ é¨â ®â § 横«¨¢ ¨ï |
.ShiftIgnore: |
lodsb |
cmp AL,' ' |
cmp al,' ' |
jne .ShiftIgnoreEnd |
loop .ShiftIgnore |
jmp .Error |
210,23 → 210,24 |
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: |
234,72 → 235,147 |
; ¥á«¨ ® ¥é¥ ¥ ¢áâà¥ç « áì |
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 |
add EBX, MConst |
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] |
fmul qword [ebx] ;㬮¦¨âì ª®áâ âã (¤«ï ç¨á¥« á ¯à¨áâ ¢ª®© e+..) |
jmp .NoDiv |
.NoMul: |
neg ebx |
lea ebx,[MConst+8*ebx] |
fdiv qword [ebx] ;à §¤¥«¨âì ª®áâ âã |
.NoDiv:; ë£à㧨âì ç¨á«® ¢ ¤¢®¨ç®¬ ä®à¬ ⥠|
fstp [Data_Double] |
jmp .End |
align 4 |
.Error:; ਠ«î¡®© ®è¨¡ª¥ ®¡ã«¨âì १ã«ìâ â |
fldz ;§ ¥á⨠®«ì á á⥪ ᮯà®æ¥áá®à |
fstp [Data_Double] |
.End: |
popad |
ret |
|
;output: |
; eax - 1 if error |
; edx += size |
align 4 |
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 [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 |