使用as88汇编程序从汇编代码调用C函数

时间:2011-05-28 20:09:12

标签: c assembly floating-point as88

我正在研究16位处理器的浮点计算器,特别是8086/8088。 我使用的as88 Tracker没有实现浮点,不允许我使用带有“%f”的sscanf。

我考虑过在C代码中执行此操作并从汇编代码中调用此函数,但无法找到如何执行此操作。

到目前为止,这是我的代码:

 #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

我希望能够将C函数编写为:

float* getVal(char* ch) {

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

    if(fVal == 0) return 0;

    return fVal;
}

从我的汇编代码中调用它,将用户输入的字符串数转换为浮点数。

任何人都可以帮助我吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

有一个C语言函数调用约定,规定了在输入函数时如何设置寄存器。你必须找出那个约定 - 可能是通过查看一个C编译的obj文件 - 然后让你的asm代码遵循它,就像你执行sys时一样。我不认为这将是你唯一的问题,因为sscanf()无疑会调用C库中的大量其他函数,然后你需要找到它们;了解;整合;和调试;等等。忘了那个噪音。

未经请求的建议提醒:可能更容易 - 如果我这样做会更容易 - 只需在您的asm代码中解析输入。如果那个人正在输入'3.14159'这很容易,不是吗?即使你看到科学记数法的输入,那也不算太糟糕,imo。

答案 1 :(得分:0)

首先,这只有在您的C库也在模拟器上运行时才有效。 我不知道你的8088仿真器与x86 ABI有多接近,但假设它在过去20年中没有太大变化(咳嗽),你可以从汇编程序中调用C函数:

    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

根据名称修改,您可能需要将sscanf替换为_sscanfsscanf_