一個字 = 兩個字節
雙字
字節為8位
字為16位(看兩格)
雙子dword32位(看四格)
內存中字的存儲:
? ? ? ? 0地址單元中存放的字節型數據是多少?
? ? ? ? 0地址字單元中存放的字型數據是多少?
? ? ? ? 2地址字單元中存放的字節型數據是多少?
? ? ? ? 2地址單元中存放的字型數據是多少(0012。字型要考慮兩個字節)
? ? ? ? 1地址字單元中存放的字型數據是多少(124E)(單元和字單元有什么區別?)
? ? ? ? 任何兩個地址連續的內存單元,N號單元和N+1號單元,可以將他們看成兩個內存單元,也可以看成一個地址為N的字節單元中的高位字節單元和低位字節單元
DS和 [ address?]:回過頭來看,這兩個玩意一定是成對出現的,才能唯一確定一個物理地址
? ? ? ? DS(data)寄存器用來存放要訪問的數據的段地址
? ? ? ? mov功能:1.(1)將數據直接送入寄存器(2)將一個寄存器中的內容送入另一個寄存器。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 除此之外,mov還可以將一個內存單元中的內容送入一個寄存器
? ? ? ? 對上面指令的解釋:
? ? ? ? ????????1.先說明:[ ... ]中存放偏移地址,DS中存放段地址
? ? ? ? ????????2.10000H表示1000:0(段地址:偏移地址)(為什么能唯一確定只能是這個比值?)
? ? ? ? ????????3.將段地址1000H放入ds
? ? ? ? ????????4.用mov al,[0]完成傳送( [? ] 中只用說明偏移地址,段地址默認放在ds中)
? ? ? ? 那能否直接mov ds, 1000H?這樣寫指令合法嗎?
? ? ? ? ? ? ? ? 不行,不能將數據直接送入段寄存去,數據只能送入通用寄存器(硬件設計問題)
? ? ? ? ? ? ? ? 數據 -> 通用寄存器 -> 段寄存器 (間接)
? ? ? ? 這樣就完成了將內存單元中的數據送入寄存器。
? 那如何將數據送入內存單元?
? ? ? ? ? ? ?
????????????????放到一起對比一下
????????
? ? ? ? 有例題:配置好環境后需要自己實現
mov、add、sub指令:
? ? ? ??推測:mov 寄存器,段寄存器 也是正確的
? ? ? ? add和sub同理:
數據段:?????????
? ? ? ? 在內存和寄存器之間傳送字型數據時,高地址單元和高8位寄存器、低地址單元和低8位寄存器相對應
棧(Fist In Last Out):
push和pop:入棧和出棧都是以字為單位
? ? ? ? push ax : 將寄存器ax中的數據送入棧中;
? ? ? ? pop ax : 從棧頂取出數據送入ax
cpu怎么知道一段內存空間被當作棧使用?如何知道那個單元時棧頂?
? ? ? ? 第一個問題:
? ? ? ? ????????有兩個寄存器:S(stack)S(段寄存器:記錄棧頂段地址)和SP(記錄棧頂偏移地址)
? ? ? ? ????????SS:SP就指向棧頂單元????????
????????????????任何一個時刻SS:SP指向棧頂(容易搞混)
? ? ? ? 第二個問題:
? ? ? ? ? ? ? ? push ax.? ? ? 該指令發生后,會(自動)進行SP = SP - 2;所以SS:SP將會指向新的棧頂
push的過程:
pop的過程:
? ? ? ? pop之后只會使SS:SP移動,但內存單元中的數據不會刪除,下次在push會對它進行覆蓋(刪不干凈)
? ? ? ? ? ? ? ? ? ? ? ?
棧頂越界的問題:(溢出攻擊)
棧和內存:棧就是內存空間的一部分
push和pop指令:
? ? ? ? ?比如段地址現在指向1000,那就將這個16進制數放入SS:SP所指向的位置? ? ??
? ? ? ? 棧操作都是以字為單位
??
模擬函數調用過程:
注意因為bx后入棧,所以一定要先出棧 ,對順序是有要求的
交換兩數的值:
????????????????對pop ax理解應該是:彈出最后一個值,將其賦值給ax
????????執行push和pop指令與mov指令不同,mov執行傳送指令只需要一步操作,而執行push和pop指令卻需要兩部操作:執行push時:先改變SP,后向SS:SP處傳送;執行pop時,先讀取SS:SP處的數據,后改變SP。
棧段:
一個棧段最大可以設為多少?2的16次方
? ? ? ? ?對于數據段,將段地址放在DS中,對于代碼段,段地址放在CS中,對于棧段,將段地址放在SS中