Dari pertanyaan ini, register apa yang diawetkan melalui panggilan fungsi Linux X86-64, dikatakan bahwa register berikut disimpan di seluruh fungsi Panggilan:

r12, r13, r14, r15, rbx, rsp, rbp

तो, मैंने आगे बढ़कर निम्नलिखित के साथ एक परीक्षण किया:

.globl _start
_start:
    mov $5, %r12
    mov $5, %r13
    mov $5, %r14
    mov $5, %r15
    call get_array_size
    mov $60, %eax
    syscall

get_array_size:
    mov $0, %r12
    mov $0, %r13
    mov $0, %r14
    mov $0, %r15
    ret

Dan, saya berpikir bahwa setelah call get_array_size bahwa register saya akan secara otomatis (dan agak ajaib) memulihkan dengan nilai 5. gdb menunjukkan bahwa ini salah.

लेकिन मुझे लगता है कि शायद मैं इसे गलत समझ रहा हूं। मुझे लगता है कि इसका मतलब यह है कि "x86-64 एबीआई के अनुरूप" किसी भी कार्य को समाप्त होने के बाद उन रजिस्टरों को पुनर्स्थापित करना चाहिए (दूसरे शब्दों में, मेरा get_array_size फ़ंक्शन लिनक्स एबीआई में एक अमान्य functino है), या कोई मुझे समझा सकता है कि मेरी समझ में क्या कमी है।

Selain itu, ketika seseorang mengatakan bahwa suatu fungsi harus sesuai dengan ABI, adalah fungsi non-globl yang seharusnya melakukan ini juga? Atau melakukan 'implementasi internal' tidak masalah sama sekali dan hanya fungsi yang saya paparkan ke publik (via globl) seharusnya mematuhinya? Apakah ada notasi yang biasanya digunakan untuk mengatakan apakah suatu fungsi bersifat lokal atau global (seperti dalam skema penamaan?).

बेशक, मैं asm के लिए एक नौसिखिया हूं, इसलिए मुझे यह समझाने में बहुत-बहुत धन्यवाद कि मैं क्या खो रहा हूं।

1
samuelbrody1249 13 सितंबर 2020, 00:19

1 उत्तर

सबसे बढ़िया उत्तर

Benar, asm get_array_size Anda tidak mengikuti ABI karena itu adalah register yang dilestarikan panggilan. Itu berarti penelepon perlu mengobatinya secara khusus, bukan ikuti jaminan Abi yang biasa.

एबीआई दस्तावेज़ एक मानक है जो कंपाइलर-जेनरेट किए गए कार्यों का पालन करता है, और इसलिए जब तक आप अपना स्वयं का कस्टम कॉलिंग सम्मेलन नहीं बनाना चाहते हैं, तब तक अधिकांश हस्तलिखित कार्यों को करना चाहिए। देखें कैली और कॉलर सेव किए गए रजिस्टर क्या हैं? के लिए कॉलर के लिए कॉल-संरक्षित बनाम कॉल-क्लोबर्ड का क्या मतलब है, और फ़ंक्शन के कार्यान्वयन के लिए यदि वह एबीआई का पालन करना चाहता है, तो इसके बारे में अधिक जानकारी।

"Pembantu" pribadi kecil dengan konvensi panggilan kustom baik-baik saja selama Anda berkomentar (dan tidak pernah mencoba memanggil mereka dari C). Apalagi saat Anda mengoptimalkan, mis. Untuk ukuran kode (lihat kodegolf x86-64 Tips)


एएसएम में कोई जादू नहीं है, प्रत्येक निर्देश का केवल वास्तुशिल्प स्थिति पर अपना प्रलेखित प्रभाव होता है। (रजिस्टरों और स्मृति की सामग्री)।

Seperti yang dapat Anda lihat dari Intel Documents for call dan ret, satu-satunya daftar integer yang mereka modifikasi adalah RSP. Perakitan normal seperti nasm dan gas jangan secara ajaib menambahkan instruksi ke fungsi Anda. (MASM dapat berbeda, tetapi jika Anda melihat pembongkaran Anda masih dapat melihat kode asli.)

4
Peter Cordes 12 सितंबर 2020, 21:27