汇编 - lea 和算术
Assembly - lea and arithmetic
上下文:
- 大会
- 气体
- x86_64
我的组件有点位生锈了,我试着让它恢复原状。
显示意图的 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)。
上下文:
- 大会
- 气体
- x86_64
我的组件有点位生锈了,我试着让它恢复原状。
显示意图的 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)。