当前位置: 首页 > 知识库问答 >
问题:

在asm中把两个数字加在一起[重复]

祁渊
2023-03-14

我已经将下面的c程序编译成asm,看看它使用了什么指令。我在C中的内容是:

int add(int num1, int num2) {
    int num3 = num1 + num2;
    return num3;
}

我对指令“应该是什么”的想法(根据我对asm非常有限的知识)是:

    null
add:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-20], edi
        mov     DWORD PTR [rbp-24], esi
        mov     edx, DWORD PTR [rbp-20]
        mov     eax, DWORD PTR [rbp-24]
        add     eax, edx
        mov     DWORD PTR [rbp-4], eax
        mov     eax, DWORD PTR [rbp-4]
        pop     rbp
        ret

共有1个答案

殷耀
2023-03-14

这看起来像是在可能的最低优化设置下专门编译的代码。它所做的是将参数(在寄存器ediesi)存储到堆栈内存(rbp-offset),然后将它们重新加载到寄存器eaxedx中以添加它们,将结果存储回堆栈内存[rbp-4]中的int num3中,然后重新加载以返回eax中的结果。

其中很多都是多余的,很容易做到:

add:
    add edi, esi
    mov eax, edi
    ret

或者在实践中使用,GCC-O1或更高版本实际上是

add:
    lea    eax, [rdi+rsi]
    ret

gcc/clang的默认值是-O0,它会对一致性调试进行反优化,将变量保留在C语句之间的内存中,而不是寄存器中。看到为什么clang用-O0生成低效的asm(对于这个简单的浮点和)吗?了解细节。

 类似资料:
  • 如果输入是:1,加1234,那么答案将是202,而不是10。我不确定我的代码哪里错了。

  • 我有一个关于使用LeetCode的链表添加两个数字的问题。下面是问题本身,我面临的问题,以及我的代码。 给您两个非空链表,表示两个非负整数。数字按相反顺序存储,每个节点包含一个数字。将这两个数字相加,并将其作为链表返回。 您可以假设这两个数字不包含任何前导零,除了数字0本身。 实例 输入:(2- 问题是它打印出: 当结果出现时,它停止。val为0并调用NullPointerException。我不

  • 我想一起迭代两个Java-8-Stream,以便在每个迭代步骤中有两个参数。类似的东西,其中生成类似的东西。 我想知道,如果Java提供了类似的东西,尽管Java中没有:-(如果没有类似的API-Function,是否还有另外一种同时迭代两个流的方法?

  • 我要“登录” 而我愿意这样 我也使用Bootstrap4,但不是为了我想做的事情,我在某个地方读到,不使用Bootstrap,自己做更好。 下面是我使用的代码: css: html: 如果可以使用Bootstrap 4完成,我也可以。

  • 校验者: @片刻 翻译者: @X 模型管道化 我们已经知道一些模型可以做数据转换,一些模型可以用来预测变量。我们可以建立一个组合模型同时完成以上工作: import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model, decomposition, datasets from sklearn.p

  • 问题内容: 我正在尝试在python中添加两个分数 如果输入1/4 + 1/4,我期望得到1/2结果 我用加法建立了一个分数类 但是我得到的输出是2,4,实际上是1/2,只是没有简化。我该如何解决这个问题? 问题答案: 简化分数的一般方法是找到分子和分母的最大公约数,然后将两者除以