曹大,有点汇编问题搞不懂

曹大,有点汇编问题搞不懂

我在看你写的<<Go语言高级编程>>.这本书的关于汇编章节的书.看到下面这段有点疑惑
图片描述

这里面的 a的变量为啥不是 a-8(SP)呢? b的话不应该是 b-0(SP)吗?还有 +0(SP)不是指向了栈顶了吗?

因为a变量先定义,因此a变量的地址更小.
栈内存地址不是从大往小吗?为啥a变量先定义地址更小呢?

我按照我的理解画了一张图.
图片描述

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
Xargin 2021-06-08 16:28:59

Go 的汇编有个比较难理解的地方。。。


我们课上之前讲的是通过编译、反编译工具看的汇编,这种情况下看到的 SP 表示的都是物理寄存器,就是那个栈顶


但是在手写汇编的时候,SP 有的时候是指伪寄存器,有的时候是指物理寄存器,这个有一个具体的区分规则,比较蛋疼


http://img1.sycdn.imooc.com//climg/60bf2a2809dc6acd21381090.jpg

我之前写过怎么区分的文章


https://github.com/cch123/golang-notes/blob/master/assembly.md


写的时候差点把自己劝退

  • 提问者 猫粮s #1

    手写汇编的时候.伪SP寄存器和SP寄存器可以同时使用吗?

    2021-06-08 16:32:34
  • 提问者 猫粮s #2

    SP: plan9 的这个 SP 寄存器指向当前栈帧的局部变量的开始位置,使用形如 symbol+offset(SP) 的方式,引用函数的局部变量。offset 的合法取值是 [-framesize, 0),注意是个左闭右开的区间。假如局部变量都是 8 字节,那么第一个局部变量就可以用 localvar0-8(SP) 来表示。这也是一个词不表意的寄存器。与硬件寄存器 SP 是两个不同的东西,在栈帧 size 为 0 的情况下,伪寄存器 SP 和硬件寄存器 SP 指向同一位置。手写汇编代码时,如果是 symbol+offset(SP) 形式,则表示伪寄存器 SP。如果是 offset(SP) 则表示硬件寄存器 SP。务必注意。对于编译输出(go tool compile -S / go tool objdump)的代码来讲,目前所有的 SP 都是硬件寄存器 SP,无论是否带 symbol。


    看到上面的突然明白了.变量a,b需要16个字节.第一个变量a就是 a-16(SP),b就是b-8(SP).
    a-24(SP)其实就是物理寄存器的+0(SP)位置是吧.这个地址留给callee形参使用的.

    2021-06-08 16:46:06
  • Xargin 回复 提问者 猫粮s #3

    可以同时存在的~

    2021-06-08 18:16:51
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师