312013
 

最近在研究 Go 的源代码(阅读后的代码注释放在了github上:http://github.com/polaris1119/go_src_comment),由于不少底层代码是用汇编写的,而且是 Plan9 的汇编,因此重新看了一些汇编和 Plan9 汇编的知识。在这里做一个总结、备忘。

一、资源

1、指令查询:

http://68k.hax.com/

2、命令查询

http://plan9.bell-labs.com/magic/man2html/1/8a

3、LEA 和 MOV

LEA:操作地址;
MOV:操作数据

如:
LEAQ 8(SP), SI // argv 把 8(SP)地址放入 SI 寄存器中
MOVQ 0(SP), DI // argc 把0(SP)内容放入 DI 寄存器中

4、对外部数据的引用需要用到 伪寄存器 PC (the virtual program counter) or SB (the ‘static base’ register)。PC counts instructions, not bytes of data,即 2(PC)是跳过一条指令。

5、http://plan9.bell-labs.com/plan9/

http://plan9.bell-labs.com/sys/doc/

plan9 各种文档,html/ps/pdf 格式供下载

6、操作堆栈(stack)的伪指令或指令

FP:Frame Pointer,0(FP) 表示函数的第一个参数;4(FP)表示第二个参数等;
SP:local Stack Pointer,本地栈指针,保存自动变量(局部变量)。0(SP)表示第一个局部变量,4(SP)表示第二个局部变量等;
TOS:Top-Of-Stack register,用来 push 参数到历程(procedure)中或保存临时值等。

Plan9 汇编器有这样的语法,例如,p+0(FP),根据上面的说明,0(FP)表示第一个参数,同时定义了一个p,它的值是 0(FP);对SP有一样的语法。

7、一般的,函数返回值保存在 EAX 寄存器中(Plan9 中叫 AX)

8、函数调用堆栈的说明

函数调用堆栈说明

函数调用堆栈说明

更新日志

1、2013-05-31 开始写

2、2014-06-05 更新【6-8】

 评论

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>