我正在编写一个简单的程序,我应该得到前两个命令行参数,它们是整数,然后用它们做一些操作。但在这里我有一个问题。当我想打印出这些操作的结果时,我只得到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
我测试了参数,它们被正确存储到内存中。似乎问题出在协处理器指令中。
答案 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
这应该有效