leal(%eax,%ecx,4), %edx
Run Code Online (Sandbox Code Playgroud)
当我从我的计算机系统书中读到时,如果$ eax包含x值并且%ecx包含y,那么上面的意思是x + 4y放入%edx.
如果是的话
movl(%eax,%ecx,4), %edx
Run Code Online (Sandbox Code Playgroud)
那么上面的leal表达是不是同一个?
据我所知,leal创建了可以引用的地址,而不是像movl那样自己引用,但是
当我看到leal(%eax,%ecx,4), %edxequals x+4y进入edx注册时,那么t it mean that it 'referenced'%eax and%ecx`和提取值x和y用于计算?
这是如何工作的?我知道lea与使用add/mov指令相比是有效的,因为它不通过ALU或设置任何标志.那么lea如何得到它的地址呢?是什么让它比添加/ mov更好?
你为什么要用:
MOV EAX, 22
SHL EAX, 2
Run Code Online (Sandbox Code Playgroud)
...乘以4而不是仅仅使用MUL指令?
我知道这也可以用SHR而不是DIV.
这样做有什么好处?
你也可以用奇数做这个或者它只能是偶数吗?
我在Visual C++内联汇编中使用了这个指令
lea eax, FS:[0]
Run Code Online (Sandbox Code Playgroud)
为什么eax得到零?
我如何获得线性地址FS:[0]?
我正在摆弄gcc的优化选项,发现这些行:
int bla(int moo) {
return moo * 384;
}
Run Code Online (Sandbox Code Playgroud)
被翻译成这些:
0: 8d 04 7f lea (%rdi,%rdi,2),%eax
3: c1 e0 07 shl $0x7,%eax
6: c3 retq
Run Code Online (Sandbox Code Playgroud)
我理解移位代表乘以2 ^ 7.并且第一行必须乘以3.
所以我对"lea"系列完全感到困惑.是不是应该加载一个地址?
我给了一些C代码和它的汇编对应物,我将用它来计算声明的两个常量的值#define.我的问题是这条线是什么
leal 0(,%eax,8),%edx
Run Code Online (Sandbox Code Playgroud)
做?
我正在编写一个简单的汇编程序,当然,它的目的是尽可能快.但是,位于最嵌套循环中的某个部分看起来并不"正确",我相信有可能提出更聪明,更快速的实现,甚至可能不使用条件跳转.代码实现了一个简单的事情:
if rax < 0 then
rax := 0
else if rax >= r12 then
rax := r12 - 1
这是我天真的实施:
cmp rax, 0
jge offsetXGE
mov rax, 0
jmp offsetXReady
offsetXGE:
cmp rax, r12
jl offsetXReady
mov rax, r12
dec rax
offsetXReady:
Run Code Online (Sandbox Code Playgroud)
任何想法都是受欢迎的,即使是那些使用MMX和一些掩盖技巧的想法.
编辑:回答评论中的一些问题 - 是的,我们可以假设r12> 0但rax可能是负数.
这个问题说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的目的,而是它如何在内部工作.
具体是:
mov %eax, %ds
Run Code Online (Sandbox Code Playgroud)
慢于
mov %eax, %ebx
Run Code Online (Sandbox Code Playgroud)
或者他们是相同的速度.我在网上研究过,但一直无法找到明确的答案.
我不确定这是否是一个愚蠢的问题,但我认为修改分段寄存器可以使处理器做额外的工作.
NB我关注旧的x86 linux cpus,而不是现代的x86_64 cpus,其中分段的工作方式不同.
以下C代码:
int sum(int x, int y) {
return x + y;
}
Run Code Online (Sandbox Code Playgroud)
编译为:
add:
leal (%rdi,%rsi), %eax
ret
Run Code Online (Sandbox Code Playgroud)
我只见过lea用于将内存地址从一个地方移动到另一个地方,但这里似乎正在将值总和移动到eax. 这是如何运作的?
assembly ×10
x86 ×9
optimization ×2
att ×1
c ×1
cpu-cycles ×1
gcc ×1
intel ×1
mov ×1
nasm ×1
opcodes ×1
visual-c++ ×1