0,0 → 1,326 |
; |
; äãªæ¨¨ ¤«ï à ¡®âë á ç¨á« ¬¨ float |
; |
|
; ®«¨ç¥á⢮ § ª®¢ ç¨á« ¯®á«¥ § ¯ï⮩ (1-17) |
NumberSymbolsAD DW 5 |
; ®áâ âë (10 ¢ á⥯¥¨ N) |
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 |
DQ 1.0E21,1.0E22,1.0E23,1.0E24,1.0E25 |
DQ 1.0E26,1.0E27,1.0E28,1.0E29,1.0E30 |
DQ 1.0E31,1.0E32,1.0E33,1.0E34,1.0E35 |
DQ 1.0E36,1.0E37,1.0E38,1.0E39,1.0E40 |
DQ 1.0E41,1.0E42,1.0E43,1.0E44,1.0E45 |
DQ 1.0E46,1.0E47,1.0E48,1.0E49,1.0E50 |
DQ 1.0E51,1.0E52,1.0E53,1.0E54,1.0E55 |
DQ 1.0E56,1.0E57,1.0E58,1.0E59,1.0E60 |
DQ 1.0E61,1.0E62,1.0E63,1.0E64,1.0E65 |
DQ 1.0E66,1.0E67,1.0E68,1.0E69,1.0E70 |
DQ 1.0E71,1.0E72,1.0E73,1.0E74,1.0E75 |
DQ 1.0E76,1.0E77,1.0E78,1.0E79,1.0E80 |
DQ 1.0E81,1.0E82,1.0E83,1.0E84,1.0E85 |
DQ 1.0E86,1.0E87,1.0E88,1.0E89,1.0E90 |
DQ 1.0E91,1.0E92,1.0E93,1.0E94,1.0E95 |
DQ 1.0E96,1.0E97,1.0E98,1.0E99,1.0E100 |
DQ 1.0E101,1.0E102,1.0E103,1.0E104,1.0E105 |
DQ 1.0E106,1.0E107,1.0E108,1.0E109,1.0E110 |
DQ 1.0E111,1.0E112,1.0E113,1.0E114,1.0E115 |
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 |
; ¨á«® á ¯« ¢ î饩 § ¯ï⮩ ¤¢®©®© â®ç®á⨠|
Data_Double DQ ? |
; ¨á«® ¢ BCD-ä®à¬ ⥠|
Data_BCD DT ? |
; ᯮ¬®£ ⥫ìë© ä« £ |
Data_Flag DB ? |
; ª १ã«ìâ â (¥á«¨ ¥ 0 - ®âà¨æ ⥫쮥 ç¨á«®) |
Data_Sign DB ? |
|
|
db 0 ;㪠§ ⥫ì ᤢ¨£ ¢ ¯ ¬ï⨠|
; âப ¤«ï åà ¥¨ï ç¨á« ¢ ª®¤¥ ASCII |
Data_String DB 32 DUP (?) |
|
|
|
;******************************************************* |
;*
* |
;* ¨á«® ¨¬¥¥â ä®à¬ â á 㤢®¥®© â®ç®áâìî, १ã«ìâ â * |
;* ¢ë¤ ¥âáï ¢ ¤¥áïâ¨ç®¬ ª®¤¥, ¢ "¡ë⮢®¬" ä®à¬ ⥠á * |
;* 䨪á¨à®¢ ë¬ ª®«¨ç¥á⢮¬ § ª®¢ ¯®á«¥ § ¯ï⮩. * |
;* å®¤ë¥ ¯ à ¬¥âàë: * |
;* Data_Double - ¯à¥®¡à §ã¥¬®¥ ç¨á«®; * |
;* NumberSymbolsAD - ª®«¨ç¥á⢮ § ª®¢ ¯®á«¥ * |
;* § ¯ï⮩ (0-17). * |
;* ëå®¤ë¥ ¯ à ¬¥âàë: * |
;* Data_String - áâப -१ã«ìâ â. * |
;******************************************************* |
DoubleFloat_to_String: |
pushad |
; ¥§ã«ìâ â § ¯¨áë¢ âì ¢ áâபã Data_String |
lea EDI, [Data_String] |
|
; ¤¢¨£ ¥¬ ç¨á«® ¢«¥¢® NumberSymbolsAD |
; ¤¥áïâ¨çëå à §à冷¢ |
fninit ;á¡à®á ᮯà®æ¥áá®à |
fld [Data_Double] ;§ £à㧨âì ç¨á«® |
xor ebx,ebx |
mov BX,[NumberSymbolsAD] |
cmp BX, 0 |
je .NoShifts ;¥â æ¨äà ¯®á«¥ § ¯ï⮩ |
jl .Error ;®è¨¡ª |
dec BX |
shl BX, 3 ;㬮¦ ¥¬ 8 |
lea eax,[MConst] |
add EBX, eax |
fmul qword [EBX] ;㬮¦¨âì ª®áâ âã |
.NoShifts: |
; §¢«¥çì ç¨á«® ¢ ª®¤¥ BCD |
fbstp [Data_BCD] |
; ஢¥à¨âì १ã«ìâ â ¯¥à¥¯®«¥¨¥ |
mov AX,word [Data_BCD + 8] |
cmp AX,0FFFFh ;"¤¥áïâ¨ç®¥" ¯¥à¥¯®«¥¨¥? |
je .Overflow |
; 뤥«¨âì § ª ç¨á« ¨ § ¯¨á âì ¥£® ¢ ASCII-ª®¤¥ |
mov AL, byte [Data_BCD + 9] |
and AL,AL |
jz .NoSign |
mov AL,'-' |
stosb |
.NoSign: |
; ᯠª®¢ âì ç¨á«® ¢ ª®¤ ASCII |
mov ebx,8 ;ᬥ饨¥ ¯®á«¥¤¥© ¯ àë æ¨äà |
mov ecx,9 ;áç¥â稪 ¯ à æ¨äà |
; ¯à¥¤¥«¨âì ¯®§¨æ¨î ¤¥áïâ¨ç®© â®çª¨ ¢ ç¨á«¥ |
mov DX,18 |
sub DX,[NumberSymbolsAD] |
js .Error ;®è¨¡ª , ¥á«¨ ®âà¨æ ⥫ì ï |
jz .Error ;¨«¨ ã«¥¢ ï ¯®§¨æ¨ï |
.NextPair: |
; £à㧨âì ®ç¥à¥¤ãî ¯ àã à §à冷¢ |
mov AL, byte [ebx + Data_BCD] |
mov AH,AL |
; 뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨ |
; á®åà ¨âì áâ àèãî â¥âà ¤ã |
shr AL,4 |
add AL,'0' |
stosb |
dec DX |
jnz .N0 |
mov AL,'.' |
stosb |
.N0: ; 뤥«¨âì, ¯¥à¥¢¥á⨠¢ ASCII ¨ |
; á®åà ¨âì ¬« ¤èãî â¥âà ¤ã |
mov AL,AH |
and AL,0Fh |
add AL,'0' |
stosb |
dec DX |
jnz .N1 |
mov AL,'.' |
stosb |
.N1: |
dec BX |
loop .NextPair |
mov AL,0 |
stosb |
|
; ¡à âì ¥§ ç 騥 㫨 á«¥¢ |
lea EDI, [Data_String] |
lea ESI, [Data_String] |
; யãáâ¨âì § ª ç¨á« , ¥á«¨ ® ¥áâì |
cmp byte [ESI],'-' |
jne .N2 |
inc ESI |
inc EDI |
.N2: ; £à㧨âì ¢ áç¥â稪 横« ª®«¨ç¥á⢮ à §à冷¢ |
; ç¨á« ¯«îá 1 (¡ ©â ¤¥áïâ¨ç®© â®çª¨) |
mov ecx,18+1+1 |
; யãáâ¨âì ¥§ ç 騥 㫨 |
.N3: |
cmp byte [ESI],'0' |
jne .N4 |
cmp byte [ESI+1],'.' |
je .N4 |
inc ESI |
loop .N3 |
; 訡ª - ¥â § ç é¨å æ¨äà |
jmp .Error |
; ª®¯¨à®¢ âì § ç éãî ç áâì ç¨á« ¢ ç «® áâப¨ |
.N4: rep movsb |
jmp .End |
|
; 訡ª |
.Error: |
mov AL,'E' |
stosb |
mov AL,'R' |
stosb |
mov AL,'R' |
stosb |
xor AL,AL |
stosb |
jmp .End |
; ¥à¥¯®«¥¨¥ à §à冷© á¥âª¨ |
.Overflow: |
mov AL,'#' |
stosb |
xor AL,AL |
stosb |
; ®¥æ ¯à®æ¥¤ãàë |
.End: |
popad |
ret |
|
;**************************************************** |
;*
* |
;* (ç¨á«® ¨¬¥¥â ®¡ëçë©, "¡ë⮢®©" ä®à¬ â) * |
;* å®¤ë¥ ¯ à ¬¥âàë: * |
;* Data_String - ç¨á«® ¢ ª®¤¥ ASCII. * |
;* ëå®¤ë¥ ¯ à ¬¥âàë: * |
;* Data_Double - ç¨á«® ¢ ¤¢®¨ç®¬ ª®¤¥. * |
;**************************************************** |
String_to_DoubleFloat: |
pushad |
cld |
; ç¨é ¥¬ Data_BCD |
mov dword [Data_BCD],0 |
mov dword [Data_BCD+4],0 |
mov word [Data_BCD+8],0 |
; ç¨é ¥¬ ¡ ©â § ª |
mov [Data_Sign],0 |
; ®á¨¬ ¢ SI 㪠§ ⥫ì áâபã |
lea ESI, [Data_String] |
; யã᪠¥¬ ¯à®¡¥«ë ¯¥à¥¤ ç¨á«®¬ |
mov ecx,64 ;§ é¨â ®â § 横«¨¢ ¨ï |
.ShiftIgnore: |
lodsb |
cmp AL,' ' |
jne .ShiftIgnoreEnd |
loop .ShiftIgnore |
jmp .Error |
.ShiftIgnoreEnd: |
; ஢¥à塞 § ª ç¨á« |
cmp AL,'-' |
jne .Positive |
mov [Data_Sign],80h |
lodsb |
.Positive: |
mov [Data_Flag],0 ;¯à¨§ ª «¨ç¨ï â®çª¨ |
mov DX,0 ;¯®§¨æ¨ï â®çª¨ |
mov ecx,18 ;¬ ªá. ç¨á«® à §à冷¢ |
.ASCIItoBCDConversion: |
cmp AL,'.' ;â®çª ? |
jne .NotDot |
cmp [Data_Flag],0 ;â®çª ¥ ¢áâà¥ç « áì? |
jne .Error |
mov [Data_Flag],1 |
lodsb |
cmp AL,0 ;ª®¥æ áâப¨? |
jne .NotDot |
jmp .ASCIItoBCDConversionEnd |
.NotDot: |
; ¢¥«¨ç¨âì 1 § 票¥ ¯®§¨æ¨¨ â®çª¨, |
; ¥á«¨ ® ¥é¥ ¥ ¢áâà¥ç « áì |
cmp [Data_Flag],0 |
jnz .Figures |
inc DX |
.Figures: |
; ¨¬¢®«ë ç¨á« ¤®«¦ë ¡ëâì æ¨äà ¬¨ |
cmp AL,'0' |
jb .Error |
cmp AL,'9' |
ja .Error |
; ¨è¥¬ ®ç¥à¥¤ãî æ¨äàã ¢ ¬« ¤èãî â¥âà ¤ã BCD |
and AL,0Fh |
or byte [Data_BCD],AL |
; ஢¥àª ª®¥æ áâப¨ |
cmp byte [ESI],0 |
je .ASCIItoBCDConversionEnd |
; ¤¢¨£ ¥¬ BCD 4 à §àï¤ ¢«¥¢® |
; (ᤢ¨£ ¥¬ áâ à訥 2 ¡ ©â ) |
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 |
; (ᤢ¨£ ¥¬ ¬« ¤è¨¥ 4 ¡ ©â ) |
shl dword [Data_BCD],4 |
; £à㦠¥¬ á«¥¤ãî騩 ᨬ¢®« ¢ AL |
lodsb |
loop .ASCIItoBCDConversion |
;
᫨ 19-© ᨬ¢®« ¥ 0 ¨ ¥ â®çª , |
; â® ®è¨¡ª ¯¥à¥¯®«¥¨ï |
cmp AL,'.' |
jne .NotDot2 |
inc ecx |
lodsb |
.NotDot2: |
cmp AL,0 |
jne .Error ;¯¥à¥¯®«¥¨¥ à §à冷© á¥âª¨ |
|
;
BCD
|
.ASCIItoBCDConversionEnd: |
; ¯¨á âì § ª ¢ áâ à訩 ¡ ©â |
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] ;à §¤¥«¨âì ª®áâ âã |
.NoDiv:; ë£à㧨âì ç¨á«® ¢ ¤¢®¨ç®¬ ä®à¬ ⥠|
fstp [Data_Double] |
jmp .End |
|
.Error:; ਠ«î¡®© ®è¨¡ª¥ ®¡ã«¨âì १ã«ìâ â |
fldz ;§ ¥á⨠®«ì á á⥪ ᮯà®æ¥áá®à |
fstp [Data_Double] |
.End: |
popad |
ret |
|
align 4 |
proc str_cat, str1:dword, str2:dword |
push eax ecx edi esi |
mov esi,dword[str2] |
stdcall str_len,esi |
mov ecx,eax |
inc ecx |
mov edi,dword[str1] |
stdcall str_len,edi |
add edi,eax |
cld |
repne movsb |
pop esi edi ecx eax |
ret |
endp |
|
;output: |
; eax = strlen |
align 4 |
proc str_len, str1:dword |
mov eax,[str1] |
@@: |
cmp byte[eax],0 |
je @f |
inc eax |
jmp @b |
@@: |
sub eax,[str1] |
ret |
endp |