mainlong
V2EX  ›  问与答

数组下标索引和寄存器偏移寻址指令的关系?

  •  
  •   mainlong · Dec 11, 2018 · 1608 views
    This topic created in 2720 days ago, the information mentioned may be changed or developed.

    数组下标索引可以用是指针+偏移量表示。我觉得这个应该是用寄存器偏移寻址指令实现的?

    https://imgchr.com/i/FYuikD

    https://imgchr.com/i/FYuV1A

    4 replies    2018-12-11 20:49:24 +08:00
    ysc3839
        1
    ysc3839  
       Dec 11, 2018 via Android
    “寄存器偏移寻址指令”是什么?
    mainlong
        2
    mainlong  
    OP
       Dec 11, 2018
    @ysc3839
    写错了,就是在编译这段代码可能通过寄存器偏移寻址方式来实现。
    hx1997
        3
    hx1997  
       Dec 11, 2018
    是的,这是常见的实现方法之一,但也不是所有情况都这么实现。

    例 1.
    char ch[5] = "abcd";
    for (int i = 0; i < 5; i++)
    printf("%c", ch[i]);

    在我这里,编译出来后 ch[i] 对应的汇编是:
    0x0000000000401556 <+38>: movzx eax,BYTE PTR [rbp+rax*1-0x10]

    rax 就相当于 i,rbp-0x10 相当于 ch 的首地址,*1 是因为 char 型占 1 字节。

    例 2.
    int num[5] = {1, 2, 3, 4, 5};
    for (int i = 0; i < 5; i++)
    printf("%d", num[i]);

    在我这里,编译出来后 num[i] 对应的汇编是:
    0x00000000004015a0 <+112>: mov eax,DWORD PTR [rbp+rax*4-0x30]

    rax 还是 i,rbp-0x30 是 num 首地址,*4 是因为 int 型在我的机器上占 4 字节。
    hx1997
        4
    hx1997  
       Dec 11, 2018
    Oops, 我这个是相对基址变址比例寻址,和你那个有点不同(加了变址和比例因子),不过原理差不多的。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2771 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 466ea39e · 47ms · UTC 10:26 · PVG 18:26 · LAX 03:26 · JFK 06:26
    ♥ Do have faith in what you're doing.