彙編語言第三版(王爽著)(第三章.寄存器(內存訪問))

3.1 內存中字的存儲

1.CPU中,用16位寄存器來存儲一個字。高8位存放高位字節,低八位存放低位字節。
0 20H
1 4EH
2 12H
3 00H
第一個字是 4E20H
第二個字是 0012H
2.字單元
我們將起始地址爲N的字單元簡稱爲N地址字單元。
比如一個字單元由0 1兩個內存單元組成,則這個字單元的起始地址爲0,我們可以說這是0地址字單元。

3.2 DS和 [ ]

DS通常用來存放要訪問數據的段地址;
[ ]表示一個內存單元,[ ]裏面的數表示內存單元的偏移地址。
指令執行的時候,8086CPU自動取ds中的數據爲內存單元的段地址。
8086CPU不支持將數據直接送入段寄存器的操作
mov bx,1000H
mov ds,bx
mov al,[0]
也可以將數據從寄存器送入內存單元 mov [0],al

3.3 字的傳送

舉個例子吧:
字的傳送

3.4 mov,add,sub指令

將123B0~123B9的內存單元定義爲數據段。現在要累加這個數據段中的前3個單元中的數據。代碼如下:
mov ax ,123BH
mov ds,ax
mov al,0 ;用al存放累加結果
add al,[0]
add al,[1]
add al,[2]

檢測點 3.1

檢測點3.1 答案

後進先出 LIFO

CPU提供的棧機制

PUSH 入棧 POP出棧
push ax將ax中的數據送入棧中,pop ax 將棧中的數據送入寄存器
出棧和入棧操作都是以字爲單位的
任意時刻 SS:SP指向棧頂元素
SS 棧頂的段地址 SP 偏移地址

push ax 的執行:(從高地址向低地址方向增長)
(1)SP = SP-2 先移動,讓SS SP指向新的棧頂
(2)再把數據存進去
棧空 SS:SP指向棧空間最高地址的下一個單元

pop ax 的執行:(從高地址向低地址方向增長)
(1)先把數據送入ax中
(2)SP = SP+2 移動,讓SS SP指向新的棧頂

被彈出棧的數據依然存在,但是,它已經不再棧中。當push操作時,在裏面寫入新的數據將它覆蓋。

棧頂超界的問題

當棧滿的時候再使用push指令入棧或棧空的時候再使用pop指令出棧,都會發生棧頂超界的情況。
而CPU只考慮當前的情況:當前的棧頂在何處,當前要執行的指令是哪一條。

push,pop指令

可以是寄存器 段寄存器 也可以是內存單元
舉個例子:
編程 將 10000H~1000FH這段空間當做棧,初始狀態棧是空的,將AX,BX,CX,DX中的數據入棧。
mov ax,1000H
mov ss,ax
mov sp,0010H 棧底的下一個單元
push ax
push bx
push cx

清零操作可以用sub,也可以用mov。
恢復’寄存器中的內容時,出棧的順序要和入棧的順序相反。
如果要在10000H處寫入字型數據2266H,可以用以下代碼完成
mov ax,1000H
mov ds,ax
mov ax,2266H
mov [0],ax
也可以是
mov ax,1000H
mov ss,ax
mov sp,2H ;指針先減2再存入數據
mov ax,2266H
push ax

檢測點3.2

檢測點3.2
mov ax,1000H
mov ds,ax
mov ax,2000H
mov ss,ax
mov sp,10H
push [0]
push [2]
push [4]
push [6]
push [8]
push[A]
push[C]
push[E]

3.10棧段

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章