| // Copyright 2017 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package x86asm |
| |
| import ( |
| "encoding/hex" |
| "testing" |
| ) |
| |
| func testFormattingSymname(addr uint64) (string, uint64) { |
| switch addr { |
| case 0x424080: |
| return "runtime.printint", 0x424080 |
| } |
| return "", 0 |
| } |
| |
| func TestFormatting(t *testing.T) { |
| testCases := []struct { |
| PC uint64 |
| bytes string |
| |
| goSyntax, intelSyntax, gnuSyntax string |
| }{ |
| {0x4816b2, "0f8677010000", |
| "JBE 0x48182f", |
| "jbe 0x48182f", |
| "jbe 0x48182f"}, |
| {0x45065b, "488b442408", |
| "MOVQ 0x8(SP), AX", |
| "mov rax, qword ptr [rsp+0x8]", |
| "mov 0x8(%rsp),%rax"}, |
| {0x450678, "488b05e9790700", |
| "MOVQ 0x779e9(IP), AX", |
| "mov rax, qword ptr [rip+0x779e9]", |
| "mov 0x779e9(%rip),%rax"}, |
| {0x450664, "e8173afdff", |
| "CALL runtime.printint(SB)", |
| "call runtime.printint", |
| "callq runtime.printint"}, |
| {0x45069b, "488d0575d90100", |
| "LEAQ 0x1d975(IP), AX", |
| "lea rax, ptr [rip+0x1d975]", |
| "lea 0x1d975(%rip),%rax"}, |
| } |
| |
| for _, testCase := range testCases { |
| t.Logf("%#x %s %s", testCase.PC, testCase.bytes, testCase.goSyntax) |
| bs, _ := hex.DecodeString(testCase.bytes) |
| inst, err := Decode(bs, 64) |
| if err != nil { |
| t.Errorf("decode error %v", err) |
| } |
| if out := GoSyntax(inst, testCase.PC, testFormattingSymname); out != testCase.goSyntax { |
| t.Errorf("GoSyntax: %q", out) |
| } |
| if out := IntelSyntax(inst, testCase.PC, testFormattingSymname); out != testCase.intelSyntax { |
| t.Errorf("IntelSyntax: %q expected: %q", out, testCase.intelSyntax) |
| } |
| if out := GNUSyntax(inst, testCase.PC, testFormattingSymname); out != testCase.gnuSyntax { |
| t.Errorf("GNUSyntax: %q expected: %q", out, testCase.gnuSyntax) |
| } |
| } |
| } |