go cmd/objdump: x86反汇编器无法识别PDEPQ,

gijlo24d  于 7个月前  发布在  Go
关注(0)|答案(4)|浏览(70)

你正在使用哪个版本的Go( go version )?

go version go1.10.2 darwin/amd64

这个问题在最新版本中是否重现?

是的,在1.9.2和1.10.2中得到确认。尚未在主分支上测试。

你正在使用什么操作系统和处理器架构( go env )?

GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/michaelmcloughlin/Library/Caches/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/michaelmcloughlin/gocode"
GORACE=""
GOROOT="/usr/local/Cellar/go/1.10.2/libexec"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.10.2/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
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 -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/p5/84p384bs42v7pbgfx0db9gq80000gn/T/go-build505202882=/tmp/go-build -gno-record-gcc-switches -fno-common"

你做了什么?

使用 PDEPQ 编译汇编代码。使用 go tool objdump 查看生成的汇编代码。
Gist https://gist.github.com/mmcloughlin/b5bf1bcc7f31222ff2bc510f2777cd79 是一个最小示例。

你期望看到什么?

期望 go tool objdump 能够显示 PDEPQ 指令。

你看到了什么?

objdump.sh脚本的输出如下。objdump工具无法识别 PDEPQ,而是将其解析为一系列指令。请注意,Apple的LLVM objdump正确地识别了该指令。

+ go version
go version go1.10.2 darwin/amd64
+ go test -c
+ go tool objdump -s bmi.PDep bmi.test
TEXT github.com/mmcloughlin/bmi.PDep(SB) /Users/michaelmcloughlin/gocode/src/github.com/mmcloughlin/bmi/pdep.s
  pdep.s:7		0x10e7860		4c8b442408		MOVQ 0x8(SP), R8
  pdep.s:8		0x10e7865		4c8b4c2410		MOVQ 0x10(SP), R9
  pdep.s:10		0x10e786a		c442b3f5		CMC
  pdep.s:10		0x10e786e		d04c8954		RORB $0x1, 0x54(CX)(CX*4)
  pdep.s:12		0x10e7872		2418			ANDL $0x18, AL
  pdep.s:13		0x10e7874		c3			RET
  :-1			0x10e7875		cc			INT $0x3
  :-1			0x10e7876		cc			INT $0x3
  :-1			0x10e7877		cc			INT $0x3
  :-1			0x10e7878		cc			INT $0x3
  :-1			0x10e7879		cc			INT $0x3
  :-1			0x10e787a		cc			INT $0x3
  :-1			0x10e787b		cc			INT $0x3
  :-1			0x10e787c		cc			INT $0x3
  :-1			0x10e787d		cc			INT $0x3
  :-1			0x10e787e		cc			INT $0x3
  :-1			0x10e787f		cc			INT $0x3
+ objdump -disassemble-all bmi.test
+ grep -A 4 bmi.PDep:
github.com/mmcloughlin/bmi.PDep:
 10e7860:	4c 8b 44 24 08 	movq	8(%rsp), %r8
 10e7865:	4c 8b 4c 24 10 	movq	16(%rsp), %r9
 10e786a:	c4 42 b3 f5 d0 	pdepq	%r8, %r9, %r10
 10e786f:	4c 89 54 24 18 	movq	%r10, 24(%rsp)
wswtfjt7

wswtfjt71#

#23386 有可能被链接。@quasilyte在评论中建议根据最新的x86.csv更新反汇编器。从我有限的调查来看,这似乎只是一些指令表不同步的问题。

cfh9epnr

cfh9epnr2#

@mmcloughlin,我的理解是重新生成反汇编器比手动修复所有问题(可能有很多问题)更好。可以对其进行修补,但解码器无法理解,例如,所有最近添加的AVX-512指令,所以这不是几十个问题,而是数百个指令的问题。
主要问题是更新后的x86.csv generator在解决一些格式问题之前处于暂停状态。目前,编码器表(用于汇编器)直接从XED表生成。也可以从那里生成解码器表,但这也需要讨论。

ttvkxqim

ttvkxqim3#

感谢您的详细回复。我同意,对于这个问题,自动解决方案是更可取的。
我对了解更多并提供帮助很感兴趣,但似乎在这个领域做出贡献并不容易?

liwlm1x9

liwlm1x94#

注意到objdump仍然无法反汇编输入:

TEXT bmi.PDep.abi0(SB) s:/temp/pdepq/pdep.s
  pdep.s:7              0x505400                4c8b442408              MOVQ 0x8(SP), R8
  pdep.s:8              0x505405                4c8b4c2410              MOVQ 0x10(SP), R9
  pdep.s:10             0x50540a                c442b3f5                CMC
  pdep.s:10             0x50540e                d04c8954                RORB $0x1, 0x54(CX)(CX*4)
  pdep.s:12             0x505412                2418                    ANDL $0x18, AL
  pdep.s:13             0x505414                c3                      RET

相关问题