• zKerry
    2019-11-04
    栈的扩大和缩小有点反直觉啊,为啥扩大是减,缩小是加

    作者回复: 因为栈是从高地址向低地址延伸的。所以地址减的话,才是栈的增长。

    
     2
  • 初心丶可曾記
    2019-10-18
    图中的%rbp应该是指向【上一帧的%rbp的值】的下方红线部位,不应该是【返回地址】的下方红线

    作者回复: 回头我更新一版图,让图中的箭头指向格子而不是线,这样更加没有歧义。

    
     2
  • 沉淀的梦想
    2019-10-14
    老师在课中讲了不少“栈”的操作,那编程语言对于"堆"又是用什么指令操作的呢?

    作者回复: 鼓励你用c语言,使用malloc和free来申请和释放内存,看看生成的汇编是怎样的。

     2
     1
  • pebble
    2019-10-14
    例一的俩栈帧图里,rbp跟rsp,是否应该都指向再下一个位置呢,rsp指向的,应该是下次要保存数据的位置吧

    作者回复: 不是。
    rbp,指向栈底。这个值在整合函数执行期间是不变的。
    rsp,指向栈顶。这个值会在某些情况下改变:
    (1)push和pop命令可以改变rsp。
    (2)call指令,因为要把返回地址压栈,实际也改变了rsp。
    (3)在使用本地变量时,手工改变rsp的值。
    rsp如果指向下次要保存数据的位置,相当于栈里总有一个空单元。

     1
     1
  • 风
    2019-11-05
    局部变量的访问,既可以用rbp-的方式,也可以用rsp+的方式,文中实例里,都是rbp-的方式,所以需要管理好rbp这个寄存器。
    如果采用rsp+的方式,是不是根本就不需要rbp这个寄存器了,这样效率不就更高了?
    我看到的一些ARM核,里面只有rsp寄存器,没有rbp寄存器,这样是不是更好呢?

    作者回复: 没错。用两个寄存器来标记栈桢,确实有点浪费。实际上是可以优化掉的。
    如果你用gcc编译的话,可以使用-fomit-frame-pointer参数来生成汇编,会把下面三行代码都去掉。
    pushq %rbp
    movq %rsp, %rbp
    popq %rbp

    我在34讲的一个例子中,手工去掉了这三行代码,生成的机器码可以少5个字节,还少两次内存访问,其中有一次是写操作,高速缓存都帮不上忙。对于追求极致性能的程序来说,这个优化是必要的。

    
    
  • 阿鼎
    2019-10-18
    协程的切换,用户态代码要复制堆栈寄存器信息。也想请教老师,协程调度是否只能在io线程呢?非io线程能否用协程呢?

    作者回复: 非io当然可以用协程。比如迭代器、状态机用协程来写就很优雅。

    
    
  • 沉淀的梦想
    2019-10-14
    老师的as用的什么版本,为什么我用as汇编文稿中的代码会出错(注释删了也一样会出错):

    function-call2-craft.s: Assembler messages:
    function-call2-craft.s:2: Error: no such instruction: `n-call2-craft.s 函数调用和参数传递'
    function-call2-craft.s:4: Error: character following name is not '#'
    function-call2-craft.s:66: Error: character following name is not '#'
    展开

    作者回复: macOS操作系统,gnu汇编器。
    Linux上生成的汇编码应该也差不多,有些系统调用是不同的。
    windows上,你就要安装一下相关的环境了和工具了,比如MinGW。或者装一个Linux虚拟机。

    
    
我们在线,来聊聊吧