leal是怎么做的?

这个问题在这里已经有了答案:

  • LEA指令的目的是什么? 14个答案

  • lea (及其大小后缀的变体)是Load Load Address指令。 基本上,它执行地址计算:它需要一个类似于mov所需的地址描述,但不是访问该地址处的内存,而只是将计算出的地址值加载到一个寄存器中。 例如,这可以用来获取C中的指针值。

    由于地址描述非常灵活(任意起始地址,偏移地址和灵活的元素大小),并且由于lea是一条快速指令,因此常常调用lea来执行简单的算术运算。 在这种情况下, lea的使用与物理地址无关,只是用来做数学。 通常,当涉及的寄存器是数值时(与指针值相反),可以识别出这种情况。 在这种情况下, lea执行操作%edx = %eax * 8 。 由于8很少导致有意义的地址的地址相乘,可以得出这样的结论lea这里指令简单地执行数学。


    这部分:

    0(,%eax,8)
    

    形式是:

    base(offset, index, size)
    

    并计算为(偏移量和索引需要是寄存器):

    address = base + offset + (index × size)
    

    在你的情况下, eax将保存一些将乘以8的地址并移入edx (这些操作在地址上而不是数值上)。 例如,如果eax = 0x11111111 ,索引将乘以8, edx将保存0x88888888 ,这就是我所能说的。

    这看起来不像一个真正的工作代码。 它通常与数组一起使用:

    array_base_address( , index_of_element, sizeof_an_element)
    

    例如:

    .data
        # array of 3 elements 2 bytes each
        array: .short 0x0000, 0x1111, 0x2222
    .text
        .global _main
    _main:
    
        # address of 0x0000
        movl    $0, %eax
        leal    array( , %eax, 2), %ebx
    
        # address of 0x1111
        movl    $1, %eax
        leal    array( , %eax, 2), %ebx
    
        # address of 0x2222
        movl    $2, %eax
        leal    array( , %eax, 2), %ebx
    

    它也可以用于以下结构:

    struct_base_address(offset_to_sub_element, index_of_element, sizeof_an_element)
    

    例如:

    .data
        struct:
            bytes: .byte  0, 1, 2, 3
            array: .int   0x00000000, 0x11111111, 0x22222222
    .text
        .global _main
    _main:
    
        # the offset to array
        movl    $4, %eax
        # the index of 0x22222222
        movl    $2, %ebx
        leal    struct(%eax, %ebx, 4), %edx
    
    链接地址: http://www.djcxy.com/p/72361.html

    上一篇: What is the line using leal do?

    下一篇: What does lea in this x86