Apakah ini berarti pointer basis atau stack pointer sebenarnya bergerak ke bawah alamat memori daripada naik? Mengapa demikian?
Ya, push
instruksi mengurangi penunjuk tumpukan dan menulis ke tumpukan, sementara pop
melakukan sebaliknya, membaca dari tumpukan dan menambah penunjuk tumpukan.
Ini agak historis karena untuk mesin dengan memori terbatas, tumpukan ditempatkan tinggi dan tumbuh ke bawah, sedangkan tumpukan ditempatkan rendah dan tumbuh ke atas. Hanya ada satu celah "memori bebas" - antara tumpukan & tumpukan, dan celah ini dibagi, salah satu dapat tumbuh ke dalam celah sesuai kebutuhan secara individual. Dengan demikian, program ini hanya kehabisan memori ketika tumpukan dan tumpukan bertabrakan tanpa meninggalkan memori bebas.
Jika tumpukan dan tumpukan keduanya tumbuh ke arah yang sama, maka ada dua celah, dan tumpukan tidak dapat benar-benar tumbuh ke celah tumpukan (sebaliknya juga bermasalah).
Awalnya, prosesor tidak memiliki instruksi penanganan tumpukan khusus. Namun, ketika dukungan tumpukan ditambahkan ke perangkat keras, ia mengambil pola ini tumbuh ke bawah, dan prosesor masih mengikuti pola ini sampai sekarang.
Orang dapat berargumen bahwa pada mesin 64-bit ada ruang alamat yang cukup untuk memungkinkan banyak celah - dan sebagai bukti, banyak celah harus terjadi ketika suatu proses memiliki banyak utas. Meskipun ini bukan motivasi yang cukup untuk mengubah keadaan, karena dengan sistem kesenjangan ganda, arah pertumbuhan bisa dibilang sewenang-wenang, sehingga tradisi / kompatibilitas cocok dengan skala.
Anda harus mengubah petunjuk CPU tumpukan penanganan untuk mengubah arah tumpukan, atau menyerah pada penggunaan didedikasikan mendorong & bermunculan petunjuk (misalnya push
, pop
, call
, ret
, orang lain).
Perhatikan bahwa arsitektur set instruksi MIPS tidak memiliki push
& khusus pop
, sehingga praktis untuk menumbuhkan tumpukan di kedua arah - Anda mungkin masih menginginkan tata letak memori satu celah untuk proses satu utas, tetapi dapat menumbuhkan tumpukan ke atas dan tumpukan ke bawah. Namun, jika Anda melakukan itu, beberapa kode varargs mungkin memerlukan penyesuaian dalam sumber atau lewat parameter di bawah kap.
(Faktanya, karena tidak ada penanganan stack khusus pada MIPS, kami dapat menggunakan kenaikan sebelum atau sesudah atau sebelum atau sesudah penurunan untuk mendorong ke tumpukan selama kami menggunakan pembalikan yang tepat untuk memunculkan tumpukan, dan juga dengan asumsi bahwa sistem operasi menghormati model penggunaan tumpukan yang dipilih. Memang, dalam beberapa sistem tertanam dan beberapa sistem pendidikan, tumpukan MIPS ditanam ke atas.)
-4(%rbp)
sekali tidak memindahkan pointer dasar dan itu+4(%rbp)
tidak mungkin bekerja.