如下,運行起來后,cs ds ss三個暫存器會自動出現記憶體地址,請問這些地址是如何確定的?我在代碼里又沒寫。
assume cs:code, ds:data, ss:stack
data segment
xxxxxxxxxxxxxxxxxxxxxx
data ends
ss segment
xxxxxxxxxxxxxxxxxxxxxx
ss ends
code segment
xxxxxxxxxxxxxxxxxxxxxx
code ends
end
uj5u.com熱心網友回復:
這個是裝入程式來完成的。可以參考這里:https://zhidao.baidu.com/question/215505232.html
uj5u.com熱心網友回復:
cs 是由 end start 指定的 start 標號加載到記憶體時所在段的段址確定的,如你這里 end 陳述句后面沒指定程式從哪里開始,鏈接時應該會報警但仍會生成 exe 檔案,cs 則會指向程式有效內容的開始,這里就是 data 段,實際上錯了,所以應該用 end start 來指定程式從哪里開始;ds 則指向程式的 psp,要指向到 data 段,程式需自己進行賦值;
ss 看情況,如上面的代碼 sss segment 沒有加 stack 修飾來指明這是個堆疊段,則是指向程式最開始的段,sp=0000,一旦壓堆疊即會回繞到最末尾;如果是 sss segment stack 進行了指定,則是指向 sss 段(ss 是段暫存器名,保留字,不能欄位名),sp 會是sss 段的最后;沒有指明堆疊段,鏈接時也會報警,但對普通的簡單的程式來說,沒有問題,可以不予理會;dosbox 對 ss 的處理好像有不同,在沒有用 stack 指定時,比 dos 的默認設定往前挪了 1 即比 dos 的小 1,不知道是 bug還是有什么其他的考慮。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/275204.html
標籤:匯編語言
上一篇:隱私協議
