首页 > 解决方案 > 解决 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

期待任何帮助,谢谢!

标签: linuxassemblyx86nasm

解决方案


如果 x=2 它给出的答案是 4290776301

  • mov eax, x
    mul ebx
    

    结果可能会变得如此之大,因为您不是从输入的数字开始乘法,而是从缓冲区x的地址开始。在 NASM中加载xmov eax, x的地址,并加载存储在x的值。mov eax, [x]

  • call atoi
    mov ebx, [x]
    mov eax, x
    

    atoiEAX已经在寄存器中留下了它的结果。您只需将其复制到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

推荐阅读