~$ 存档

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  514 随笔 :: 26 文章 :: 15 评论 :: 62万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

最近有时间研究下Golang的汇编,在开始之前,最好能了解下X86的汇编

Go汇编使用的是Plan9汇编,网上有很多资料可以查看,不过这篇我打算从自己亲手调试过的代码开始记录。Go使用的版本是1.15,如果要跟着文章调试,最好版本一样避免差别。

main函数的汇编代码(main_amd64.s):

复制代码
TEXT    ·main(SB),$24

//当处于main时,打印当前的BP指向
LEAQ 0(BP),AX
MOVQ AX,0(SP)
CALL ·println(SB)

//打印SP指向
MOVQ Q+0(SP),AX
MOVQ AX,0(SP)
CALL ·println(SB)

MOVQ SP,AX
MOVQ AX,0(SP)
CALL ·println(SB)

LEAQ Q-8*2(SP),AX
MOVQ AX,0(SP)
CALL ·println(SB)

LEAQ a-8*2(SP),AX
MOVQ AX,0(SP)
CALL ·println(SB)

//初始化两个变量a,b
MOVQ $0,a-8*2(SP)
MOVQ $0,b-8*1(SP)

MOVQ $10,AX  //将新值写入AX
MOVQ AX,a-8*2(SP) // a=AX,a=10

MOVQ AX,0(SP) //以AX(a)为参数,调用println
CALL ·println(SB)

MOVQ a-8*2(SP),AX // AX=10
MOVQ b-8*1(SP),BX // BX=0

MOVQ AX,BX //BX=10
ADDQ BX,BX //BX=20
IMULQ AX,BX //BX=200
MOVQ BX,b-8*1(SP)

MOVQ BX,0(SP)
CALL ·println(SB)

MOVQ  $100,AX
MOVQ AX,0(SP)
CALL ·printnl_nosplit(SB)

RET
复制代码

 

测试方法(12_amd64.s)

复制代码
#include "textflag.h"
TEXT    ·printnl_nosplit(SB),NOSPLIT,$8
MOVQ BP,AX
MOVQ AX,+0(SP)
CALL ·println(SB)

MOVQ a+8*0(SP),AX
MOVQ AX,+0(SP)
CALL ·println(SB)

MOVQ SP,AX
MOVQ AX,+0(SP)
CALL ·println(SB)



LEAQ a+0(SP),AX
MOVQ AX,+0(SP)
CALL ·println(SB)


RET
复制代码

main主文件代码

复制代码
package main

import "fmt"

func printnl_nosplit(a int)
func println(a int){
    fmt.Printf("%x\n",a)
}

func main()
复制代码

 

————————————————
版权声明:本文为博客园博主「天涯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
posted on   LuoTian  阅读(392)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示