weihao

Results 3 comments of weihao

感谢柴大解惑 如果把`0(AX)(TLS*1)` 当做 `0(AX)`看待就能理解了。 但是这里还有两个疑惑: 1. 编译器?(或者link) 是如何解决`0(AX)(TLS*1)`与golang asm 表达式上的冲突的呢? ![image](https://user-images.githubusercontent.com/18321182/115560885-9b34b580-a2e7-11eb-902c-00c367080dc8.png) 2. 为什么需要`(TLS*1)`这个注解呢? `MOVQ TLS, AX` 不足以说明 `AX`寄存器中的值存储的是`TLS`的地址这层关系吗? 截图来自: https://golang.org/doc/asm#x86

感谢柴大解惑 > 将某些符合语法但是语义非法的代码作为特殊的用途是常见的技巧(比如有人在浮点数的Nan里面隐藏一些标志信息),区分是没有问题的。 是否可以理解为 **(TLS*1) 之于 golang asm** 相当于 **NaN之于浮点数**? > IEEE 754-1985中,用指数部分全为1、小数部分非零表示NaN。 > FROM: https://zh.wikipedia.org/wiki/NaN 即在处理这一块的时候会先判断是否是特殊用例 例如寄存器名称为TLS时进行特殊处理,否则才按照默认规则处理? --- 另外似乎即使省略了`(TLS*1)`之后,`MOVQ 0(AX), CX` 应该也还是一个合法的寻址语句,在[这里](https://github.com/golang/go/blob/14a18b7d2538232c6cd6937297c421d5f6b7d92f/src/runtime/asm_amd64.s#L260)有相应的应用,亦或者是说我理解错柴大想表达的意思了?

似乎在[这里](https://github.com/golang/go/blob/14a18b7d2538232c6cd6937297c421d5f6b7d92f/src/cmd/internal/obj/x86/asm6.go#L2566-L2575)找到了答案