Кто знает плз подскажите как можно перевести число с плав.точкой (например в какомто буффере) в АНСИ :\ ps:слышал что можно осуществить с помощью тогоже FPU
нет у меня идут вычесления обьема резервуара все в метрах и ест-о бывает и длина 5.78м и высота 7.345м и тд. я сначала все на обычных регистрах делал потом переводил в мм (просто mul на 1000 и в eax) но ввыводить то надо все равно в метрах! т.е. вещ.числ.
в форуме не нашел по вещ.числам насчет masm`a я только начинаю на fasme работать не подскажешь хотябы как в теории число ну скажем 245 в одном байте можно раскидать на три байта по позициям |2|4|5| (затем +30h)->ANSI2
Так тебе вещественные или нет? Если нет и попроще, смотри функции wsprintf (user32), если да - _ecvt, _fcvt, _gcvt из msvcrt.dll. В теории: самое простое, в цикле делить на 10 и забирать остатки, преобразуя их уже в символы. Посложнее - использовать математику: Код (Text): proc dwtoa dwValue, lpBuffer ; ------------------------------------------------------------- ; convert DWORD to ascii string ; dwValue is value to be converted ; lpBuffer is the address of the receiving buffer ; EXAMPLE: ; invoke dwtoa,edx,ADDR buffer ; ; Uses: eax, ecx, edx. ; ------------------------------------------------------------- push ebx push esi push edi mov eax, [dwValue] mov edi, [lpBuffer] or eax,eax jnz .sign .zero: mov word [edi],30h jmp .dw2asc .sign: jns pos mov byte [edi],'-' neg eax inc edi .pos: mov ecx,429496730 mov esi, edi .whilex: mov ebx,eax mul ecx mov eax,edx lea edx,[edx*4+edx] add edx,edx sub ebx,edx add bl,'0' mov [edi],bl inc edi test eax,eax ja .whilex mov byte [edi], 0 ; terminate the string ; We now have all the digits, but in reverse order. .whiles: cmp esi,edi jae .endws dec edi mov al, [esi] mov ah, [edi] mov [edi], al mov [esi], ah inc esi jmp .whiles .endws: .dw2asc: pop edi pop esi pop ebx ret endp
Если нужно могу скинуть пример на FPU. Есть допустим в st0 число 2123123423152345 и егоже получим в аски.
Код (Text): 40530B FILD QWORD PTR DS:[EAX] ;eax== addr Dword 40530D FILD WORD PTR SS:[ESP] ;10 405310 FLD ST(1) [b]405312[/b] DEC ESI 405313 FPREM 405315 FISTP WORD PTR SS:[ESP] 405318 FDIV ST(1),ST 40531A MOV AL,BYTE PTR SS:[ESP] 40531D ADD AL,30 40531F CMP AL,3A 405321 JB SHORT Riper_Ba.00405325 405323 ADD AL,7 405325 MOV BYTE PTR DS:[ESI],AL esi- addr bufer for ASCII 405327 FLD ST(1) 405329 FCOM ST(3) 40532B WAIT 40532C FSTSW AX 40532E SAHF 40532F JNB SHORT Riper_Ba.[b]00405312[/b] 405331 FLDCW WORD PTR SS:[ESP+2] 405335 ADD ESP,4 405338 FFREE ST(3) 40533A FFREE ST(2) 40533C FFREE ST(1) 40533E FFREE ST 405340 POP ECX 405341 SUB ECX,ESI 405343 SUB EDX,ECX 405345 JBE SHORT Riper_Ba.00405357
А вот реализация преобразования числа в unicode строку, число в строке записывается в виде hex 8 цифр Код (Text): //-----------------------------------------------------------------------------// __declspec( align(16) ) static const wchar_t dkstring_convertinteger_hexu_sse2_mask[8] = {0x000F,0x000F,0x000F,0x000F,0x000F,0x000F,0x000F,0x000F}; __declspec(align(16)) static const wchar_t dkstring_convertinteger_hexu_sse2_0[8] = {0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030,0x0030}; __declspec(align(16)) static const wchar_t dkstring_convertinteger_hexu_sse2_a[8] = {0x0057,0x0057,0x0057,0x0057,0x0057,0x0057,0x0057,0x0057}; __declspec(align(16)) static const wchar_t dkstring_convertinteger_hexu_sse2_A[8] = {0x0037,0x0037,0x0037,0x0037,0x0037,0x0037,0x0037,0x0037}; __declspec(align(16)) static const wchar_t dkstring_convertinteger_hexu_sse2_cmp[8] = {0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,0x000A,0x000A}; __declspec(align(16)) static const wchar_t dkstring_convertinteger_hexu_sse2_not[8] = {0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF}; __declspec( naked ) size_t __fastcall dkstring_convertinteger_hex1u_sse2( size_t aValue, wchar_t *aBuffer, size_t aBufferLenght ) { __asm { push _rdi // push rdi in stack sub _rsp,16 // locale buffer memory test _rdx,_rdx // check pointer jz short $$bad_exit // if (bad pointer) then exit mov _rax,[_rsp+16+size size_t+size size_t] // rax = aBufferLenght cmp _rax,(size size_t)*2 // check buffer size jb short $$bad_exit // if ( size aBuffer < sizeof(size_t)*2 ) then exit mov _rdi,_rsp // rdi pointer to locale memory buffer movdqa xmm3,dkstring_convertinteger_hexu_sse2_not // xmm3 = {0xFFFF} movdqa xmm4,dkstring_convertinteger_hexu_sse2_cmp // xmm4 = {0x000A} movdqa xmm5,dkstring_convertinteger_hexu_sse2_0 // xmm5 = {0x0030} movdqa xmm6,dkstring_convertinteger_hexu_sse2_a // xmm6 = {0x0057} movdqa xmm7,dkstring_convertinteger_hexu_sse2_mask // xmm8 = {0x000F} movd mm0,_rcx // mm0 = [0,rcx] movq2dq xmm0,mm0 // xmm0 = [0,mm0] pxor xmm1,xmm1 // xmm1 = 0 punpcklbw xmm0,xmm1 // xmm0 = bytetoword(xmm0) movdqa xmm2,xmm0 // xmm2 = xmm0 psrlw xmm2,4 // xmm2 = xmm2 -> 4 punpcklwd xmm0,xmm1 // xmm0 = wordtodword(xmm0) punpcklwd xmm2,xmm1 // xmm3 = wordtodword(xmm3) pand xmm0,xmm7 // xmm0 = xmm0 & xmm7 pand xmm2,xmm7 // xmm2 = xmm2 & xmm7 pslld xmm2,16 // xmm2 = xmm2 <- 16 paddd xmm0,xmm2 // xmm0 = xmm0 + xmm2 movdqa xmm2,xmm4 // xmm2 = xmm4 pcmpgtw xmm2,xmm0 // if ( xmm2[n..n+16] > xmm0[n..n+16] ) then xmm2[n..n+16] = n0x1 paddd xmm5,xmm0 // {0030} + xmm0 maskmovdqu xmm5,xmm2 // запись по маске paddd xmm6,xmm0 // {0057} + xmm0 pandn xmm2,xmm3 // инверт маски maskmovdqu xmm6,xmm2 // запись по маске movq mm0,[_rdi] // read 8 bytes movq mm1,[_rdi+8] // read 8 bytes pshufw mm0,mm0,0x01B // change word order pshufw mm1,mm1,0x01B // change word order movq [_rdx],mm1 // write 8 bytes movq [_rdx+8],mm0 // write 8 bytes add _rsp,16 // destroy locale buffer pop _rdi // pop rdi xor _rax,_rax // возвращаем 0 emms // очищаем контекст mmx ret (size size_t) // exit $$bad_exit: add _rsp,16 // destroy locale buffer pop _rdi // восстанавливаем rdi mov _rax,-1 // возвращаем -1 ret (size size_t) // exit } }; //-----------------------------------------------------------------------------//