彙編總結3
一、暫存器
字資料在記憶體中的儲存
記憶體以位元組為單位,劃分為若干個單元
位元組(8bit)
字(16bit)
雙字(32bit)
四字(64bit)
字資料的存取原則:
字資料的低位元組存放在低地址記憶體單位
高位元組存放在高地址記憶體單位
取低地址記憶體單元地址作為字資料地址
資料在記憶體和cpu之間的傳送
實體地址 123C8H
段地址:偏移地址 1230:C8
ds用來存放訪問資料的段地址
mov ax,1000H
mov ds,ax ds 1000H
mov al,[0] al ds:0
mov bl,[1] bl ds:1
mov cx,[1] cx ds:1
[.....]表示一個記憶體單元 [......]中的0表示記憶體單元的偏移地址
8086cpu不支援將資料直接送入段暫存器的操作,ds是一個段暫存器,所以mov ds,1000H是非法的,所以只能講這個資料先存入一個一般暫存器內
mov bx,1000H
mov ds,bx
mov,add,sub指令
mov:
1.兩個運算元長度要一致
2.常數不能做第一個運算元,做第二個運算元的時候如果做高位是十六進位制的字母,前面要加0
3.兩個記憶體單元之間不能直接傳資料
4.不能用mov指令修改cs和ip的值
5.兩個暫存器之間不能直接傳送,不能把常數送到段暫存器
add:
1.操作時不能同時是兩個記憶體單元
2.add指令運算元不能是段暫存器
sub:
1.兩個記憶體單元不能直接使用sub指令相減
2.sub指令的運算元不能是段暫存器
小結:字在記憶體中儲存時,要用兩個地址連續的記憶體單元來存放
用mov指令訪問記憶體單元時,可以再mov指令中只給出單元的偏移地址,此時段地址預設存放在ds暫存器中
[address]表示一個偏移地址為address的記憶體單元
mov,add,sub是具有兩個操作物件的指令,jmp是具有一個操作物件的指令
棧
棧是一個具有特殊訪問方式的儲存空間,他的特殊性在於最後進入這個空間的資料最先出去。
後進先出
棧底:固定的一端,棧區最高的地址單元的前一個單元
棧頂:最後入棧的字資料對應的地址單元
入棧,出棧
棧為空時,棧頂指向棧底+2
ss:棧段段暫存器,用於存放棧段的[段地址]
sp:棧指標暫存器,用於存放棧頂的偏移地址
ss:sp對應的實體地址是棧頂的實體地址
ss*16+sp就是棧頂的實體地址
push ax 表示將暫存器ax中的資料送入棧中
pop ax 表示從棧頂取出資料送入ax
在push記憶體單元和pop記憶體單元中,指令中只需給出[偏移地址],段地址在DS中
ss:sp指向棧頂元素
push ax的執行是有兩步完成
1.sp=sp-2,以棧頂前面的單元為新的棧頂
2.將ax中的內容送入ss:sp指向的記憶體單元處,ss:sp此時指向新棧頂
對8086cpu而言,push和pop的操作
入棧和出棧都以字為單元
操作物件不能是常數
pop段暫存器中,段暫存器不能是cs和ss
當棧滿的時候,再使用push指令入棧,當棧空的時候,再使用pop指令出棧,時會發生棧頂超界
用作資料段的時候,要把段地址-->ds
用作棧段時,要把段地址->ss,棧頂偏移地址->sp
用作程式碼段,段地址->cs,要取的指令偏移地址->ip.但是cs和ip的值不能用mov改變
在8086cpu中每個段的最大長度不能超過64kb