我在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发布于 2018-01-01 00:01:29
1) C库--我猜你用的是GCC的那个--不会立即输出printf的结果。相反,它被存储在称为缓存的单独内存中,并随机输出。在这种情况下,int 0x80/eax=1结束程序的速度将快于刷新缓存的速度。您可以插入手动刷新:
...
extern fflush
...
push 0
call fflush
add esp, 4
...最好的解决方案是使用C exit函数。替换
mov ebx,0
mov eax,1
int 0x80通过
push 0
call exit2) %lf格式的printf需要一个双精度浮点数(8字节= QWORD)作为输入。因此,请更改代码:
...
fstp qword[z]
...
push dword[z+4]
push dword[z]
push frm
call printf
add esp,12
...
z: dq 0.03) 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发布于 2017-12-31 20:27:27
文件加载整数
将有符号整数源操作数转换为双精度扩展精度浮点格式
3.14 & 1.2不是整数。
dd 3.14;等于4048F5C3H =1,078,523,331dd 1.2;3F99999Ah = 1,067,030,938
因此结果将是9.8934432601532659843776712884109e-1,FIST会将其转换为零
字符串使用DB not DD so声明
frm: db '%lf', 10, 0 will solve that problemhttps://stackoverflow.com/questions/48041809
复制相似问题