Memilih empat register argumen pada x64 - umum untuk UN * X / Win64
Salah satu hal yang perlu diingat tentang x86 adalah bahwa nama register untuk pengkodean "reg number" tidak jelas; dalam hal pengkodean instruksi ( MOD R / M byte, lihat http://www.c-jump.com/CIS77/CPU/x86/X77_0060_mod_reg_r_m_byte.htm ), nomor register 0 ... 7 adalah - dalam urutan itu - ?AX
, ?CX
, ?DX
, ?BX
, ?SP
, ?BP
, ?SI
, ?DI
.
Oleh karena itu memilih A / C / D (regs 0..2) untuk nilai kembalian dan dua argumen pertama (yang merupakan __fastcall
konvensi 32bit "klasik" ) adalah pilihan yang logis. Sejauh menyangkut 64bit, regs "lebih tinggi" dipesan, dan baik Microsoft dan UN * X / Linux menggunakan R8
/ R9
sebagai yang pertama.
Menjaga bahwa dalam pikiran, pilihan Microsoft RAX
(nilai kembali) dan RCX
, RDX
, R8
, R9
(arg [0..3]) adalah pilihan yang dimengerti jika Anda memilih empat register untuk argumen.
Saya tidak tahu mengapa memilih AMD64 UN * X ABI RDX
sebelumnya RCX
.
Memilih enam register argumen pada x64 - spesifik UN * X
UN * X, pada arsitektur RISC, secara tradisional melakukan penyampaian argumen dalam register - khususnya, untuk enam argumen pertama (demikian pula pada PPC, SPARC, MIPS setidaknya). Yang mungkin menjadi salah satu alasan utama mengapa desainer ABI AMD64 (UN * X) memilih untuk menggunakan enam register pada arsitektur itu juga.
Jadi jika Anda ingin enam register untuk melewati argumen di, dan itu logis untuk memilih RCX
, RDX
, R8
dan R9
empat dari mereka, yang dua lainnya harus Anda pilih?
Regs "lebih tinggi" memerlukan byte awalan instruksi tambahan untuk memilihnya dan karena itu memiliki footprint ukuran instruksi yang lebih besar, jadi Anda tidak ingin memilih salah satu dari itu jika Anda memiliki opsi. Dari register klasik, karena arti implisitRBP
dan RSP
ini tidak tersedia, dan secara RBX
tradisional memiliki penggunaan khusus pada UN * X (tabel offset global) yang tampaknya tidak diinginkan oleh desainer AMD64 ABI untuk menjadi tidak kompatibel.
Ergo, satu - satunya pilihan adalah RSI
/ RDI
.
Jadi jika Anda harus mengambil RSI
/ RDI
sebagai register argumen, argumen mana yang seharusnya?
Membuatnya arg[0]
dan arg[1]
memiliki beberapa keuntungan. Lihat komentar cHao.
?SI
dan ?DI
merupakan operan sumber / tujuan instruksi string, dan seperti yang disebutkan cHao, penggunaannya sebagai register argumen berarti bahwa dengan konvensi pemanggilan AMD64 UN * X, fungsi yang paling sederhana strcpy()
, misalnya, hanya terdiri dari dua instruksi CPU repz movsb; ret
karena sumber / target alamat telah dimasukkan ke register yang benar oleh pemanggil. Ada, khususnya dalam kode "perekat" tingkat rendah dan yang dihasilkan compiler (pikirkan, misalnya, beberapa pengalokasi heap C ++ objek pengisian nol pada konstruksi, atau halaman heap pengisian-nol kernel padasbrk()
, atau copy-on-write pagefaults) sejumlah besar salinan / isi blok, oleh karena itu akan berguna untuk kode yang sering digunakan untuk menyimpan dua atau tiga instruksi CPU yang sebaliknya memuat argumen alamat sumber / target ke dalam register yang "benar".
Jadi dengan cara, PBB * X dan Win64 hanya berbeda dalam bahwa PBB * X "prepends" dua argumen tambahan, di sengaja dipilih RSI
/ RDI
register, dengan pilihan alami dari empat argumen di RCX
, RDX
, R8
dan R9
.
Lebih dari itu ...
Ada lebih banyak perbedaan antara UN * X dan Windows x64 ABI daripada hanya pemetaan argumen ke register tertentu. Untuk gambaran umum tentang Win64, periksa:
http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx
Win64 dan AMD64 UN * X juga sangat berbeda dalam cara penggunaan stackspace; di Win64, misalnya, pemanggil harus mengalokasikan stackspace untuk argumen fungsi meskipun argumen 0 ... 3 diteruskan dalam register. Di UN * X di sisi lain, fungsi daun (yaitu yang tidak memanggil fungsi lain) bahkan tidak diperlukan untuk mengalokasikan stackspace sama sekali jika dibutuhkan tidak lebih dari 128 Byte (ya, Anda memiliki dan dapat menggunakan sejumlah tumpukan tertentu tanpa mengalokasikannya ... yah, kecuali Anda adalah kode kernel, sumber bug bagus). Semua ini adalah pilihan pengoptimalan khusus, sebagian besar alasan untuk itu dijelaskan dalam referensi ABI lengkap yang dirujuk oleh referensi wikipedia poster asli.