使用 div 指令的 x86 NASM 程序集中的浮点异常 [重复]

Posted

技术标签:

【中文标题】使用 div 指令的 x86 NASM 程序集中的浮点异常 [重复]【英文标题】:Floating point exceptions in x86 NASM assembly using div instruction [duplicate] 【发布时间】:2013-10-17 02:55:56 【问题描述】:

我有一个任务,我必须输入一个数字,并找出所有质数,但不超过该数字。例如,如果我在程序中输入 9,它应该会打印 3、5 和 7。

我确定一个数是否为素数的计划是将其除以 2 并检查余数是否为 0。如果余数为 0,则程序从被除数中减去 1,然后循环回到顶部以再次除法.如果余数 != 0 则将其打印到屏幕上,并再次减少股息。这会一直发生,直到被除数为 0。只是这不是正在发生的事情,无论出于何种原因,每当我使用 DIV 指令时,我总是会遇到浮点异常,我似乎无法弄清楚为什么或如何解决它。有人对我如何解决此问题有任何想法吗?

代码:%INCLUDE "csci224.inc" 段.数据 提示:DD "请输入一个数字:",0 ;提示字符串 message: DD "是素数。", 0 ;当 n 为素数时显示 无效:DD "无效条目。", 0 我: DD 2 段.bss 输入:RESD 100;没必要,忽略这个 段 .text 主要的: mov edx,提示 调用 WriteString 调用 ReadInt 移动 esi, eax ;将 eax 移入 esi 以用作循环的索引 循环: 异或 edx, edx ;清除寄存器 异或 ecx, ecx xor eax, eax 移动 eax, dword 2 ; mov 2 到 eax div ecx ; ecx/eax | n/2 决定;递减循环计数器 dec ecx ;递减分子 cmp edx, 双字 0 ;余数为零? 我的循环;是 - 不是素数 - 跳回顶部 移动 eax, edx ;否 - 移动到 eax 并打印 调用 WriteInt 呼叫 Crlf cmp esi, 0 ;计数器为零? jz完成;是 - 结束循环 jmp myloop ; NO - 再次循环 完成的: ret

【问题讨论】:

【参考方案1】:

在这部分代码中:

xor     ecx, ecx                ; Clears ecx (set to 0)
xor     eax, eax                ; Clears eax (set to 0)

mov     eax, dword 2            ; Sets eax to 2
                                ; NOTE: you had just set it to 0 in the prior step)

; PROBLEM; the following code computes eax/ecx, which is 2/0 - the comment is wrong

div     ecx                     ; ecx/eax | n/2

【讨论】:

作为旁注更简洁的除/乘以二的幂的方法是移位指令。也更具可读性。 @rAndom69 同意。我回答的目的是直接向 OP 指出他们的特定代码存在的问题。

以上是关于使用 div 指令的 x86 NASM 程序集中的浮点异常 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

YASM/NASM x86 程序集中立即数与方括号的基本使用

拼命尝试使用 wprintf 在 64 位 NASM x86 程序集中打印 unicode

x86指令集同频性能提升

x86 NASM 使用 printf 打包双打

NASM x86,FIST 的意外结果

"rep; nop;" 是啥意思?在 x86 程序集中是啥意思?它与“暂停”指令相同吗?