我正在研究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;
}
从我的汇编代码中调用它,将用户输入的字符串数转换为浮点数。
任何人都可以帮助我吗?
谢谢!
答案 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
替换为_sscanf
或sscanf_
。