首页 文章

LEA和MOV指令比较

提问于
浏览
2

Instruction 1:

LEA DX, MESSAGE ; Move the address of MESSAGE in register DX

Instruction 2:

MOV DX, OFFSET MESSAGE ; Move the address of MESSAGE in register DX

问题:

  • 上述说明是否相同?他们似乎工作方式相似,但我刚刚开始编程程序集,所以我不能说 .

  • 如果它们都相似,那么上面哪一个是更好的方法来完成上述任务?

注意:我已经读过这个question

1 回答

  • 4

    在我的32位系统上,指令匹配这样的操作码:

    8d 15 c8 90 04 08       lea    0x80490c8,%edx
    ba c8 90 04 08          mov    $0x80490c8,%edx
    

    因此,如果使用 lea ,则在代码加载到内存时使用一个额外的字节 .

    我发现对AMD芯片的引用一度具有较低的延迟 lea 而不是 mov ,但只有一个时钟周期(如果数据不在L1缓存中,这将是无关紧要的) . 我不确定这个结果是否适用于最近的处理器 .

    我发现 lea 在尝试向基址添加偏移时非常有用,如下所示:

    lea message(,%esi,2), %ecx  # put address of message + 2 x ESI in ECX
    

    而我不能这样做:

    mov $message(,%esi,2), %ecx  # fails on bad syntax
    

    这会产生错误的结果:

    mov message(,%esi,2), %ecx  # puts _content_ at address, not address, into ECX
    

    至少在我的汇编程序(GNU as)中 .

相关问题