网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
官网入门:A Quick Guide to Go’s Assembler
Go汇编采用AT&T风格,早期采用plan9汇编器:源操作数在前,目的操作数在后
GO汇编代码并不和具体硬件一一对应,它加了一些虚拟的寄存器
这里推荐Go汇编系列中文学习好文: 《博客园 Go汇编系列》,(Ps: 看到这里,应该回头重新看深入理解计算机系统 第三版了,汗)
摘录两幅图:
X86架构图
Go汇编架构图
Go汇编为了简化汇编代码的编写,引入了PC、FP、SP、SB四个伪寄存器。
二、Go语言for-range和map遍历错误
go语言中有两种循环: for 和 for-range,后者也只是for的语法糖,但是使用起来一不小心就容器出错,这里整理如下:
2.1 for-range遍历取值问题
example1:
func main() {
arr := [5]int{1, 2, 3, 4, 5}
for \_, v := range arr {
println(&v)
}
}
----
example2:
func main() {
arr := []int{1, 2, 3}
newArr := []\*int{}
for \_, v := range arr {
newArr = append(newArr, &v) //正确做法:应使用&arr[i]
}
for \_, v := range newArr {
fmt.Println(\*v)
}
}
这两种错误原因是一样的,v作为别分配的临时变量,它的地址是不变的,而值在遍历过程中会改变。
2.2 for-range会永远循环吗
func main() {
arr := []int{1, 2, 3}
for \_, v := range arr {
arr = append(arr, v)
}
fmt.Println(arr)
}
$ go run main.go
1 2 3 1 2 3
意味着循环只遍历了切片中的三个元素,我们在遍历切片时追加的所有元素都不会导致循环次数的增加,所以循环最终还是停了下来。
2.3 map随机遍历
func main() {
hash := map[string]int{
"1": 1,
"2": 2,
"3": 3,
}
for k, v := range hash {
println(k, v)
}
}
假设我们运行了两次上述的代码,第一次会按照 2 3 1 的顺序打印键值对,但是第二次会按照 1 2 3 的顺序进行打印,如果我们多次运行这段代码就会发现每次执行的结果其实都不大相同。
这其实是 Go 语言故意的设计,它在运行时为哈希的遍历引入这种不确定性,也是告诉我们所有使用 Go 语言的开发者不要依赖于哈希遍历的稳定。
关于这3个问题,根本原因其实需要从Go汇编角度进行分析,这里参考好文:
Go 语言 for 和 range 的实现 内容较深
从Go汇编角度解释for循环的两个疑点 角度切入较为准确
三、Go汇编实战
参考《Go语言核心实战》,首先以多返回值代码为例,进行实战下:
package main
func swap(a, b int) (x int, y int) {
x = b
y = a
return
}
func main() {
swap(10, 20)
}
go build -gcflags="-N -l -S" multi_return.go
函数多值返回是主调函数预先分配好空间存放返回值,被调用函数执行时将返回值复制到改位置。
主调函数调用前分配栈空间 |
---|
返回值y |
返回值x |
参数b |
参数a |
3.2 for-range循环代码汇编
![img](https://img-blog.csdnimg.cn/img_convert/82f6dcca9e4ca72054b5e965991de967.png)
![img](https://img-blog.csdnimg.cn/img_convert/746eebcf115f94ef8eacca07d0524f73.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**