你使用的Go版本是什么(go version
)?
$ go version
go version go1.17.3 linux/amd64
这个问题在最新版本中是否重现?
还没有检查过
你正在使用什么操作系统和处理器架构(go env
)?
go env
输出
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/wojtek/.cache/go-build"
GOENV="/home/wojtek/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/wojtek/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/wojtek/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/lib/go-1.17"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go-1.17/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.17.3"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build2132970980=/tmp/go-build -gno-record-gcc-switches"
你做了什么?
考虑这个简单的程序main.go
package main
// go:noescape
func asmfun()
func main() { asmfun() }
以及汇编实现 --- asmfun_amd64.s
#include "textflag.h"
TEXT ·asmfun(SB), NOSPLIT, $0
// wrong code
MOVBQZX AH, AX
MOVBQZX BH, AX
MOVBQZX CH, AX
MOVBQZX DH, AX
RET
你期望看到什么?
我期望汇编器会拒绝无效的代码,因为引用上字节寄存器是不可能的。
你看到了什么?
$ go build
$ go tool objdump -s asmfun main
TEXT main.asmfun.abi0(SB) /home/wojtek/t/bug/asmfun_amd64.s
asmfun_amd64.s:5 0x455420 480fb6c4 MOVZX SP, AX
asmfun_amd64.s:6 0x455424 480fb6c7 MOVZX DI, AX
asmfun_amd64.s:7 0x455428 480fb6c5 MOVZX BP, AX
asmfun_amd64.s:8 0x45542c 480fb6c6 MOVZX SI, AX
asmfun_amd64.s:9 0x455430 c3 RET
1条答案
按热度按时间vawmfj5a1#
相关但可能不完全相同:#14288