在nasm上解决一个例子的问题



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 atoimov 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

相关内容

  • 没有找到相关文章

最新更新