html - x86 汇编 DIV 素数分解

标签 html assembly x86 factorization

<分区>

我对汇编还很陌生,我正在尝试打印出给定数字的质因数分解。在网上搜索了几个小时后,我发现了一些关于 DIV 指令的有用花絮,但我无法让我的代码执行我想要的操作。

我做了一些非常错误的事情,但我无法发现它。请哪位好心人帮我看看?

.data
myMessage BYTE "Please enter a number to be evaluated:",0dh,0ah,0
factor DWORD 2
hold DWORD ?
.code
main PROC
    call Clrscr  

    mov  edx,offset myMessage
    call WriteString            ;Displays myMessage
    call ReadDec                ;Puts value into EAX register
    mov edi, factor
    call prime


    exit
main ENDP

prime PROC

step1:  xor edx, edx
        div edi
        cmp edx, 1
        jz step2
        add factor, 1
        mov edi, factor
        jmp step1

step2:  mov hold, eax
        mov eax, edi
        call WriteDec
        mov eax, hold
        CMP eax, 1
        jz step3
        jmp step1

step3:  
        exit
prime ENDP


END main

最佳答案

如果我明白你想做什么,我认为你对 cmpjz 的工作方式有误解。

cmp 的工作原理是从目标(第一个)中减去源(第二个)操作数而不存储结果,并根据结果设置标志。对于无符号数,相关标志是进位和零。如果源大于目标,则减法将从其最高位置借位,结果设置进位标志。如果源和目标相同,则结果将为零,并设置零标志。如果源小于目标,则减法不会产生 0 或导致进位,因此两个标志都将为 0。

jz(和其他条件跳转)根据标志的当前状态执行跳转。具体来说,如果设置了零标志,jz 将执行跳转。由于 cmp 设置零标志以指示其操作数相等,因此如果相等则跳转 (je) 指令实际上与为零则跳转指令相同。 jump if carry(jc)和jump if below(jb)指令也是一样的,同理。

由于 cmp 设置标志以指示哪个操作数更大,因此 jz 指令可能会造成混淆。如果操作数相等,它会跳转,如果其中一个为零,则不会。从 step1 查看您的代码:

div edi
cmp edx, 1
jz step2

我想你想做的是如果除法的余数为 0 则跳转到 step2,但由于 cmp 的工作方式,你实际上会跳转如果余数为 1,则转到第 2 步。解决方法很简单:将 1 更改为 0。(注意:我将 jz 更改为 je 因为它更好地解释了跳转的原因. 正如我之前所说,它们完全相同。)

div edi
cmp edx, 0
je step2

此外,如果找不到因子,则不会保留旧值。例如,如果输入值为 3,您的 step1 循环将像这样工作:

  1. 开始:eax=3,edi=2
  2. eax 除以edi。将商存储在 eax 中,将余数存储在 edx 中。
    • 现在,eax=3/2=1,edx=3%2=1
  3. edx 是 0 吗?如果是,则打印 edi 并转到循环的开头。
    • 不是,所以继续。
  4. 将 1 添加到 edi。现在是 3。
  5. 使用新值 eax=1 和 edi=3 执行步骤 2。
    • 现在,eax=1/3=0,edx=1%3=1
  6. ...

请注意,即使您没有找到因数,eax 的值也发生了变化。您需要做的是在除法之前保存它的值。您可以为此使用您的 hold 变量,这意味着只要您找到一个因素,它就会更新。您所要做的就是在开始循环之前存储该值,并在每个循环开始时恢复它。

        mov hold, eax
step1:  mov eax, hold
        xor edx, edx
        ...

关于html - x86 汇编 DIV 素数分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7883260/

相关文章:

javascript - iframe同源内div的jQuery onload

css - 当我在 html 5 地理位置应用程序上插入标题时,谷歌地图 CSS 滚动问题

linux - 用于 FS 在 x86 SMP 中启动的工作 linux 内核 + gem5 配置

assembly - 在此 x86 指令中, %r11d 中的 d 指的是什么?

c++ - 如何知道返回地址在栈上的位置c/c++

html - IE7 左 :%; bug

html - 如何使用 flexbox 将 2 行居中?

c - xv6 rev6 页面错误处理程序

c - 汉明重量(数字中1的个数)混合C与组件

c++ - MIPS速溶