汇编 - lea 和算术

Assembly - lea and arithmetic

上下文:

我的组件有点生锈了,我试着让它恢复原状。

显示意图的 C 代码:

void ask_me(int * data){

    (*data)++;

}

故意装傻,但符合语境。

我的工作程序集:

_ask_me:
   addq , (%rdi)
   ret

问题:

我想使用 lea 指令作为培训。 但我无法让它工作:

_ask_me:
    leaq 1(%rdi), %rdi

    ret

最差:

_ask_me:
    movq (%rdi), %rcx
    leaq 1(%rcx), %rdi

    ret

你能提醒我怎么做吗?

谢谢

原程序集读写from/to内存。即:

addq , (%rdi) 

执行操作:

*(rdi) += 1

您无法使用 LEA 实现相同的目的,因为 LEA 将结果 存储在寄存器 中,而不是内存中。所以你可以用它做 rdi += 1 (就像你第一次尝试一样),但不能 *(rdi) += 1.

inc 可以使用一个内存操作数,如果你想保存 insn 字节的话。通常,使用 lea 进行数学运算的重点是非破坏性操作(导致与源不同的 reg),and/or 结合移位、添加和立即添加。

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

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