1. 程式人生 > >彙編總結3

彙編總結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