Golang에서 어셈블리 코드를 호출하는 것은 매우 편리합니다.

1625 단어 ASM집성Gogolang
오늘 Golang 코드를 뒤적였을 때 Golang이 어셈블리 코드를 호출하는 방법을 발견했다(pkg/bytes 참조).대략 세 가지 일을 해야 한다. 나는 어셈블리로 문자열이 같은지 아닌지를 판단하는 방법인 Equal을 예로 들어 테스트해 보겠다.
작업 준비, 프로젝트 디렉토리 만들기:
asm_demo
|--bin
|--pkg
|--src
|    |--strlib
|    |--demo

첫째, 플랫폼에 대응하는 인코딩 코드를 작성한다.
코드 파일의 이름을 다음과 같이 지정합니다:asm $ARCH.s (asm_386.s, asm_amd64.s, asm_arm.s, ...),나의 환경은 Ubuntu 12.04 LTS amd64 구조이다.
$ GOPATH=<youpath>/asm_demo
$ cd $GOPATH
$ cat <<EOF > src/strlib/asm_amd64.s
TEXT .Equal(SB),7,$0
        MOVL    len+8(FP), BX
        MOVL    len1+24(FP), CX
        MOVL    $0, AX
        CMPL    BX, CX
        JNE     eqret
        MOVQ    p+0(FP), SI
        MOVQ    q+16(FP), DI
        CLD
        REP; CMPSB
        MOVL    $1, DX
        CMOVLEQ DX, AX
eqret:
        MOVB    AX, ret+32(FP)
        RET
EOF

이 섹션 코드는 $GOROOT/src/pkg/bytes/asmamd64.s에서 알 수 있듯이 그 중의 문법은 대체적으로 Linux 어셈블리와 일치하지만 레지스터 표시가 같지 않은데 플랜9에서 온 문법입니까?어느 신발이 한 번 보급될 수 있습니까?
두 번째는 컴파일러가 식별할 수 있도록 Go 언어로 이 API를 봉인하는 것이다.
$ cat <<EOF > src/strlib/equal.go
package strlib

func Equal(a[]byte, b[]byte) bool

EOF

마지막 한 가지, 사용:
$ cat <<EOF > src/demo/main.go
package main

import "strlib"

func main() {
  e := strlib.Equal([]byte("hello"), []byte("hello"))
  println(e)

  e := strlib.Equal([]byte("hessssllo"), []byte("hello"))
  println(e)  
}
EOF

실행 효과 보기:
$ go run src/demo/main.go
true
false

호출에 성공하여 사용하기에 매우 간단하고 읽기 쉽다.
결과가 나왔는데 그중에 아직도 많은 의문이 있다.

좋은 웹페이지 즐겨찾기