go cmd/asm: amd64 MOVBQZX指令引用上字节寄存器不会被拒绝

6fe3ivhb  于 6个月前  发布在  Go
关注(0)|答案(1)|浏览(60)

你使用的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

相关问题