汇编语言基础知识摘要(《汇编语言》王爽)第 3 / 17 章
| 3.1~3.5 小結 |
| (1)字在內存中存儲時,要用兩個地址連續的存儲單元來存放,字的低位字節存放在低地址單元中,高位字節存放在高地址單元中。 |
| (2)用mov指令訪問內存單元,可以在 mov指令中只給出單元的偏移地址,此時,段地址默認在DS寄存器中。 |
| (3)[address]表示一個偏移地址為address的內存單元。 |
| (4)在內存和寄存器之間傳送字型數據時,高地址單元和高8位寄存器、低地址單元和低8位寄存器相對應。 |
| (5)mov、add、sub是具有兩個操作對象的指令。jmp是具有一個操作對象的指令。 |
| (6)可以根據自己的推測,在Debug中實驗指令的新格式。 |
我們要十分清楚的是,push和pop指令同mov指令不同,CPU執行mov指令只需一步操作,就是傳送,而執行push、pop指令卻需要兩步操作。執行push時,CPU的兩步操作是:先改變SP,后向SS:SP處傳送。執行pop時,CPU的兩步操作是:先讀取SS:SP處的數據,后改變SP。
注意,push,pop等棧操作指令,修改的只是SP。也就是說,棧頂的變化范圍最大為:0~FFFFH。
提供:SS、SP指示棧頂;改變SP后寫內存的入棧指令;讀內存后改變SP的出棧指令。這就是8086CPU提供的棧操作機制。
| 棧的綜述 |
| (1)8086CPU提供了棧操作機制,方案如下: ? ? ? ? 在SS、SP中存放棧頂的段地址和偏移地址; ? ? ? ? 提供入棧和出棧指令,它們根據SS:SP指示的地址,按照棧的方式訪問內存單元。 |
| (2)push指令的執行步驟:①SP=SP-2;②向SS:SP指向的字單元中送入數據。 |
| (3)pop指令的執行步驟:①從SS:SP指向的字單元中讀取數據;②SP=SP+2。 |
| (4)任意時刻,SS:SP指向棧頂元素。 |
| (5)8086CPU只記錄棧頂,棧空間的大小我們要自己管理。 |
| (6)用棧來暫存以后需要恢復的寄存器的內容時,寄存器出棧的順序要和入棧的順序相反。 |
| (7)push、pop實質上是一種內存傳送指令,注意它們的靈活應用。 |
| 棧是一種非常重要的機制,一定要深入理解,靈活掌握。 |
| 段的綜述 |
| ? ? ? 我們可以將一段內存定義為一個段,用一個段地址指示段,用偏移地址訪問段內的單元。這完全是我們自己的安排。 ? ? ? 我們可以用一個段存放數據,將它定義為“數據段”; ? ? ? 我們可以用一個段存放代碼,將它定義為“代碼段”; ? ? ? 我們可以用一個段當作棧,將它定義為“棧段”。 ? ? ? 我們可以這樣安排,但若要讓CPU按照我們的安排來訪問這些段,就要: ? ? ? 對于數據段,將它的段地址放在DS中,用mov、add、sub等訪問內存單元的指令時,CPU就將我們定義的數據段中的內容當作數據來訪問; ? ? ? 對于代碼段,將它的段地址放在CS中,將段中第一條指令的偏移地址放在IP中,這樣CPU就將執行我們定義的代碼段中的指令; ? ? ? 對于棧段,將它的段地址放在SS中,將棧頂單元的偏移地址放在SP中,這樣CPU在需要進行棧操作的時候,比如執行push、pop指令等,就將我們定義的棧段當作棧空間來用。 ? ? ? 可見,不管我們如何安排,CPU將內存中的某段內容當作代碼,是因為CS:IP指向了那里;CPU將某段內存當作棧,是因為SS:SP指向了那里。我們一定要清楚,什么是我們的安排,以及如何讓CPU按我們的安排行事。要非常清楚CPU的工作機理,才能在控制CPU按照我們的安排運行的時候做到游刃有余。 ? ? ? 一段內存,可以既是代碼的存儲空間,又是數據的存儲空間,還可以是棧空間,也可以什么也不是。關鍵在于CPU中寄存器的設置,即CS、IP,SS、SP,DS的指向。 |
轉載于:https://www.cnblogs.com/djdq/p/5004358.html
總結
以上是生活随笔為你收集整理的汇编语言基础知识摘要(《汇编语言》王爽)第 3 / 17 章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 中常用数据类型与控件类型的命名规则
- 下一篇: jQuery动态操作表单