x^3/2+1如果x=2,它给出的答案是4290776301。我试着做任何我能做的事情,我认为问题可能是在ascii解码或smth,但我不知道我还能做什么。
%include "in_out.asm"
SECTION .data
msg: DB 'Вариант 6. Мой пример: f(x) = x*x*x/2 + 1.Введи, какой x я бы поставил: ', 0
pink: DB 'Ответ на пример: ', 0
SECTION .bss
x: resb 80
SECTION .text
GLOBAL _start
_start:
mov eax, msg
call sprintLF
mov ecx, x
mov edx, 80
call sread
mov eax, x
call atoi
mov ebx, [x]
mov eax, x
mul ebx
mul ebx
mov ebx, 2
xor ebx, edx
div ebx
add eax, 1
mov [x],eax
mov eax, pink
call sprint
mov eax, [x]
call iprintLF
call quit
期待任何帮助,谢谢!
如果x=2,它给出的答案是4290776301
-
mov eax, x mul ebx
结果可能会变得如此之大,因为您不是从输入的数字开始乘法,而是从缓冲区的地址开始乘法。在NASM中,
mov eax, x
加载x的地址,mov eax, [x]
加载存储在x处的值。 -
call atoi mov ebx, [x] mov eax, x
atoi已将其结果留在
EAX
寄存器中。您只需要将其复制到EBX
寄存器即可。call atoi
mov ebx, eax
。 -
mov ebx, 2 xor ebx, edx div ebx
对于除以2,需要清除
EDX
寄存器。你不小心(打字错误)对除法器进行了异或运算!当然,除以2最好是向右移动shr eax, 1
。
解决方案
mov eax, msg
call sprintLF
mov eax, x
call scanf
mov eax, x
call atoi ; -> EAX
mov ebx, eax ; ((X^3)/2)+1
imul ebx, eax
imul ebx, eax
shr ebx, 1
inc ebx
mov eax, pink
call sprint
mov eax, ebx
call iprintLF