【问题标题】:What does movl (%eax, %edx, 4), %ecx instruction do? [duplicate]movl (%eax, %edx, 4), %ecx 指令是做什么的? [复制]
【发布时间】:2017-03-29 21:09:12
【问题描述】:

我对汇编有一个非常简单的了解,但对下面这段代码的作用感到困惑?

movl (%eax, %edx, 4), %ecx

我的理解是%edx被乘以4,然后加上%eax的值,然后存储在%ecx中这是给出的值的表

Register Values

给出的答案是 0x11,但我没有得到那个答案。

【问题讨论】:

  • 在 AT&T 语法中,(..) 括号的使用暗示正在获取/写入内存内容。不幸的是,该规则并非处处都遵循,某些指令在没有() 语法的情况下强制使用内存(当指令对非内存使用没有意义时)。在 Intel 语法中,内存访问由 [] 标记,更严格地用于所有 (?) 指令(lea 是一种使用 mov 语法的异常,但不访问内存)。因此,使用 AT&T 语法时,您必须完整阅读指令以判断是否访问了内存,但使用 () 是安全的选择。

标签: assembly x86 mov


【解决方案1】:

EDX 乘以 4,加到 EAX,从该地址的内存中读取一个 4 字节的值,然后放入 ECX。

MOV,一般来说,不进行算术运算,除非是地址计算。


在您的特定情况下:edx = 3eax = 0x100temporary_address_in_CPU_during_mov = eax + edx * 4 = 0x100 + 3*4 = 0x10C。内存地址0x10C 处的值为0x11

这个地址算法可以通过lea指令自己使用,当CPU会做地址数学时,它不会从内存中加载值,它只会存储计算出的地址,所以:

leal (%eax, %edx, 4), %ecx

将使用值0x10C 加载ecx(不访问内存)。这有时会因为做简单的算术而被“欺骗”,例如 eax = 5*eax : lea (eax,eax,4),eax(可能比 imul 更快,并且不会更改标志寄存器,有时很方便)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 2011-10-12
    • 2012-05-21
    • 2012-12-10
    • 2016-02-09
    • 2015-06-29
    • 2016-12-17
    相关资源
    最近更新 更多