【问题标题】:x86 Assembly DIV Prime Factorization [closed]x86 程序集 DIV 素数分解[关闭]
【发布时间】:2011-10-24 23:55:05
【问题描述】:

我对汇编还很陌生,我正在尝试打印出给定数字的素数分解。在网上搜索了几个小时后,我发现了一些关于 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

【问题讨论】:

    标签: html assembly x86 factorization


    【解决方案1】:

    如果我理解您要做什么,我认为您对 cmpjz 的工作方式有误解。

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

    jz(和其他条件跳转)根据标志的当前状态执行跳转。具体来说,如果设置了零标志,jz 将执行跳转。由于cmp 设置零标志以指示其操作数相等,因此如果相等则跳转 (je) 指令实际上与跳转为零指令相同。进位跳转 (jc) 和下方跳转 (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
            ...
    

    【讨论】:

    • 感谢您的帮助。我真的很感激。
    猜你喜欢
    • 1970-01-01
    • 2011-05-26
    • 2010-12-16
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多