क्या Google गो कोड में इनलाइन असेंबली शामिल करना संभव है?क्या Google गो कोड में इनलाइन असेंबली शामिल करना संभव है?
उत्तर
इनलाइन विधानसभा के लिए कोई समर्थन नहीं है, लेकिन आप सी के माध्यम से विधानसभा में लिखे कोड के साथ लिंक कर सकते हैं, सीजीओ साथ संकलन और import "C"
का उपयोग कर, gmp.go में की तरह। आप वैकल्पिक रूप से असेंबली की शैली में लिख सकते हैं जो सीधे asm_linux_amd64.s की तरह गो के साथ संगत है, जिसके लिए फ़ंक्शन नाम "·" से शुरू होते हैं।
या, आप अब तक मेरे पसंदीदा तरीके से नासम और gccgo का उपयोग कर सकते हैं। (ध्यान दें कि नस्म "·" से शुरू होने वाले कार्यों का समर्थन नहीं करता है)।
hello.asm:
; Based on hello.asm from nasm
SECTION .data ; data section
msg: db "Hello World",10 ; the string to print, 10=cr
len: equ $-msg ; "$" means "here"
; len is a value, not an address
SECTION .text ; code section
global go.main.hello ; make label available to linker (Go)
go.main.hello:
; --- setup stack frame
push rbp ; save old base pointer
mov rbp,rsp ; use stack pointer as new base pointer
; --- print message
mov edx,len ; arg3, length of string to print
mov ecx,msg ; arg2, pointer to string
mov ebx,1 ; arg1, where to write, screen
mov eax,4 ; write sysout command to int 80 hex
int 0x80 ; interrupt 80 hex, call kernel
; --- takedown stack frame
mov rsp,rbp ; use base pointer as new stack pointer
pop rbp ; get the old base pointer
; --- return
mov rax,0 ; error code 0, normal, no error
ret ; return
main.go:
package main
func hello();
func main() {
hello()
hello()
}
और एक आसान Makefile:
main: main.go hello.o
gccgo hello.o main.go -o main
hello.o: hello.asm
nasm -f elf64 -o hello.o hello.asm
clean:
rm -rf _obj *.o *~ *.6 *.gch a.out main
यहाँ एक काम "हैलो दुनिया" उदाहरण है
मैंपर कॉल करता हूं Main.go में 10 बार, केवल दो बार जांचें कि हैलो() ठीक से लौटता है।
ध्यान दें कि इंटरफ़ेस 80h को सीधे कॉल करना लिनक्स पर अच्छी शैली नहीं माना जाता है, और लिखित कार्यों को कॉल करना सी है "भविष्य का सबूत"। यह भी ध्यान रखें कि यह विशेष रूप से 64-बिट लिनक्स के लिए असेंबली है, और किसी भी तरह, आकार या रूप में प्लेटफॉर्म-स्वतंत्र नहीं है।
मुझे पता है कि यह आपके प्रश्न का सीधा जवाब नहीं है, लेकिन यह इनलाइनिंग की कमी में गो के साथ असेंबली का उपयोग करने के लिए सबसे आसान मार्ग है। यदि आपको वास्तव में इनलाइनिंग की आवश्यकता है, तो ऐसी स्क्रिप्ट लिखना संभव है जो स्रोत फ़ाइलों से इनलाइन असेंबली निकालता है और इसे उपरोक्त पैटर्न का पालन करने के तरीके में तैयार करता है। पर्याप्त नजदीक? :)
जाओ, सी और एनएएसएम के लिएत्वरित उदाहरण: gonasm.tgz
अद्यतन: gccgo की बाद के संस्करणों जी ध्वज की जरूरत है और केवल "main.hello" "के बजाय जरूरत है go.main.hello "। गो, सी और यास्म के लिए एक अद्यतन उदाहरण यहां दिया गया है: goyasm.tgz
इन-लाइन असेंबलर भाषा कोड का समर्थन करने के लिए गो प्रोग्रामिंग भाषा में कोई सुविधा नहीं है, और ऐसा करने की कोई योजना नहीं है। जाओ assembler और C में लिखे गए दिनचर्या से जोड़ने का समर्थन करता है। एक प्रयोगात्मक सुविधा है जो SWIG support को जाने के लिए जोड़ती है।
मानक गो कंपाइलर (यानी: 8 जी + 8 एल, जीसीजीओ) में अनुकूलन पास मूल रूप से बाइनरी रूप में कच्चे निर्देशों के साथ काम कर रहा है। इस प्राथमिक कारण है कि जाओ संकलक इनलाइन विधानसभा अनुमति नहीं देता है - वर्तमान में कोई रास्ता नहीं है (यह लागू नहीं है) संकलक उपयोगकर्ता के आपूर्ति की इनलाइन विधानसभा कोड से संकलक उत्पन्न विधानसभा भेद करने के लिए नहीं है। दूसरे शब्दों में, कंपाइलर आर्किटेक्चर की वजह से कंपाइलर इनलाइन असेंबली के लिए कोई समर्थन नहीं है।
वहाँ (जाता है कि: अन्य जाओ compilers) जाओ भाषा में ही जो अन्य जाओ भाषा कार्यान्वयन रोकने की जाएगी में पाठ्यक्रम कुछ भी नहीं की है इनलाइन विधानसभा के लिए समर्थन करने के लिए। इनलाइन असेंबली एक कंपाइलर-विशिष्ट निर्णय है - इसे गो भाषा के साथ ही बहुत कम करना है।
किसी भी मामले में, इनलाइन असेंबली असुरक्षित है क्योंकि इसे गो के प्रकार सिस्टम द्वारा शुद्धता के लिए चेक नहीं किया जा सकता है। ऐसा लगता है कि किसी भी फ़ंक्शन को कार्यान्वित करना बेहतर है जिसके लिए सी जैसी भाषा में इनलाइन असेंबली का उपयोग करना आवश्यक है, और सी से फ़ंक्शन को कॉल करें।
बेहतर है कि इनलाइन एएसएम का उपयोग न करें, सी और यूनिक्स के मूल संस्करण को इसकी आवश्यकता नहीं है या इसे कार्यान्वित नहीं किया गया है, यह कोड को अयोग्य बनाता है और – uriel
जैसा कि यह पता चला है कि यह संभव है, देखें: http://www.doxsey.net/blog/go-and-assembly।
है नहीं * इनलाइन * विधानसभा, हालांकि। – Alexander
नहीं, आप नहीं कर सकते, लेकिन जाने वाले कंपाइलर का उपयोग कर केवल एक समारोह के असेंबली कार्यान्वयन को आसान बनाना आसान है। असेंबली का उपयोग करने के लिए "आयात सी" का उपयोग करने की कोई आवश्यकता नहीं है।
http://golang.org/src/pkg/math/abs.go:
गणित पुस्तकालय से एक उदाहरण पर एक नजर डालें पेट समारोह इस फाइल जाना में घोषित किया जाता है। http://golang.org/src/pkg/math/abs_amd64.s में, (इस फ़ाइल में बार में पेट के एक कार्यान्वयन भी है, लेकिन यह निर्यात नहीं कर रहा है के रूप में यह एक लोअर केस नाम है।)
package math
// Abs returns the absolute value of x.
//
// Special cases are:
// Abs(±Inf) = +Inf
// Abs(NaN) = NaN
func Abs(x float64) float64
फिर, पेट में इंटेल 64 बिट के लिए लागू किया गया है इस फाइल:
// func Abs(x float64) float64
TEXT ·Abs(SB),NOSPLIT,$0
MOVQ $(1<<63), BX
MOVQ BX, X0 // movsd $(-0.0), x0
MOVSD x+0(FP), X1
ANDNPD X1, X0
MOVSD X0, ret+8(FP)
RET
- 1. क्या एंड्रॉइड मैनिफेस्ट में कोड शामिल/आयात करना संभव है?
- 2. जीसीसी इनलाइन असेंबली कोड में% सी का क्या अर्थ है?
- 3. क्या सीयूडीए कोड में असेंबली निर्देश देना संभव है?
- 4. इनलाइन कोड
- 5. क्या vb.net या C# में असेंबली कोड लिखना संभव है?
- 6. जीसीसी इनलाइन असेंबली में लेबल
- 7. जीसीसी सी ++ और इनलाइन असेंबली कोड?
- 8. क्या JButton को JTable में शामिल करना संभव है?
- 9. क्या Google Apps स्क्रिप्ट में ImportRange करना संभव है?
- 10. rdtscp के लिए कौन सा इनलाइन असेंबली कोड सही है?
- 11. क्या .NET असेंबली से प्रतिबिंब अक्षम करना संभव है?
- 12. डोकूविकि में इनलाइन कोड
- 13. क्या vbscript से .NET असेंबली (डीएलएल) निष्पादित करना संभव है?
- 14. जब मैं उन्हें इनलाइन असेंबली
- 15. क्या टेक्स्टमैट में पायथन कोड-पूर्णता लागू करना संभव है?
- 16. क्या सी # प्रोजेक्ट में सी कोड एम्बेड करना संभव है?
- 17. क्या .net फ्रेमवर्क में जावास्क्रिप्ट कोड निष्पादित करना संभव है?
- 18. क्या एंड्रॉइड एप्लिकेशन में कोड इंजेक्ट करना संभव है?
- 19. क्या बिल्डफाइल शामिल नैन लक्ष्यों को ओवरराइड करना संभव है?
- 20. गो कोड में यह "foo। (Bar.Baz)" चीज़ क्या है?
- 21. आईआईएस 7 पर एचटीएमएल में PHP शामिल करना संभव है?
- 22. Google गो भाषा में अपवाद हैंडलिंग
- 23. इनलाइन असेंबली जो रेड जोन
- 24. क्या Google क्लोजर कंपाइलर * नहीं * इनलाइन कुछ फ़ंक्शंस बनाना संभव है?
- 25. क्या एक "शामिल" कथन में एकाधिक मॉड्यूल शामिल करना संभव है?
- 26. Google स्क्रिप्ट कोड से Google सर्वर एपीआई
- 27. क्या यह संभव है JIT इनलाइन किए जाने वाले कुछ .NET रनटाइम विधानसभा कोड में मेरी कोड इनलाइन करने के लिए?
- 28. क्या Google खोज से खोज शब्द कैप्चर करना संभव है?
- 29. क्या सी/सी ++ में गो इंटरफ़ेस की नकल करना संभव है?
- 30. क्या असेंबली में कस्टम इंटरप्ट बनाना संभव है?
+1 एक संदर्भ के लिए एक लिंक इस जवाब सही होगा;) – OscarRyz
@OscarReyes: हो गया – peterSO
+1 अब यह एकदम सही है! :) – OscarRyz