我的装配是位生锈,我试着让它再次变好。
显示意图的C代码:
void ask_me(int * data){
(*data)++;
}
这是故意的愚蠢,但适合上下文。
我的工作大会:
_ask_me:
addq $1, (%rdi)
ret
我想使用lea
指令作为培训。
但我无法使其发挥作用:
_ask_me:
leaq 1(%rdi), %rdi
ret
最差:
_ask_me:
movq (%rdi), %rcx
leaq 1(%rcx), %rdi
ret
你能提醒我怎么做吗?
由于
答案 0 :(得分:5)
原始程序集从/向内存读写。那就是:
addq $1, (%rdi)
执行操作:
*(rdi) += 1
LEA
无法实现同样的目的,因为LEA
将结果存储在寄存器中,而不是存储在内存中。因此,您可以将其用于rdi += 1
(与第一次尝试时相同),但不能*(rdi) += 1
。
答案 1 :(得分:1)
inc
可以占用内存操作数。通常,使用lea
进行数学运算的点是非破坏性操作(导致与源不同的reg),和/或组合shift,add和add-immediate。
lea 17(%rax, %rbx, 4), %rcx # rcx = 17 + rax + rbx*4
替换4条指令(包括mov)。