我的任务是编写 x86 asm 代码,如果 x 是 <= -1; 0 if the absolute value of x is less than 1; (x^2 - 1) if x >= 1,则输出 (-x^2 + 1)。
这就是我想出的,第一个问题是在第一种情况下结果不是负面的。如果我输入 -3,结果是 8 而不是 -8。其次,如果 x 的值小于 1,例如0.5,它输出 -0.75 而不是 0.
我是组装的初学者,这让我有点难过,所以如果你能帮助我让它正常工作,我将非常感激。
代码如下:
extern printf, scanf
global main
section .data
in_fmt db "%lf", 0
out_fmt db "Result: %lf", 10, 0
one dq 1.0
minus_one dq -1.0
section .bss
x resb 8
f resb 8
temp resb 8
section .text
main:
mov rbp, rsp; for correct debugging
;scanf()
mov rdx, x
mov rcx, in_fmt
sub rsp, 40
call scanf
add rsp, 40
fld qword[x]
;if x <= -1
fld qword[minus_one]
fcomi
jle case1
fstp qword[temp]
;if |x| <= 1 fld qword[one]
fcomi
jle case2
case3:
fstp qword[temp]
fmul qword[x]
fsub qword[one]
fstp qword[f]
jmp print
case2:
mov qword[f], 0
jmp print
case1:
fstp qword[temp]
fmul qword[x]
fmul qword[minus_one]
fadd qword[one]
fstp qword[f]
print:
mov rcx, out_fmt
mov rdx, qword[f]
sub rsp, 40
call printf
add rsp, 40
xor rax, rax
ret