汇编 - lea和算术

时间:2015-08-14 12:57:07

标签: assembly x86-64 att pointer-arithmetic

上下文

  • 装配
  • 气体
  • x86_64的

我的装配是生锈,我试着让它再次变好。

显示意图的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

你能提醒我怎么做吗?

由于

2 个答案:

答案 0 :(得分:5)

原始程序集从/向内存读写。那就是:

addq $1, (%rdi) 

执行操作:

*(rdi) += 1

LEA无法实现同样的目的,因为LEA将结果存储在寄存器中,而不是存储在内存中。因此,您可以将其用于rdi += 1(与第一次尝试时相同),但不能*(rdi) += 1

答案 1 :(得分:1)

如果您尝试保存insn字节,

inc可以占用内存操作数。通常,使用lea进行数学运算的点是非破坏性操作(导致与源不同的reg),和/或组合shift,add和add-immediate。

lea 17(%rax, %rbx, 4), %rcx   # rcx = 17 + rax + rbx*4

替换4条指令(包括mov)。