撸汇编学习

汇编一直是弱项, 于是搞了一会浅薄的内容. 做个笔记.

void foo() {
    int a, b, c, d;
}

int main() {
    foo();
    int a=10;
}

这里的流程是:

main():
把 rsp 赋值给 rbp
把 rsp – 10(或者某个数). 此时:

rbp --> |
        |
        |
rsp --> |

调用 foo

rbp(main)-->|
            |
            |
rsp/rbp  -->|

初始化 a 到 d:

rbp(main)-->| main
            |
            |
rsp/rbp  -->| foo
          a |
          b |
          c |
          d |

退出 foo 后 abcd 又无效了, 此时

rbp --> |
       a|
        |
rsp --> |
        |
        |
        |

所以想通过 foo 修改 main::a 的初始值, 改不了.
另外我试过

int main() {
    { int b = 10; }
    int a = 10;
}

也不 work, 因为 a, b 放在连续地址, 而不是 b 生命周期一结束就被覆盖了. 可能用 foo1 修改 foo2 里某个数的初始值还好说一些.
main 把 rsp 预留一段好像是因为调了其他函数 (foo) 啊, foo 不预留

Leave a Reply

Your email address will not be published. Required fields are marked *