V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mainlong
V2EX  ›  问与答

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

  •  
  •   mainlong · 2018-12-11 19:35:37 +08:00 · 1218 次点击
    这是一个创建于 2153 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    https://imgchr.com/i/FYuikD

    https://imgchr.com/i/FYuV1A

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

    例 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  
       2018-12-11 20:49:24 +08:00
    Oops, 我这个是相对基址变址比例寻址,和你那个有点不同(加了变址和比例因子),不过原理差不多的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1192 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:21 · PVG 02:21 · LAX 11:21 · JFK 14:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.