Golang調用匯編代碼


 

 

今天在翻閱Golang代碼時,發現了Golang調用匯編代碼的方法(詳見pkg/bytes)。大概要做三件事,我以用匯編實現一個判斷字符串是否相等的方法Equal為例,測試一下:

准備工作,創建工程目錄:

  1. asm_demo
  2. |--bin
  3. |--pkg
  4. |--src
  5. | |--strlib
  6. | |--demo

第一、編寫平台對應的編碼代碼。

匯給代碼文件以如下格式的命名:asm_$ARCH.s (asm_386.s,asm_amd64.s,asm_arm.s,...),我的環境是Ubuntu 12.04 LTS amd64架構.

  1. $ GOPATH=<youpath>/asm_demo
  2. $ cd $GOPATH
  3. $ cat <<EOF > src/strlib/asm_amd64.s
  4. TEXT .Equal(SB),7,$0
  5. MOVL len+8(FP),BX
  6. MOVL len1+24(FP),CX
  7. MOVL $0,AX
  8. CMPL BX,CX
  9. JNE eqret
  10. MOVQ p+0(FP),SI
  11. MOVQ q+16(FP),DI
  12. CLD
  13. REP; CMPSB
  14. MOVL $1,DX
  15. CMOVLEQ DX,AX
  16. eqret:
  17. MOVB AX,ret+32(FP)
  18. RET
  19. EOF

本段代碼來自 $GOROOT/src/pkg/bytes/asm_amd64.s
可以看出,其中的語法大致和Linux匯編一致,只是寄存器表示不相同,是來自plan9的語法嗎?哪個同鞋可以科普一下?

第二件事,就是讓用Go語言封裝一下這個API,讓編譯器可以識別:

  1. $ cat <<EOF > src/strlib/equal.go
  2. package strlib
  3.  
  4. func Equal(a[]byte,b[]byte) bool
  5.  
  6. EOF

最后一件事,使用之:

  1. $ cat <<EOF > src/demo/main.go
  2. package main
  3.  
  4. import "strlib"
  5.  
  6. func main() {
  7. e := strlib.Equal([]byte("hello"),[]byte("hello"))
  8. println(e)
  9.  
  10. e := strlib.Equal([]byte("hessssllo"),[]byte("hello"))
  11. println(e)
  12. }
  13. EOF


執行看看效果:

  1. $ go run src/demo/main.go
  2. true
  3. false

調用成功,使用起來非常簡單,也很易讀。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM