Zona merah, murni dan sederhana, merupakan optimasi yang dapat menyimpan instruksi. Ini berarti bahwa tidak lagi diperlukan kode yang dipancarkan untuk setiap fungsi untuk mengurangi dari stack pointer untuk membuat penyimpanan lokal seperti itu
sub XXX, %rsp
di awal setiap panggilan fungsi, bahkan jika mereka bukan fungsi daun. Sering kali kode yang dipancarkan dari kompiler dapat menggunakan ruang sementara di zona merah di bawah penunjuk tumpukan tanpa perlu menyimpannya dan sebelum memanggil fungsi lainnya. Ini adalah optimasi yang berguna untuk tersedia.
Jika Anda tidak lagi harus sub dari penunjuk tumpukan, kode yang dipancarkan dapat menggunakan rsp sebagai basis penunjuk, pekerjaan yang biasanya disediakan untuk rbp, dan kode yang dipancarkan dapat menggunakan rbp sebagai register tujuan umum lainnya.
Ini pada akhirnya berarti prolog dan epilog dari setiap pemanggilan fungsi dapat menyimpan dua instruksi yang akan menyimpan dan mengembalikan rbp:
(gnu assembler)
pushq %rbp # prologue [ two instructions not necessary ]
movq %rsp,%rbp
.... [code]
movq %rbp,%rsp # epilogue [ two instructions not necessary ]
popq %rbp
Perhatikan bahwa dalam gcc Anda dapat melewati flag -mno-red-zone jika Anda tidak menginginkannya (tetapi ABI x86-64 mensyaratkannya). Kernel Linux tidak harus sesuai dengan ABI dan dengan demikian semua kode kernel dikompilasi dengan -mno-red-zone.
Lebih jauh, mengakses memori di luar penunjuk tumpukan tidak berbahaya jika itu adalah mode operasi yang diharapkan. Ini hanya berbahaya dan dapat menyebabkan korupsi ketika tidak direncanakan, dan tidak terduga. Ketika kode yang dipancarkan melakukannya, ia tahu apa yang dilakukannya.
%rsp
sebagai pointer basis.