彙編棧為空時ss sp為什麼要使sp指向最低成子單元 2在壓入資料sp 2指向了棧底,但並未指向棧底向上

時間 2021-08-14 23:02:28

1樓:捉可愛的蘿蔔

應為 每次壓棧出棧操作是以字為單位 所以每次操作要倆空間單元

2樓:救贖削腎客

《組合語言》第二版,書裡的原話:

任意時刻,ss:sp指向棧頂元素,當棧為空的時候,棧中沒有元素,也就不存在棧定元素,所以ss:sp只能指向棧的最底部單元下面的單元,該單元的偏移位址為棧最底部的字單元的偏移位址+2。

不知道你看懂了沒

很好理解的

3樓:人才不

入棧的操作是先將 sp減2 再以 ss:sp 為位址存放資料當棧為空時 棧中無資料 為了保證棧空間的利用 將sp指向棧底的元素加二

比如說stack segment

db 128 dup (0)

top db 0

stack ends

在這裡 mov sp,offset top就是把 top 給 sp

這樣保證了 128個可用的位元組空間

否則就只有126個可用

因為入棧先做 sp=sp-2;再進行操作,所以初始化的時候sp要加二

4樓:

其實我只想說 這就是規定~~說多了我覺得沒什麼用

彙編中 棧被定義後是個空棧,壓入乙個數後,sp-2,為什麼不是sp-1?

5樓:匿名使用者

sp是位元組型單元,乙個位址是8位,push 壓入的數是16位,是int型,所以sp-2。而不是sp-1

6樓:

你圖上的乙個格仔是乙個位元組? push的都是乙個字,即2個位元組,那麼sp要減2

組合語言sp=sp-2是什麼意思

7樓:匿名使用者

sp=sp-2的意思是將堆疊位址減2。

組合語言中本身是不會這樣使用的,只是在描述諸如現場保護或中斷服務的概念時介紹堆疊所起的作用,在中斷服務程式結束,即執行到ret指令時,就會自動執行這條隱性指令,堆疊位址自動減2,將這兩個儲存單元中的位址複製給pc指標,程式返回到中斷開始的地方繼續執行。

8樓:匿名使用者

應該先了解一下什麼是 「棧空間」對這個問題就不難理解了:

假設 乙個棧段的長度是:10000---1ffff,兩個數相減等於 ffff,首先需知道指向棧頂的ss:sp 指標所指向的位址是多少,因為棧頂總是指向棧空間最高單元的下乙個單元。

知道了ss:sp也就知道了棧空間的大小,即 sp-2 (減兩個單元)如:sp=2e ,那麼2e-2=2c,棧空間是 0000----2c, 共計 13個單元。

9樓:匿名使用者

sp=sp-2,是指堆疊指標移動2個位元組。不是一進站就要移動2個位元組,這和你操作的數大小有關。如果你操作的書是位元組型的(比如c語言中char型),那就只移動1個位元組,即sp=sp-1;如果是雙位元組的(比如c語言中的int型),就是sp=sp-2;如果是四位元組的(比如c語言中的float型的)就是sp=sp-4.

10樓:匿名使用者

16位彙編:

push 16位(暫存器/儲存器) ; sp=sp-2pop 16位(暫存器/儲存器) ; sp=sp+2sp是棧頂指標指示器(16位);

32位彙編:

push 16位/32位(暫存器/儲存器/立即數) ; esp=esp- 2/4

pop 16位/32位(暫存器/儲存器/立即數) ; esp=esp+ 2/4

esp是棧頂指標指示器(32位);

現在的程式都是32位的.

11樓:

sp是棧指標,在8086模式下都是以字為單位,壓棧一次sp就減2,出棧一次sp就加2.

彙編中 棧被定義後是個空棧,壓入乙個數後,sp-2,為什麼不是sp-1

12樓:匿名使用者

sp是位元組型單元,乙個位址是8位,push 壓入的數是16位,是int型,所以sp-2。而不是sp-1

13樓:匿名使用者

因為棧中元素是以 「字(word)」為基本單位的。

誰能跟我講一下進棧為什麼要sp減2 出棧為什麼是sp+2?

14樓:匿名使用者

堆疊的兩條操作指令push(進棧)、pop(出棧),其指令格式為:

push opd

pop opd

其中opd是16位的運算元,可以是暫存器或儲存器運算元而記憶體空間(包括棧空間)是以位元組(8位)為單位進行儲存的,所以無論進棧或出棧,都要使用棧空間的兩個位元組。即在做進棧時,其棧指標(sp)要sp-2,出棧時,sp要sp+2

15樓:匿名使用者

8086cpu中,棧操作都是16位的,例如:push ax

我們不可以寫成push al或push ah。

記憶體單元最小單位是位元組,乙個位元組就佔記憶體的乙個小格,2位元組也就是16位就佔記憶體的二個小格,所以進棧減2 出棧+2。

16樓:匿名使用者

這是8086/8088對堆疊操作的規定,它規定堆疊必須以字(也就是16位)為單位,即不管進棧還是出棧,運算元都是16位的,而乙個儲存單元只有8位,所以一次堆疊操作,是對兩個儲存單元進行的;另外,8086/8088的堆疊是向下生長型的,即進棧時堆疊指標sp遞減,出棧時sp遞增,sp始終指向最後乙個進入堆疊的資訊所在的單元,所以對於8086/8088來說,進棧sp-2,出棧p+2

17樓:匿名使用者

這是儲存當前的pc值,其實這是是pc+1的指,就是下一條指令位置.

這樣在函式呼叫返回時,可以回到該位置....

回補充:

其中37是堆疊位置,當加入了pc值後,棧頂自然就會變了..

stack: 37 ...

38:39 pc

你這個問題是微控制器51的吧,51的pc暫存器是兩個位元組的,所以需要加2...

吃飯時為什麼不得將空碗空碟收走

笙笙橙 正在吃飯的時候就收碗碟,真的是很不禮貌的現象 浪子一個寶寶 飯是鋼,一頓不吃餓得慌 說的是 吃飯 不僅重要,而且一日三餐一頓也不能.忌未吃完飯就將空碗碟收走,忌席未散抹桌掃地 我是一隻怪活寶 我覺得是因為那種做法好像是在趕客人走一樣。 吹氣球小男孩 因為這也是餐桌禮儀的一部分。這個是不對的。...

為什麼引力會使空間扭曲?引力為為什麼會使空間扭曲?

會彎曲的。根據廣義相對論,物質使時空彎曲,而不單單使空間彎曲。具體來說,假設你在乙個慣性系中去測量不同地點同乙個因果關係的兩件事情發生的時間間隔,會發現引力越大之處時間間隔越強,換言之,引力會使時間流逝變慢。現在影響較明顯的有兩個 一是不可觀察到事件視界內部的事件的原因之一,因為任何物質落向黑洞的過...

為什麼要使用外部中斷外部中斷是幹嘛的為什麼要設定IT1和IT0為什麼要把P1賦值為0f

這堆問題讓我很尷尬。一個一個來吧 為什麼要使用外部中斷?這個問題可以和第二個一起回答。首先,你要知道什麼是中斷。中斷顧名思義,就是當達到某種條件或遇到某個事件時,微控制器立刻停下當前工作,馬上去處理這個條件,或解決事件,當處理完之後,又回到事件前工作狀態。外部中斷,就是當微控制器某個管腳的電平觸發設...