【问题标题】:How to find sum of even numbers in assembly?如何在汇编中找到偶数的总和?
【发布时间】:2022-10-06 06:09:37
【问题描述】:

我正在自学组装。我想找到偶数的总和。但是,它不起作用,我不明白为什么,它没有显示任何错误。

我的代码在下面

        mov ebx, 0;
        mov ESI, [arr]; 
        mov ECX, [arr_size];

    sumeven:
        push ebx;
       
        mov eax, dword ptr[ESI];
        mov ebx, 2;
        cdq
        idiv ebx;
        cmp edx, 0;
        je adding;
        


    adding: 
        pop ebx;
        add ebx, dword ptr[ESI];
        add ESI, 4;
        loop sumeven;


    mov result, ebx;

我在 c 语言中使用内联汇编。

  • 无论如何,您的代码都会落入adding
  • 为什么? 1%2=1 为什么会掉在那里?
  • 您认为je 之后会发生什么? cpu 继续下一行。因此,无论哪种情况,您最终都会到达adding
  • 谢谢我修好了。
  • 使用idiv 来检查是否可被 2 整除是不常见的,在实际代码中不会这样做。该程序集的性能不如类似的 C 代码。我希望你知道。

标签: assembly x86 inline-assembly


【解决方案1】:

我添加了不等于0的条件,它起作用了。


        cmp edx, 0;
        je adding;
        jne notequal;
    notequal:
    ---


【讨论】:

  • 这无济于事,除非有jmp--- 中的某处。如果您改为在该--- 块中复制loop 指令或其他内容,则如果您在此处点击循环退出,它可能会落入adding:jne notequal / notequal: 总是一个 NOP,它总是落入 notequal,所以只是添加它不会做任何事情。所以基本上你在这个答案中显示的是添加一个 NOP,并且只是模糊地暗示你所做的任何实际工作(或者碰巧为这些数据工作,如果它涉及对loop 的不安全使用)。
【解决方案2】:

在您的代码中,您跳转到添加标签:当数字为偶数时,但如果为奇数,则始终求和。 正确的代码是:

    mov ebx, 0;
    mov ESI, [arr]; 
    mov ECX, [arr_size];

    jecxz emptyarr

sumeven:
    push ebx;
    mov eax, dword ptr[ESI];
    mov ebx, 2;
    cdq
    idiv ebx;
    cmp edx, 0;

    pop ebx;
    jne notadding;

    add ebx, dword ptr[ESI];

notadding:
    add ESI, 4;
    loop sumeven;

emptyarr:

【讨论】:

    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多