linux-用x87 float调用printf
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux-用x87 float调用printf,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1294字,纯文字阅读大概需要2分钟。
内容图文
我在x86 asm中有一个简单的程序,它使z = x / y.关键是,除法时应正确编写代码,但不打印任何内容.没有输出.我不知道出什么问题了,因为当程序不使用eax,ebx等时,我无法调试.
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
解决方法:
1)C库-我猜您使用的是GCC中的库-无法立即输出printf的结果.而是将其存储在称为缓存的单独内存中,并偶然输出.在这种情况下,程序将以int 0x80 /?? eax = 1结束的速度比刷新缓存的速度快.您可以插入手动刷新:
...
extern fflush
...
push 0
call fflush
add esp, 4
...
最好的解决方案是使用C退出功能.更换
mov ebx,0
mov eax,1
int 0x80
通过
push 0
call exit
2)格式为%lf的printf需要一个双浮点数(8字节= QWORD)作为输入.因此,更改代码:
...
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需要并加载一个整数.让它作为单个加载:
fld dword[x]
fld dword[y]
整堆:
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
内容总结
以上是互联网集市为您收集整理的linux-用x87 float调用printf全部内容,希望文章能够帮你解决linux-用x87 float调用printf所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。