Golang에서 어셈블리 코드를 호출하는 것은 매우 편리합니다.
작업 준비, 프로젝트 디렉토리 만들기:
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
호출에 성공하여 사용하기에 매우 간단하고 읽기 쉽다.
결과가 나왔는데 그중에 아직도 많은 의문이 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 JNI 실현 원리 (5) JNI 방법 해석 호출1. 먼저 constantpolcache 를 확인 하고 스 레 드 의 constantpolcache 에 방법 지침 을 저장 할 지 여 부 를 확인 합 니 다. 방법 이 있 으 면 jcc 를 사용 하여 Label re...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.