3
votes

I'm working on a Floating Point calculator for 16bits processors, specifically 8086/8088. I'm using as88 Tracker which doesn't implement floating points, not allowing me to use sscanf with "%f".

I thought about doing that in C code and calling this function from my Assembly code but couldn't find out how to do it.

This is my code so far:

 #include "../syscalnr.h"

.sect .text
_code_:     
        push    bp
        mov bp, sp

        push    SEGOP-PRIOP ! Pushes PRIOP String Size into the stack
        push    PRIOP       
        push    STDOUT      
        push    _WRITE          ! System Call to print string on the display
        sys

        add sp, 8
        mov di, rasc    ! Prepares DI to receive char
        push    _GETCHAR
1:      sys
        cmpb    al, '\n'    ! Compares with EOL and keeps storing the string chars
        je  2f
        stosb           ! Stores char into variable rasc
        jmp 1b

2:      xorb    al, al      ! Clears registers
        add sp, 2

.sect .data
_data_:

PRIOP:      .asciz  "Insert first operand:\n "
SEGOP:      .ascii  "Insert second operand: "

FORMAT:     .asciz  "%u"
F_CHAR:     .asciz  "%c"
F_STR:      .asciz  "%s\n"

.sect .bss
_bss_:          
rasc:       .space  10

I want to be able to write a C function as:

float* getVal(char* ch) {

    float fVal;
    sscanf(ch, "%f", &fVal);

    if(fVal == 0) return 0;

    return fVal;
}

And call it from my Assembly code to translate the string number input by the user into a float.

Can anyone help me with that?

Thanks!

2
The function you want seems to be strtod, which is part of the standard library.Chris Lutz
Seems like I could use that one too, but returning to the main point, how can I call this function from my Assembly code?Bernardo Oliveira

2 Answers

0
votes

There is a C-language function calling convention that dictates how registers need to be set up when the function is entered. You'll have to find out what that convention is -- maybe by looking at a C-compiled obj file -- and then make your asm code adhere to it just like you do when you execute sys . I don't think that will be your only problem, though, because sscanf( ) undoubtedly calls tons of other functions in the C library which you'll then need to find; and understand; and integrate; and debug; and on and on. Forget that noise.

Unsolicited-advice alert: It might be easier -- it would be easier if I were doing it -- to just parse the input right there in your asm code. If the guy is typing '3.14159' that's pretty easy, isn't it? Even if you're seeing input in scientific notation, that's not too bad, imo.

0
votes

First at all, this will only work if your C library is running on the emulator too. I don't know exactly how close your 8088 emulator adheres to the x86 ABI, but assuming it hasn't changed much in the last 20 years (cough) you call C functions from assembler like that:

    push    RETVAL    ;last parameter first (address of float to return)
    push    STRFLOAT  ;first parameter last (format string)
    call    sscanf    ;error code is in ax
    add     sp,4      ;returned float is at RETVAL
    ;do something...

.sect .data
    STRFLOAT: .asciz  "%f"

.sect .bss
    RETVAL:   .space 4

Depending on the name mangling you may need to replace sscanf with _sscanf or sscanf_.