我已经将下面的c程序编译成asm,看看它使用了什么指令。我在C中的内容是:
int add(int num1, int num2) {
int num3 = num1 + num2;
return num3;
}
我对指令“应该是什么”的想法(根据我对asm非常有限的知识)是:
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
这看起来像是在可能的最低优化设置下专门编译的代码。它所做的是将参数(在寄存器edi
和esi
)存储到堆栈内存(rbp-offset
),然后将它们重新加载到寄存器eax
和edx
中以添加它们,将结果存储回堆栈内存[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,只是没有简化。我该如何解决这个问题? 问题答案: 简化分数的一般方法是找到分子和分母的最大公约数,然后将两者除以