Saya tahu bahwa dalam arsitektur yang saya kenal secara pribadi (x86, 6502, dll), tumpukan biasanya tumbuh ke bawah (yaitu setiap item yang didorong ke hasil tumpukan dalam SP yang berkurang, bukan yang bertambah).
Saya bertanya-tanya tentang alasan historis untuk ini. Saya tahu bahwa dalam ruang alamat terpadu, akan lebih mudah untuk memulai tumpukan di ujung segmen data yang berlawanan (katakanlah) jadi hanya ada masalah jika kedua sisi bertabrakan di tengah. Tetapi mengapa tumpukan secara tradisional mendapatkan bagian atas? Terutama mengingat bagaimana ini adalah kebalikan dari model "konseptual"?
(Dan perhatikan bahwa dalam arsitektur 6502, tumpukan juga tumbuh ke bawah, meskipun dibatasi ke satu halaman 256-byte, dan pilihan arah ini tampak sewenang-wenang.)
sumber
Satu penjelasan bagus yang saya dengar adalah bahwa beberapa mesin di masa lalu hanya dapat memiliki offset yang tidak ditandatangani, jadi Anda ingin stack tumbuh ke bawah sehingga Anda dapat mengenai penduduk setempat tanpa harus kehilangan instruksi tambahan untuk memalsukan offset negatif.
sumber
Stanley Mazor (arsitek 4004 dan 8080) menjelaskan bagaimana arah pertumbuhan tumpukan dipilih untuk 8080 (dan akhirnya untuk 8086) di "Intel Mikroprosesor: 8008 hingga 8086" :
sumber
Salah satu kemungkinan alasannya mungkin karena ini menyederhanakan penyelarasan. Jika Anda menempatkan variabel lokal pada tumpukan yang harus ditempatkan pada batas 4-byte, Anda cukup mengurangi ukuran objek dari penunjuk tumpukan, dan kemudian mengosongkan dua bit yang lebih rendah untuk mendapatkan alamat yang selaras dengan benar. Jika tumpukan tumbuh ke atas, memastikan penyelarasan menjadi sedikit lebih rumit.
sumber
A - B
secara konseptual dapat diimplementasikan sebagaiA + (-B)
(yaitu, langkah negasi terpisah untukB
), ini tidak dalam praktiknya.IIRC tumpukan tumbuh ke bawah karena tumpukan tumbuh ke atas. Bisa jadi sebaliknya.
sumber
realloc(3)
membutuhkan lebih banyak ruang setelah objek untuk hanya memperpanjang pemetaan tanpa menyalin. Realokasi berulang dari objek yang sama dimungkinkan jika diikuti oleh ruang tak terpakai yang jumlahnya berubah-ubah.Saya percaya ini murni keputusan desain. Tidak semuanya tumbuh ke bawah - lihat utas SO ini untuk diskusi yang baik tentang arah pertumbuhan tumpukan pada arsitektur yang berbeda.
sumber
Saya yakin konvensi tersebut dimulai dengan IBM 704 dan "register pengurangan" yang terkenal itu. Pidato modern akan menyebutnya bidang offset instruksi, tetapi intinya adalah mereka turun , bukan naik .
sumber
Hanya 2c lagi:
Di luar semua alasan historis yang disebutkan, saya cukup yakin tidak ada alasan yang valid dalam prosesor modern. Semua prosesor dapat mengambil offset yang ditandatangani, dan memaksimalkan jarak heap / stack agak diperdebatkan sejak kami mulai berurusan dengan banyak utas.
Saya pribadi menganggap ini sebagai cacat desain keamanan. Jika, katakanlah, perancang arsitektur x64 akan membalikkan arah pertumbuhan tumpukan, sebagian besar buffer overflow tumpukan akan dihilangkan - yang merupakan masalah besar. (karena senar tumbuh ke atas).
sumber
Saya tidak yakin tetapi saya melakukan beberapa pemrograman untuk VAX / VMS di masa lalu. Sepertinya saya ingat satu bagian dari memori (tumpukan ??) naik dan tumpukan turun. Saat keduanya bertemu, maka Anda kehabisan memori.
sumber
Salah satu keuntungan dari pertumbuhan tumpukan yang menurun dalam sistem tersemat minimal adalah bahwa satu bagian RAM dapat dipetakan secara berlebihan ke dalam halaman O dan halaman 1, memungkinkan variabel halaman nol untuk ditetapkan mulai dari 0x000 dan tumpukan tumbuh ke bawah dari 0x1FF, memaksimalkan jumlah yang harus ditingkatkan sebelum menimpa variabel.
Salah satu tujuan desain asli 6502 adalah dapat dikombinasikan dengan, misalnya, 6530, menghasilkan sistem mikrokontroler dua chip dengan ROM program 1 KB, timer, I / O, dan 64 byte RAM bersama. antara variabel tumpukan dan halaman nol. Sebagai perbandingan, sistem tertanam minimal pada waktu itu berdasarkan 8080 atau 6800 adalah empat atau lima chip.
sumber