NASM协处理器 - 没有获得预期的输出

时间:2018-01-30 22:40:39

标签: assembly nasm x86-64 libc x87

我正在编写一个简单的程序,我应该得到前两个命令行参数,它们是整数,然后用它们做一些操作。但在这里我有一个问题。当我想打印出这些操作的结果时,我只得到0.00而我无法弄清楚原因。

section .data
first dq 0
second dq 0
fp db '%.2f '

section .bss
sqr1 resq 1
sqr2 resq 1
divRes resq 1

section .text
extern printf 
global main

main:
push rbp
mov rbp, rsp
push rbx
push rsi
push rdi

mov rdi, [rsi+8]
mov rcx, 0
mov rax, 0
readFirst:
mov byte al, [rdi+rcx]
cmp al, 0
je next1
sub al, 30h
push rax
inc rcx
jmp readFirst

next1:
mov rdx, 10
mov rbx, 1
atoi1:
pop rax
mul bl
add [first], ax
mov rax, rbx
mul dl
mov rbx, rax
loop atoi1

mov rcx, 0
mov rax, 0
mov rdi, [rsi+16]
readSecond:
mov byte al, [rdi+rcx]
cmp al, 0
je next2
sub al, 30h
push rax
inc rcx
jmp readSecond

next2:
mov rdx, 10
mov rbx, 1
atoi2:
pop rax
mul bl
add [second], ax
mov rax, rbx
mul dl
mov rbx, rax
loop atoi2

fild qword[first]
fsqrt
fstp qword[sqr1]

mov rax, 0
mov rdi, fp
mov rsi, [sqr1]
call printf

fild qword[second]
fsqrt
fstp qword[sqr2]

mov rax, 0
mov rdi, fp
mov rsi, [sqr2]
call printf

fild qword[first]
fild qword[second]
fdivp
fstp qword[divRes]

mov rax, 0
mov rdi, fp
mov rsi, [divRes]
call printf


pop rdi
pop rsi
pop rbx
mov rsp, rbp
pop rbp
ret

我测试了参数,它们被正确存储到内存中。似乎问题出在协处理器指令中。

1 个答案:

答案 0 :(得分:0)

打印浮点数时,你不能使用普通的x86寄存器(rdi,rsi,rdx,rcx,r9,r8)发送浮点参数。 有xmm寄存器,它们被索引为xmm0..7。 您需要做的是将要打印的浮动移动到xmm0,xmm1 ...... 使用“movsd”指令而不是普通的mov指令 并移动到通过xmm寄存器发送的rax数量的参数。 然后你可以打电话给printf

mov rdi,fp
mov rax,1
movsd xmm0 qword[divres]
call printf

这应该有效