Сборка x86 (YASM): ошибка исключения с плавающей точкой - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь вычислить выражение i_sqrt=(((i_number/i_sqrt)+i_sqrt)/2), где i_number равно 78999999.

Я сделал свой код на ассемблере ubuntu x86 yasm, но он выдает ошибку, описанную в заголовке. N - количество итераций, которые необходимо выполнить; в моем случае - 50.

Не могли бы вы помочь мне решить эту проблему или прокомментировать, где часть моего кода является ошибкой, или если я сделал какую-то часть где-то неправильным кодом.

Вот мой код :

section .data
contador db 50  
i_number dq 78999999
i_sqrt dq 0
qAns1 dq 0
qAns2 dq 0
qAns3 dq 0

section .text
global _start

_start:
mov cl, byte[contador]

_ciclo:
;qAns1= i_number/i_sqrt
mov rax, qword [i_number]
cqo
idiv qword [i_sqrt]
mov qword [qAns1], rax
;qAns2= qAns1+i_sqrt
mov rax, qword [qAns1]
add rax, qword [i_sqrt]
mov qword [qAns2], rax
;qAns3=qAns2/2
mov rax, qword [qAns2]
cqo
mov rbx, 2
idiv rbx
mov qword [qAns3], rax
dec rcx
cmp rcx, 0
jne _ciclo

mov rax, 60
mov rdi, 0 
syscall

Мне нужно сопоставить i_sqrt с i_number. Как я могу сделать это в моем коде? Ставить i_sqrt равным 0 только при инициализации? Это решение, но как мне это сделать?

1 Ответ

2 голосов
/ 10 июля 2020

i_sqrt инициализируется нулем (i_sqrt dq 0) и не изменяется до того, как вы сделаете idiv qword [i_sqrt]. Таким образом, вы делите на ноль.

Большинство систем Unix сопоставляют исключение переполнения деления с сигналом SIGFPE, что приводит к появлению сбивающего с толку сообщения «исключение с плавающей запятой» для ошибки, которая не имеет ничего общего с плавающей запятой. Просто нужно к этому привыкнуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...