彙編語言學習【1】-寄存器

寄存器:CPU內能夠存儲數據的器件

AX,BX,CX,DX,爲什麼要分高字節和低字節?因爲8086要向上向上兼容80386,80386是 8 位機。

程序運行

CS:CPU要運行的程序的段地址

IP:CPU要運行的程序的偏移地址

CS:IP共同指向程序的首地址

數據的內存空間

           DS                  : 保存要操作的數據的段地址

【address】內存單元:要操作的內存的偏移地址

jmp指令和DS寄存器

jmp指令可以同時修改CS、IP的內容,可用指令“jmp 段地址:偏移地址”,使CPU從指定地址讀取命令【注意:使用jmp的格式並不是這樣的,彙編編譯器並不識別這樣的,只能在 debug 中用】

如 jmp 2AE3:3 執行後:CS = 2AE3H, IP = 0003H, CPU將從2AE33H處地區指令

若僅想修改IP的內容,可用指令“jmp 某一合法寄存器”完成

eg:

jmp ax , 將ax的內容賦值給IP寄存器,用寄存器的值修改IP值

DS

通常用來存放要訪問數據的段地址

讀取某一內存單元數據的方式

訪問1000:0地址的數據

mov bx, 1000H   //DS不支持mov ds 1000H,所以只能用寄存器傳值的方式將1000H傳入DS
mov ds, bx      //DS支持寄存器傳值
mov al, [0]     //[……]表明一個內存單元,[0]表明該內存單元的偏移地址爲0.

上面3步執行完就可以將1000:0的數據傳到AL寄存器中

MOV在DOS下的操作數的傳輸方向

段寄存器:CS/DS/SS

通用寄存器: AX/BX/CX/DX

內存單元:[address]、[ 通用寄存器 ]

小結

1、字在內存中存儲時,要用兩個地址連續的內存單元來存放,字的低位字節放在低地址單元中,高位字節存放在高地址單元中。

2、用 mov 指令要訪問內存單元,可以在mov指令中只給出單元的偏移地址,此時,段地址默認在DS寄存器中

3、[address] 表示一個偏移地址爲 address 的內存單元。

4、在內存和寄存器之間傳送字型數據時,高地址單元和高8位寄存器、低地址單元和低 8 位寄存器相對應。

5、mov 、add 、sub 是具有兩個操作對象的指令。jmp 是具有一個操作對象的指令。

SS :提供棧頂的段地址

SP :提供棧頂的偏移地址

SS:SP:指向棧頂的地址

  • push命令的的執行過程

第一步:SP = SP - 2,SS:SP指向當前棧頂前面的單元,以當前棧頂前面的單元爲新的棧頂

第二步:將數據送入 SS:SP 指向的內存單元處, SS:SP 此時指向新棧頂

任意時刻,SS:SP 指向棧頂元素。當棧爲空時,SS:SP指向棧最底部內存單元偏移地址+0001H的內存單元

8086 沒有對棧頂上限和棧底進行監控,所以發生棧頂超界問題無法報警或者提示。

PUSH 和 POP

        可操作的對象有寄存器、段寄存器、內存單元【以字單元爲單位】

         POP 的操作結果是將棧頂的字傳給操作的對象,不一定將原來的數傳給寄存器,如下所示

mov ax,1000
mov bx,2000
push ax
push bx
pop ax  //此時棧頂的數值是2000,因爲是後來壓入的
pop bx  

小結:

1、出棧、入棧指令根據 SS:SP 指示的地址,按照棧的方式訪問單元

2、push指令的執行步驟:1)SP = SP - 2;  2) 向 SS:SP 指向的字單元中送入數據。

3、pop 指令的執行步驟: 1)從 SS:SP 指向的字單元中讀取數據; 2) SP = SP + 2

4、任意時刻,SS:SP 指向棧頂元素

5、8086 CPU 只記錄棧頂,棧空間的大小我們要自己管理

6、push、pop 實質上是一種內存傳送指令,注意他們的靈活應用

段的綜述【清楚明瞭,比大學老師講的清楚一萬倍】

 

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