### Author Topic: FPU.LIB (PROBLEM)...!  (Read 233 times)

#### felipe

• Member
• Posts: 369
• assemble the unassembled.
##### FPU.LIB (PROBLEM)...!
« on: September 26, 2017, 11:44:37 AM »
Hello good members of the forum. Can you tell me why the first function used in this code, of the fpu.lib, fails? Thanks in advance for your help.

Code: [Select]
`.486.model      flat,stdcalloption      casemap:noneinclude     \masm32\include\windows.incinclude     \masm32\include\kernel32.incinclude     \masm32\include\fpu.incincludelib  \masm32\lib\kernel32.libincludelib  \masm32\lib\fpu.lib.dataalign 1contitle    byte        "SQUARE ROOT CALCULATOR",0prompnum    byte        0ah," ENTER A POSITIVE NUMBER WITHOUT THE '+' SIGN AND ",0ah,\                        " WITH A MAX. LENGTH OF 18 DIGITS: "inbuff      byte        256 dup (" ")zerochr     byte        0ah," YOU HAVE TO ENTER A NUMBER OF AT LEAST 1 DIGIT!!"ellip       byte        "."errorcon    byte        "ERROR!",0spaces      byte        2000 dup (" ")toomuch     byte        0ah," YOU HAVE TO ENTER A NUMBER OF MAX. 18 DIGITS!!"notnum      byte        0ah," YOU HAVE TO ENTER JUST CHARACTER NUMBERS!!"inbuff2     byte        256 dup (" ").data?align 4stdin       dword       ?stdout      dword       ?chrswrit    dword       ?chrsread    dword       ?stdout2     dword       ?stdout3     dword       ?stdout4     dword       ?attrset     dword       ?align 8result      qword       ?ascconver   qword       ?.codealign 4start:            call        AllocConsole            push        STD_INPUT_HANDLE            call        GetStdHandle            mov         stdin,eax            push        NULL            push        CONSOLE_TEXTMODE_BUFFER            push        NULL            push        FILE_SHARE_READ or FILE_SHARE_WRITE                                push        GENERIC_READ or GENERIC_WRITE            call        CreateConsoleScreenBuffer            mov         stdout,eax                                               ; For the main screen.            push        eax            call        SetConsoleActiveScreenBuffer align 4goagain:            push        offset contitle            call        SetConsoleTitle            push        NULL            push        offset chrswrit            push        lengthof prompnum            push        offset prompnum            push        stdout            call        WriteConsole                                            ; Prompt for the number.            push        NULL            push        offset chrsread            push        256                                                     ; To avoid buffer overflow problems.                 push        offset inbuff                                           ; Store the input here.            push        stdin               call        ReadConsole                                             ; Read the number from the keyboard.            cmp         chrsread,2                                              ; Just CR and LF?            je          error0                                                  ; Notify the input error to the user.            cmp         chrsread,20                                             ; How many characters from input?            jg          error2big                                               ; More than 18 digits gives an error.                                                         mov         esi,offset inbuff            mov         ecx,chrsread                                            ; Number of chars from the input            sub         ecx,2                                                   ;   - (minus) the CR and LF characters.align 4checkall:                                                                       ; Check all the characters from the input.            movzx       eax,byte ptr[esi]            cmp         eax,30h                                                             jb          errorchr                cmp         eax,39h            ja          errorchr            inc         esi            loop        checkall             mov         dword ptr[esi+1],0h; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««                        push        DEST_MEM8            push        offset ascconver            push        offset inbuff            call        FpuAtoFL                        cmp         eax,0                                                   ; The function fails!!            jz          theend; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««            push        SRC1_REAL8 or DEST_MEM8            push        offset result            push        offset ascconver            call        FpuSqrt            push        SRC1_REAL8             push        offset inbuff2            push        00000088h            push        offset result            call        FpuFLtoA            mov         esi,offset inbuff2            mov         dword ptr[esi+16],0h            push        NULL            push        offset chrswrit            push        17            push        offset inbuff2            push        stdout            call        WriteConsole                                                                   mov         esi,10align 4delayingx:            push        NULL            push        offset chrswrit            push        1            push        offset ellip            push        stdout            call        WriteConsole                        push        300            call        Sleep            dec         esi            cmp         esi,0            jne         delayingx            jmp         theend            align 4error0:            push        NULL            push        CONSOLE_TEXTMODE_BUFFER            push        NULL            push        FILE_SHARE_READ or FILE_SHARE_WRITE            push        GENERIC_READ or GENERIC_WRITE            call        CreateConsoleScreenBuffer            mov         stdout2,eax                 push        eax            call        SetConsoleActiveScreenBuffer            push        offset errorcon            call        SetConsoleTitle            push        NULL            push        offset chrswrit            push        lengthof zerochr            push        offset zerochr            push        stdout2            call        WriteConsole                                                                   mov         esi,10align 4delaying:            push        NULL            push        offset chrswrit            push        1            push        offset ellip            push        stdout2            call        WriteConsole                        push        300            call        Sleep            dec         esi            cmp         esi,0            jne         delaying                        push        stdout            call        SetConsoleActiveScreenBuffer            push        00000000h            push        stdout            call        SetConsoleCursorPosition            push        offset attrset            push        00000000h            push        2000            push        offset spaces            push        stdout            call        WriteConsoleOutputCharacter            push        FOREGROUND_BLUE or FOREGROUND_GREEN or FOREGROUND_RED            push        stdout            call        SetConsoleTextAttribute            jmp         goagain            align 4       error2big:            push        NULL            push        CONSOLE_TEXTMODE_BUFFER            push        NULL            push        FILE_SHARE_READ or FILE_SHARE_WRITE            push        GENERIC_READ or GENERIC_WRITE            call        CreateConsoleScreenBuffer            mov         stdout3,eax                 push        eax            call        SetConsoleActiveScreenBuffer            push        offset errorcon            call        SetConsoleTitle            push        NULL            push        offset chrswrit            push        lengthof toomuch            push        offset toomuch            push        stdout3            call        WriteConsole                                                                   mov         esi,10align 4delaying2:            push        NULL            push        offset chrswrit            push        1            push        offset ellip            push        stdout3            call        WriteConsole                        push        300            call        Sleep            dec         esi            cmp         esi,0            jne         delaying2                        push        stdout            call        SetConsoleActiveScreenBuffer            push        00000000h            push        stdout            call        SetConsoleCursorPosition            push        offset attrset            push        00000000h            push        2000            push        offset spaces            push        stdout            call        WriteConsoleOutputCharacter            push        FOREGROUND_BLUE or FOREGROUND_GREEN or FOREGROUND_RED            push        stdout            call        SetConsoleTextAttribute            jmp         goagainalign 4errorchr:               push        NULL            push        CONSOLE_TEXTMODE_BUFFER            push        NULL            push        FILE_SHARE_READ or FILE_SHARE_WRITE            push        GENERIC_READ or GENERIC_WRITE            call        CreateConsoleScreenBuffer            mov         stdout4,eax                 push        eax            call        SetConsoleActiveScreenBuffer            push        offset errorcon            call        SetConsoleTitle            push        NULL            push        offset chrswrit            push        lengthof notnum            push        offset notnum            push        stdout4            call        WriteConsole                                                                   mov         esi,10align 4delaying3:            push        NULL            push        offset chrswrit            push        1            push        offset ellip            push        stdout4            call        WriteConsole                        push        300            call        Sleep            dec         esi            cmp         esi,0            jne         delaying3                        push        stdout            call        SetConsoleActiveScreenBuffer            push        00000000h            push        stdout            call        SetConsoleCursorPosition            push        offset attrset            push        00000000h            push        2000            push        offset spaces            push        stdout            call        WriteConsoleOutputCharacter            push        FOREGROUND_BLUE or FOREGROUND_GREEN or FOREGROUND_RED            push        stdout            call        SetConsoleTextAttribute            jmp         goagain         align 4theend:            call        FreeConsole            push        0            call        ExitProcess            end         start`
Source and exe attached.
Felipe.

#### aw27

• Member
• Posts: 854
• Let's Make ASM Great Again!
##### Re: FPU.LIB (PROBLEM)...!
« Reply #1 on: September 26, 2017, 04:12:39 PM »
mov         dword ptr[esi+1],0h
mov         dword ptr[esi],0h
« Last Edit: September 26, 2017, 07:31:51 PM by aw27 »

#### jj2007

• Member
• Posts: 7752
• Assembler is fun ;-)
##### Re: FPU.LIB (PROBLEM)...!
« Reply #2 on: September 26, 2017, 05:08:57 PM »
Code: [Select]
`            mov         ecx,chrsread                                            ; Number of chars from the input            sub         ecx,2                                                   ;   - (minus) the CR and LF characters.`Use a debugger to check whether this works as expected.

On a more general note: You want to test the FpuLib, but you end up with 370+ lines of utterly complicated attempts to read & write from & to the console. To understand what the FpuLib can do for you, concentrate on the essentials, and make good use of the Masm32 macros:
Code: [Select]
`include \masm32\include\masm32rt.inc ; pure Masm32, no MasmBasic requireduselib fpu.codestart:  invoke FpuAtoFL, chr\$("12345678"), eax, addr DEST_FPU  push eax  fsqrt  fistp dword ptr [esp]  pop eax    MsgBox 0, str\$(eax), "The square root of 12345678:", MB_OK  exitend start`

#### felipe

• Member
• Posts: 369
• assemble the unassembled.
##### Re: FPU.LIB (PROBLEM)...!
« Reply #3 on: September 27, 2017, 07:17:15 AM »
mov         dword ptr[esi+1],0h
mov         dword ptr[esi],0h

This corrected the problem, thanks a lot aw27! (again)

Code: [Select]
`            mov         ecx,chrsread                                            ; Number of chars from the input            sub         ecx,2                                                   ;   - (minus) the CR and LF characters.`Use a debugger to check whether this works as expected.

I have checked this and it does.

On a more general note: You want to test the FpuLib, but you end up with 370+ lines of utterly complicated attempts to read & write from & to the console. To understand what the FpuLib can do for you, concentrate on the essentials, and make good use of the Masm32 macros
I understand. I will try the next time a have a question/problem with some code, upload it using easier syntax and if the problem persist, i will load it then as i have it. But always respecting this important rule:

"The NO HELP DESK Rule.
10. This forum is a forum of members, it is not a help desk and should not be treated as one. The high quality of assistance in the MASM Forum over many years is based on the goodwill of other members who have made their time available to help other members and it should be treated in this manner."

Felipe.