彙編語言學習分享(三)

字的存儲

在上一篇中說到一個16位寄存器能夠存放一個字(16位)或者一個字節(8位),當存放一個字節的時候只須要一個內存單元(內存單元是以字節爲單位的,8位),而存放一個字須要兩個內存單元,這樣存放一個字就須要兩個連續的內存單元,這個16位的字,高位存放在高地址,低位存放在低地址code

內存地址 內存數據
0 20H
1 4EH
2 12H
3 00H

對於字來講0就是低地址單元,1是高地址單元,則字型數據4E20H的低地址位20存放在0號單元,高地址位4E存放在高地址單元,由於它的起始地址爲0,又能夠稱做0地址字單元。對象

段地址寄存器

經過前面學過的知識咱們能夠知道當CPU想要對一個內存單元進行操做時,必須知道它的地址,要知道內存單元的地址就要知道它的段地址和偏移地址,在8086 CPU中,DS寄存器就是用來存放段地址的,執行指令的時候,CPU會自動讀取DS中的數據爲內存單元的段地址,使用[偏移地址]來表示偏移地址,假設DS寄存器中此時存放的是1000H,那麼mov al,[0]就表示將10000H(物理地址=段地址x16+偏移地址)地址上存放的數據存到al中。
若是想要修改DS寄存器中的值,那麼直接使用mov指令將數字存到DS寄存器中是不行的,只能先將值存到一個寄存器中,再使用mov指令將這個寄存器中的值存到DS中,例:內存

mov bx,1000H
mov ds,bx
mov ax,[0]

這樣就將地址爲10000H處的值存放到ax寄存器中了,也就是將下表中的4E20H存放到ax中。(ax是十六位,一個字,兩個字節)table

內存地址 內存數據
0 20H
1 4EH
2 12H
3 00H

因此一個內存單元地址的肯定能夠經過段地址DS+[偏移地址]進行肯定class

add和sub指令

顧名思義,add指令就是用來作加法操做的,sub指令就是用來作減法操做的,例如add ax,8這條指令至關於C語言中的ax = ax + 8sub ax,8至關於C語言中的ax = ax - 8
add和sub指令能夠操做的對象有如下幾種形式,以add指令爲例:數據

add 寄存器,數據        例如:add ax,8
add 寄存器,寄存器      例如:add ax,bx
add 寄存器,內存單元        例如:add ax,[0]
add 內存單元,寄存器        例如:add  [0],ax

棧,是一段具備特殊訪問方式的存儲空間,它的存取規則是先進後出,後進先出,就像是一個上面沒有蓋的桶,最後放進去的東西只能最早取出來。
那麼咱們怎麼知道在連續的存儲空間中,哪一段是棧,哪一段不是棧,回想一下,CPU是根據CS、IP兩個寄存器中存放的值判斷當前指令存放的位置,根據DS、偏移地址判斷數據存放在哪一個內存單元,顯然,也會有相應的寄存器用來判斷哪一段是棧,在8086 CPU中,經過段寄存器SS和寄存器SP就能夠肯定棧的位置,棧有棧頂和棧底,棧頂的段地址存放在SS中,SP用於存放偏移地址,在任意時刻SS:SP指向棧頂元素,它指向的第一個元素能夠理解爲棧底,之後每存放一個數據SS:SP就向上提高,而它所指向的就是棧頂。tab

PUSH和POP指令

有了棧,那麼就能夠對棧進行存取數據的操做,使用的指令時push和pop指令,push指令用於入棧操做,也就是存數據,pop指令用於出棧,也就是取數據。8086 CPU的入棧、出棧操做都是以字爲單位
假設有以下一段連續的內存單元,此時SS爲1000H,SP爲000EH,AX爲1234H,棧頂爲1000EH。語言

內存地址 數據
1000AH
1000BH
1000CH
1000DH
1000EH
1000FH

首先,由於SS爲1000H,SP爲000EH,因此棧頂是指向1000EH位置的:
SS爲1000H,SP爲000EH,AX爲1234Hco

內存地址 數據
1000AH
1000BH
1000CH
1000DH
1000EH [SS:SP]
1000FH

接着咱們執行入棧操做,將AX(1234H)入棧,使用push ax操做進行壓棧。
SS爲1000H,SP爲000CH,AX爲1234Hheader

內存地址 數據
1000AH
1000BH
1000CH 34[SS:SP]
1000DH 12
1000EH
1000FH

此時,新的棧頂就變成了1000CH,接着,咱們再將一個當即數5678H壓入棧中,使用push 5678
SS爲1000H,SP爲000AH,AX爲1234H。

內存地址 數據
1000AH 78[SS:SP]
1000BH 56
1000CH 34
1000DH 12
1000EH
1000FH

這是,棧頂就是1000AH,SS爲1000H,SP爲000AH。
演示完了入棧,咱們再進行出棧,使用pop ax操做,將出棧的數據放入到ax寄存器中:
SS爲1000H,SP爲000CH,AX爲5678H。

內存地址 數據
1000AH 78
1000BH 56
1000CH 34[SS:SP]
1000DH 12
1000EH
1000FH

注意,出棧並不意味着以前寫入內存單元的數據被刪除了,以前寫入的數據仍是存在的,只不過它不在棧中了。

相關文章
相關標籤/搜索