repetição
; masm windows console #
.686 ; create 32 bit code
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
include \masm32\include\windows.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
extern _imp__ExitProcess@4:dword
extern _imp__GetStdHandle@4:dword;
extern _imp__WriteConsoleA@20:dword;
extern _imp__SetConsoleTitleA@4:dword;
extern _imp__SetConsoleScreenBufferSize@8:dword;
extern _imp__FreeConsole@0:dword;
extern _imp__AllocConsole@0:dword;
extern _imp__CharToOemA@8:dword
extern _imp__ReadConsoleA@20:dword
$max equ 60; <-- This number may be increased
magic1 equ 4D10h;lg(2)*65536=19728,3...
magic2 equ 35269h;log2(10)*65536=3,32192809488736234780*65536=217705,8796265381788254208..
.data
dt 1.0e$max
dw 0
irp k,<59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,\
38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,\
16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1>
dt 1.0e&k
dw 0
endm
tabs dt 1.0
dw 0
irp k,<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,\
26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,\
48,49,50,51,52,53,54,55,56,57,58,59,$max>
dt 1.0e-&k
dw 0
endm
table0 db "000102030405060708091011121314151617181920212223242526272829"
db "303132333435363738394041424344454647484950515253545556575859"
db "606162636465666768697071727374757677787980818283848586878889"
db "90919293949596979899"
table1 dd shift0,shift1,shift2,shift3,shift4
string db 40 dup(0)
crd COORD <40,225>
HANDL dd ?
HANDL1 dd ?
TITL db 0
STR1 db 'Prima qualquer tecla para continuar...';'Press Enter to continue'
LENS db ?
xxx db 0,0,0,0,0,0,0,80h,0,0;=3.3621031431120935E-4932
db 8 dup(0FFh),0,0;6.724206286224187E-4932
db 1,9 dup(0); =ERROR
dd 0,80000000h
dw 7FFFh ; Infinity
dd 0,80000000h
dw 0FFFFh ; -Infinity
dd 0,0C0000000h
dw 0FFFFh; -Uncertainty
dd 0,0C0000000h
dw 7FFFh; Uncertainty
dd 0,90000000h
dw 7FFFh; Signal Non a Number
dd 0,90000000h
dw 0FFFFh; -Signal Non a Number
dd 0,0D0000000h
dw 0FFFFh; -Quiet Non a Number
dd 0,0D0000000h
dw 7FFFh; Quiet Non a Number
dd 0,70000000h
dw 07FFFh; Error
dd 0,70000000h
dw 0FFFFh; -Error
dd 0FFFFFFFFh,0FFFFFFFFh
dw 07FFEh; = 1.18973149535723177E+4932
dd 0FFFFFFFFh,0FFFFFFFFh
dw 0FFFEh; =-1.18973149535723177E+4932
dt -0.0
dt 0
dt 1.0
dt 2.0
dt 3.0
dt 4.0
dt 5.0
dt 6.0
dt 7.0
dt 8.0
dt 9.0
dt 0.1
dt 0.2
dt 0.3
dt 0.4
dt 0.5
dt 0.6
dt 0.7
dt 0.8
dt 0.9
dt -1.1
dt -11.1
dt -111.1
dt -1111.1
dt -11111.1
dt -111111.1
dt -1111111.1
dt -11111111.1
dt -111111111.1
dt -1111111111.1
dt -11111111111.1
dt -111111111111.1
dt -1111111111111.1
dt -11111111111111.1
dt -111111111111111.1
dt -1111111111111111.1
dt -11111111111111111.1
dt -111111111111111111.1
dt -1111111111111111111.1
dt -2.2
dt -22.2
dt -222.2
dt -2222.2
dt -22222.2
dt -222222.2
dt -2222222.2
dt -22222222.2
dt -222222222.2
dt -2222222222.2
dt -22222222222.2
dt -222222222222.2
dt -2222222222222.2
dt -22222222222222.2
dt -222222222222222.2
dt -2222222222222222.2
dt -22222222222222222.2
dt -222222222222222222.2
dt -2222222222222222222.2
dt -3.3
dt -33.3
dt -333.3
dt -3333.3
dt -33333.3
dt -333333.3
dt -3333333.3
dt -33333333.3
dt -333333333.3
dt -3333333333.3
dt -33333333333.3
dt -333333333333.3
dt -3333333333333.3
dt -33333333333333.3
dt -333333333333333.3
dt -3333333333333333.3
dt -33333333333333333.3
dt -333333333333333333.3
dt -3333333333333333333.3
dt -4.4
dt -44.4
dt -444.4
dt -4444.4
dt -44444.4
dt -444444.4
dt -4444444.4
dt -44444444.4
dt -444444444.4
dt -4444444444.4
dt -44444444444.4
dt -444444444444.4
dt -4444444444444.4
dt -44444444444444.4
dt -444444444444444.4
dt -4444444444444444.4
dt -44444444444444444.4
dt -444444444444444444.4
dt -4444444444444444444.4
dt -5.5
dt -55.5
dt -555.5
dt -5555.5
dt -55555.5
dt -555555.5
dt -5555555.5
dt -55555555.5
dt -555555555.5
dt -5555555555.5
dt -55555555555.5
dt -555555555555.5
dt -5555555555555.5
dt -55555555555555.5
dt -555555555555555.5
dt -5555555555555555.5
dt -55555555555555555.5
dt -555555555555555555.5
dt -5555555555555555555.5
dt -6.6
dt -66.6
dt -666.6
dt -6666.6
dt -66666.6
dt -666666.6
dt -6666666.6
dt -66666666.6
dt -666666666.6
dt -6666666666.6
dt -66666666666.6
dt -666666666666.6
dt -6666666666666.6
dt -66666666666666.6
dt -666666666666666.6
dt -6666666666666666.6
dt -66666666666666666.6
dt -666666666666666666.6
dt -6666666666666666666.6
dt -7.7
dt -77.7
dt -777.7
dt -7777.7
dt -77777.7
dt -777777.7
dt -7777777.7
dt -77777777.7
dt -777777777.7
dt -7777777777.7
dt -77777777777.7
dt -777777777777.7
dt -7777777777777.7
dt -77777777777777.7 ;ecx=3
dt -777777777777777.7
dt -7777777777777777.7
dt -77777777777777777.7
dt -777777777777777777.7
dt -7777777777777777777.7
dt -8.8
dt -88.8
dt -888.8
dt -8888.8
dt -88888.8
dt -888888.8
dt -8888888.8;ecx=4
dt -88888888.8
dt -888888888.8
dt -8888888888.8
dt -88888888888.8
dt -888888888888.8
dt -8888888888888.8
dt -88888888888888.8
dt -888888888888888.8
dt -8888888888888888.8
dt -88888888888888888.8
dt -888888888888888888.8
dt -8888888888888888888.8
dt -9.9
dt -99.9;the result of multiplying is -9.9900000000000000010
dt -999.9
dt -9999.9
dt -99999.9
dt -999999.9
dt -9999999.9
dt -99999999.9
dt -999999999.9;-9.9999999990000000010
dt -9999999999.9;ecx=4
dt -99999999999.9
dt -999999999999.9
dt -9999999999999.9;the result of multiplying is -9.9999999999998999990
dt -99999999999999.9
dt -999999999999999.9
dt -9999999999999999.9
dt -99999999999999999.9
dt -999999999999999999.9
dt -9999999999999999999.9
dt 0.1
dt 0.01
dt 0.001
dt 0.0001
dt 0.00001
dt 0.000001
dt 0.0000001
dt 0.00000001
dt 0.000000001
dt 0.0000000001
dt 0.00000000001
dt 0.000000000001
dt 0.0000000000001
dt 0.00000000000001
dt 0.000000000000001
dt 0.0000000000000001
dt 0.00000000000000001
dt 1.0E-18
dt 0.2
dt 0.02
dt 0.002
dt 0.0002
dt 0.00002
dt 0.000002
dt 0.0000002
dt 0.00000002
dt 0.000000002
dt 0.0000000002
dt 0.00000000002
dt 0.000000000002
dt 0.0000000000002
dt 0.00000000000002
dt 0.000000000000002
dt 0.0000000000000002
dt 0.00000000000000002
dt 2.0E-18
dt 0.3
dt 0.03
dt 0.003
dt 0.0003
dt 0.00003
dt 0.000003
dt 0.0000003
dt 0.00000003
dt 0.000000003
dt 0.0000000003
dt 0.00000000003
dt 0.000000000003
dt 0.0000000000003
dt 0.00000000000003
dt 0.000000000000003
dt 0.0000000000000003
dt 0.00000000000000003
dt 3.0E-18
dt 0.4
dt 0.04
dt 0.004
dt 0.0004
dt 0.00004
dt 0.000004
dt 0.0000004
dt 0.00000004
dt 0.000000004
dt 0.0000000004
dt 0.00000000004
dt 0.000000000004
dt 0.0000000000004
dt 0.00000000000004
dt 0.000000000000004
dt 0.0000000000000004
dt 0.00000000000000004
dt 4.0E-18
dt 0.5
dt 0.05
dt 0.005
dt 0.0005
dt 0.00005
dt 0.000005
dt 0.0000005
dt 0.00000005
dt 0.000000005
dt 0.0000000005
dt 0.00000000005
dt 0.000000000005
dt 0.0000000000005
dt 0.00000000000005
dt 0.000000000000005
dt 0.0000000000000005
dt 0.00000000000000005
dt 5.0E-18
dt 0.6
dt 0.06
dt 0.006
dt 0.0006
dt 0.00006
dt 0.000006
dt 0.0000006
dt 0.00000006
dt 0.000000006
dt 0.0000000006
dt 0.00000000006
dt 0.000000000006
dt 0.0000000000006
dt 0.00000000000006
dt 0.000000000000006
dt 0.0000000000000006
dt 0.00000000000000006
dt 6.0E-18
dt 0.7
dt 0.07
dt 0.007
dt 0.0007
dt 0.00007
dt 0.000007
dt 0.0000007
dt 0.00000007
dt 0.000000007
dt 0.0000000007
dt 0.00000000007
dt 0.000000000007
dt 0.0000000000007
dt 0.00000000000007
dt 0.000000000000007
dt 0.0000000000000007
dt 0.00000000000000007
dt 7.0E-18
dt 0.8
dt 0.08
dt 0.008
dt 0.0008
dt 0.00008
dt 0.000008
dt 0.0000008
dt 0.00000008
dt 0.000000008
dt 0.0000000008
dt 0.00000000008
dt 0.000000000008
dt 0.0000000000008
dt 0.00000000000008
dt 0.000000000000008
dt 0.0000000000000008
dt 0.00000000000000008
dt 8.0E-18
dt 0.9
dt 0.09
dt 0.009
dt 0.0009
dt 0.00009
dt 0.000009
dt 0.0000009
dt 0.00000009
dt 0.000000009
dt 0.0000000009
dt 0.00000000009
dt 0.000000000009
dt 0.0000000000009
dt 0.00000000000009
dt 0.000000000000009
dt 0.0000000000000009
dt 0.00000000000000009
dt 9.0E-18
dt -1.23456789123456
dt -12.3456789123456
dt -123.456789123456
dt -1234.56789123456
dt -12345.6789123456
dt -123456.789123456
dt -1234567.89123456
dt -12345678.9123456
dt -12345678.9123456
dt -123456789.123456
dt -1234567891.123456
dt -12345678912.123456
dt -123456789123.123456
dt -1234567891234.123456
dt -12345678912345.12345
dt -123456789123456.1234
dt -1234567891234567.123
dt -12345678912345678.12
dt -123456789123456789.1
dt -1234567891234567891.0
num = ($ - xxx)/10
.code
start: call _imp__FreeConsole@0;free the existing console
call _imp__AllocConsole@0;we form a console
push STD_INPUT_HANDLE
call _imp__GetStdHandle@4;HANDL1 obtain input
mov HANDL1,eax
push STD_OUTPUT_HANDLE
call _imp__GetStdHandle@4;HANDL get to output
mov HANDL,eax
push crd
push eax
call _imp__SetConsoleScreenBufferSize@8
push offset TITL
call _imp__SetConsoleTitleA@4;definition window title
mov ebx,offset xxx
mov ecx,num/24
a11: push ecx
mov ecx,24
@@: push ecx
push offset string
push ebx
call Eprst
push 0
push offset LENS
push dword ptr string
push offset string+4
push HANDL
call _imp__WriteConsoleA@20;we derive a string of characters
add ebx,10
pop ecx
loop @b
push 0
push offset LENS
push 38
push offset STR1
push HANDL
call _imp__WriteConsoleA@20;we derive a string of characters
push 0
push offset LENS
push 200
push offset string
push HANDL1
call _imp__ReadConsoleA@20;waiting to enter a string of characters
pop ecx
loop a11
mov ecx,(num mod 24)
jecxz a12
@@: push ecx
push offset string
push ebx
call Eprst
push 0
push offset LENS
push dword ptr string
push offset string+4
push HANDL
call _imp__WriteConsoleA@20;we derive a string of characters
add ebx,10
pop ecx
loop @b
a12: push 0
push offset LENS
push 200
push offset string
push HANDL1
call _imp__ReadConsoleA@20;waiting to enter a string of characters
push 0
call _imp__ExitProcess@4
;===================================================
Eprst proc uses edi esi ebx lpReal10:dword,lpDest:dword
local iExp:dword
local x[3]:dword
local temp1:dword
local temp2:dword
fninit
mov ecx,lpReal10
fld tbyte ptr [ecx]
mov edi,lpDest
mov ebx,[ecx]
add edi,4
mov eax,[ecx+4]
mov [x],ebx
movzx edx,word ptr [ecx+8]
mov [x+4],eax
mov [x+8],edx
cmp edx,8000h
mov byte ptr [edi],'-'
sbb esi,esi
and esi,0Dh
sub [edi],esi
and edx,7FFFh
jnz a2
Zero_Or_Denormal: cmp edx,eax
jnz Denormal
cmp ebx,eax
jnz Denormal
mov dword ptr [edi+1],'oreZ'
mov word ptr [edi+5],0A0Dh
mov dword ptr [edi-4],7
ret
a2: cmp edx,7FFFh
jz Infinity_Or_SNAN_Or_QNAN_Or_Uncertainty
Denormal:mov esi,10
sub edx,16383
mov word ptr [edi+21],'+E'
imul edx,magic1
mov word ptr [edi+27],0A0Dh
and edx,0FFFF0000h
mov dword ptr [edi-4],29
sar edx,14
mov iExp,edx
jz @f
cmp edx,4*$max
jg a1
cmp edx,-4*$max
jge load
;------------------------------------------------
dec edx
a1: not edx
sar edx,2
mov temp1,edx
imul edx,magic2
sar edx,16
mov temp2,edx
fild temp2 ; get the characteristic
fild temp1 ; ????? ????? log2(10)*expscale
fldl2t ; log2(10)
fmul ; log2(10)*expscale
fsub st,st(1) ; get only the mantissa but keep the characteristic
f2xm1 ; 2^(mantissa)-1
fld1
fadd ; add 1 and pop
fscale
fstp st(1) ; remove the characteristic
jmp multiply
load: fld tabs[edx+edx*2]
multiply:fmul ; X * 10^expscaleS
fld st
fstp tbyte ptr x
xor edx,edx
@@: mov ecx,x+8
mov ebx,x
mov eax,x+4
and ecx,7FFFh
sub ecx,16382
cmp ecx,4
ja shift0
jmp table1[ecx*4]
shift4::test eax,60000000h
jz a6
fld tabs[12]
fmul
add iExp,4
fstp tbyte ptr x
mov eax,x+4
mov ebx,x
shld edx,eax,1
shld eax,ebx,1
shl ebx,1
add ebx,4
jmp shift0
a6: shld edx,eax,4 ;ecx=1 ebx+4
shld eax,ebx,4 ;ecx=2 ebx+8
shl ebx,4 ;ecx=3 ebx+9
add ebx,12 ;ecx=4 ebx+12
jmp shift0
shift3::shld edx,eax,3
shld eax,ebx,3
shl ebx,3
add ebx,9;10
jmp shift0
shift2::shld edx,eax,2
shld eax,ebx,2
shl ebx,2
add ebx,8
jmp shift0
shift1::shld edx,eax,1
shld eax,ebx,1
shl ebx,1
add ebx,4
shift0::adc eax,0
adc edx,0
mov [edi+1],dl
mov byte ptr [edi+2],','
or byte ptr [edi+1],'0'
k=3
rept 17
mul esi
mov [edi+k],dl
mov ecx,eax
mov eax,ebx
mul esi
add ecx,edx
adc byte ptr [edi+k],'0'
mov ebx,eax
mov eax,ecx
k=k+1
endm
mul esi
mov [edi+k],dl
mov ecx,eax
mov eax,ebx
mul esi
add ecx,edx
adc byte ptr [edi+k],'0'
;--------------------------------------
mov eax,iExp
mov edx,eax
sar eax,2
sar edx,31
xor eax,edx
sub eax,edx
and edx,2
add byte ptr [edi+22],dl
mov esi,eax
mov edx,42949673;2^32/100
mul edx
mov ax,word ptr table0[edx*2] ;edx = quotient of the division by 100
mov word ptr [edi+23],ax
lea eax,[edx*4]
shl edx,2
lea edx,[edx+edx*2]
lea edx,[eax+edx*8] ;edx = quotient*100
sub esi,edx ;esi = remainder of the division by 100
mov ax,word ptr table0[esi*2]
mov word ptr [edi+25],ax
ret
Infinity_Or_SNAN_Or_QNAN_Or_Uncertainty:
cmp eax,80000000h
jnz SNAN_Or_QNAN_Or_Uncertainty
and ebx,ebx
jnz SNAN_Or_QNAN_Or_Uncertainty
mov dword ptr [edi+1],'ifnI'
mov dword ptr [edi+5],'ytin'
mov word ptr [edi+9],0A0Dh
mov dword ptr [edi-4],11
ret
SNAN_Or_QNAN_Or_Uncertainty:
test eax,eax
jns error
test eax,40000000h
jnz QNAN
mov dword ptr [edi+1],'ngiS'
mov dword ptr [edi+5],'N la'
mov dword ptr [edi+9],'a no'
mov dword ptr [edi+13],'muN '
mov dword ptr [edi+17],0D726562h;'reb'
mov dword ptr [edi+21],0Ah
mov dword ptr [edi-4],22
ret
QNAN: test eax,3FFFFFFFh
jnz @f
test ebx,ebx
jnz @f
mov dword ptr [edi+1],'ecnU'
mov dword ptr [edi+5],'iatr'
mov dword ptr [edi+9],0D79746Eh;'ytn'
mov byte ptr [edi+13],0Ah
mov dword ptr [edi-4],14
ret
@@: mov dword ptr [edi+1],'eiuQ'
mov dword ptr [edi+5],'oN t'
mov dword ptr [edi+9],' a n'
mov dword ptr [edi+13],'bmuN'
mov dword ptr [edi+17],0A0D7265h;'re'
mov dword ptr [edi-4],21
ret
error: mov dword ptr [edi+1],'orrE'
mov dword ptr [edi+5],0A0D72h;'r'
mov dword ptr [edi-4],8
ret
Eprst endp
end start