【问题标题】:ASM x86 integer overflow [duplicate]ASM x86整数溢出[重复]
【发布时间】:2012-11-15 03:29:05
【问题描述】:
GetLCM PROC
tryAgain:
   mov bx, 0
   inc Multiple
   mov ax, UserInputNum1              ;Move UserInputNum1 to the 16 bit Register
   mov bx, Multiple
   div bx                             ;<-------Error here
   cmp dx,0                           ;If dx is not zero then there is a remainder
   jne tryAgain                       ;If not equal jump
ret
GetLCM ENDP

在尝试对这两个数字进行除法时,我不断收到整数溢出错误。当我尝试使用 div 时它会中断。

我正在尝试查找用户输入的两个数字的最小公倍数。我决定尝试将每个数字除以首先找到质数,然后将每次找到一个与用户输入的另一个数字进行比较。当然我会同时做这两个数字,但现在我正试图克服这个错误。

这只是我在 ASM 的第五周,所以我有点困惑为什么会这样。 另外我想补充一点,我也想让这项工作也适用于 32 位数字。我的想法是使用指针。这是一个好方法吗? 感谢您的帮助!

【问题讨论】:

  • 只是一个算法注释:lcm(a,b) = a*b/gcd(a,b),这比找到除任何一个数字的素数要快得多。
  • 为了进行组装,您需要将架构手册放在手边,例如Intel's x86 Instruction Set Reference。 16 位 DIV 适用于 DX:AX。您的DX 尚未设置。做32位,只要参考32位寄存器助记符,EAXECX等即可。
  • 又是一个忘记div 是双宽的人。显然,在询问时它没有出现在建议的问题中。不能做点什么吗?

标签: html assembly x86


【解决方案1】:

xor dx, dx 在您的div 之前的某个位置

【讨论】:

  • 谢谢我忘记将 dx 初始化为 0
【解决方案2】:

再次阅读div 指令。什么被什么划分?您缺少将其中一个操作数设置为某个合理的值。

【讨论】:

    猜你喜欢
    • 2021-11-02
    • 2012-10-05
    • 2017-12-06
    • 2013-02-16
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2013-06-29
    相关资源
    最近更新 更多