我想知道这些说明之间的区别是:
MOV AX, [TABLE-ADDR]
Run Code Online (Sandbox Code Playgroud)
和
LEA AX, [TABLE-ADDR]
Run Code Online (Sandbox Code Playgroud) 我的一位同事一直在阅读罗伯特·C·马丁的"清洁代码",并参加了关于使用许多小功能而不是减少大功能的部分.这引发了关于这种方法的性能后果的争论.因此,我们编写了一个快速程序来测试性能,并对结果感到困惑.
对于初学者来说,这是该功能的正常版本.
static double NormalFunction()
{
double a = 0;
for (int j = 0; j < s_OuterLoopCount; ++j)
{
for (int i = 0; i < s_InnerLoopCount; ++i)
{
double b = i * 2;
a = a + b + 1;
}
}
return a;
}
Run Code Online (Sandbox Code Playgroud)
这是我制作的版本将功能分解为小功能.
static double TinyFunctions()
{
double a = 0;
for (int i = 0; i < s_OuterLoopCount; i++)
{
a = Loop(a);
}
return a;
}
static double Loop(double a)
{
for …Run Code Online (Sandbox Code Playgroud) GCC给了我一些汇编代码,在这个声明里面:
lea eax, [ebx+eax]
Run Code Online (Sandbox Code Playgroud)
(英特尔语法)只是好奇,它之间有什么区别,和:
add eax, ebx
Run Code Online (Sandbox Code Playgroud)
是?
eax和ebx包含函数的返回值:)
mov eax, DWORD PTR [ebp+8]
mov DWORD PTR [esp], eax
call CALC1
mov ebx, eax.
mov eax, DWORD PTR [ebp+8]
mov DWORD PTR [esp], eax
call CALC2
lea eax, [ebx+eax]
Run Code Online (Sandbox Code Playgroud) 这个问题说LEA指令可以用来做算术.
据我了解,而不是:
inc eax
mov ecx, 5
mul ecx
mov ebx, eax
Run Code Online (Sandbox Code Playgroud)
我可以简单地写
lea ebx, [(eax + 1) * 5]
Run Code Online (Sandbox Code Playgroud)
LEA版本只是一条指令,而不是4.但是,我不明白LEA如何在没有inc和的情况下进行算术运算mul.
LEA版本在任何方面都更快,或者LEA是否只是在后台运行原始指令?
编辑:这个问题不是关于LEA的目的,而是它如何在内部工作.