首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用x87 float调用printf

使用x87 float调用printf
EN

Stack Overflow用户
提问于 2017-12-31 18:46:11
回答 2查看 396关注 0票数 3

我在x86 asm中有一个简单的程序,它使z = x/y。问题是,当涉及除法时,代码应该写得正确,但没有打印出来。没有输出。我不知道出了什么问题,因为当程序不使用eax、ebx等时,我无法进行调试。

代码语言:javascript
复制
global main
extern printf

section .text

    main:

    finit
    fild dword[x]
    fild dword[y]
    fdiv
    fist dword[z]

    push dword[z]
    push frm
    call printf
    add esp,8

    mov ebx,0
    mov eax,1
    int 0x80


section .data
x: dd 1.2
y: dd 3.14
z: dd 0.0
frm: dd '%lf',10,0
EN

回答 2

Stack Overflow用户

发布于 2018-01-01 00:01:29

1) C库--我猜你用的是GCC的那个--不会立即输出printf的结果。相反,它被存储在称为缓存的单独内存中,并随机输出。在这种情况下,int 0x80/eax=1结束程序的速度将快于刷新缓存的速度。您可以插入手动刷新:

代码语言:javascript
复制
...
extern fflush
...
push 0
call fflush
add esp, 4
...

最好的解决方案是使用C exit函数。替换

代码语言:javascript
复制
mov ebx,0
mov eax,1
int 0x80

通过

代码语言:javascript
复制
push 0
call exit

2) %lf格式的printf需要一个双精度浮点数(8字节= QWORD)作为输入。因此,请更改代码:

代码语言:javascript
复制
...
fstp qword[z]
...
push dword[z+4]
push dword[z]
push frm
call printf
add esp,12
...
z: dq 0.0

3) NASM将1.2和3.14解释并转换为浮点数。定义为dd时,它将存储为单个浮点数。但是,fild需要并加载一个整数数字。让它作为单个文件加载:

代码语言:javascript
复制
fld dword[x]
fld dword[y]

一大堆:

代码语言:javascript
复制
global main
extern printf, fflush, exit

section .text

    main:

    finit
    fld dword[x]
    fld dword[y]
    fdiv
    fstp qword[z]

    push dword[z+4]
    push dword[z]
    push frm
    call printf
    add esp,12

    push 0
    call fflush
    add esp, 4

    push 0
    call exit

section .data
x: dd 1.2
y: dd 3.14
z: dq 0.0
frm: dd '%lf',10,0
票数 2
EN

Stack Overflow用户

发布于 2017-12-31 20:27:27

文件加载整数

将有符号整数源操作数转换为双精度扩展精度浮点格式

3.14 & 1.2不是整数。

  • 314 / 12 = 26.1666,然后将小数向左移位或
  • 314/ 120 = 2.61666或
  • 使用DT并声明为扩展精度浮点数。

dd 3.14;等于4048F5C3H =1,078,523,331dd 1.2;3F99999Ah = 1,067,030,938

因此结果将是9.8934432601532659843776712884109e-1,FIST会将其转换为零

字符串使用DB not DD so声明

代码语言:javascript
复制
    frm:     db      '%lf', 10, 0 will solve that problem
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48041809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档