回覆列表
-
1 # 使用者2458114238191884
-
2 # 範閒不是我
堆疊段是一個特殊的段,在程式中可以定義它,也可以不定義。除了要生成COM型執行檔案的源程式外,一個完整的源程式一般最好定義堆疊段。如果在程式中不定義堆疊段,那麼,作業系統在裝入該執行程式時將自動為其指定一個64K位元組的堆疊段,所以你沒申明堆疊當然也可以用push。
在程式沒有定義堆疊段的情況下,在由連線程式生成執行檔案時,將會產生一條如下的警告資訊, 但程式設計師可以不理會它,所生成的執行檔案是可以正常執行的。
堆疊段一般是拿來儲存區域性變數用的,函式呼叫,中斷返回都需要棧的支援。良好的程式設計師和優美的程式碼不應該沒有堆疊段。
要用assume把段跟段暫存器對應起來的原因是原來的DOS找到的空閒記憶體的地址不是固定的,無法找到一個地址在任何時候都是空閒的。於是DOS需要可以重定位的程式,而當時的定位方式就是設定段暫存器的值使該程式能在可分配(空閒)的記憶體中可用。那就需要知道某個段被重定位時候需要修改哪個段暫存器的值才能正確執行。assume提供這種段和重定位程式碼時需要對應修改的暫存器的關係給編譯器,編譯器再這個資訊寫到二進位制檔案中去。比如DOS下的exe程式記錄在檔案頭中。