Translate

顯示具有 組合語言 標籤的文章。 顯示所有文章
顯示具有 組合語言 標籤的文章。 顯示所有文章

星期六, 7月 28, 2012

8051/8052定址法

8051/8052定址法



定址法(Address Mode)是組合語言中,運算碼找運算元的方法,

8051的定址法可分為下列六種:



##1直接定址法(Direct Addressing)



##2間接定址法(Indirect Addressing)



##3暫存器定址法(Register Addressing)



##4立即定址法(Immediate Addressing)



##5索引定址法(Indexed Addressing)



##6位元定址法(Bit Addressing)



##1直接定址法



所謂直接定址法,就是在指令中,直接指定運算元所在的位址。

僅適用於內部資料記憶體(RAM)及特殊功能暫存器(SFR)。

例如:



MOV A,3FH ;把位址 3FH 的內容存入累加器A。



ADD A,30H ;把位址 30H 的內容加到累加器A。



##2 間接定址法



間接定址法是把運算元的位址存放在一個暫存器,這個暫存器

就是運算元位址的指標(POINTER),8051/8052內部具有這種

存取位址功能的暫存器有RO,Rl,SP,DPTR。間接定址法的

前置符號為"@" 。



RO,R1 是8位元的暫存器,我們可以用來定址內部 RAM 和

外部橫充RAM 的前面 256 BYTE(位址00H-FFH)

例如:



MOV RO,#70H



MOV A,@R0 ;把內部 RAM 位址 70H 的內容存入累加器 A。



MOVX A,@RO ;把外部 RAM 位址 70H 的內容存入累加器 A。



SP是堆疊指標(STACK POINTER)暫存器,也是8位元的暫存器。

它是堆疊區存放或取出資料的位址指示。例如:



PUSH 3OH



是將 RAM 位址 30H 的內容,存入堆疊區,而存入的位址,

就是由 SP 暫存器所指定。例如執行上面的指令時,SP=50H,

就是把位址 30 H 的內容存放在記憶體位址 51H 內。



DPTR是資料指標暫存器,它是16位元的暫存器,因此可定址

65536 個BYTE,是用來定址外部橫充RAM和外部擴充ROM的

專用指標。例如:



MOV DPTR,#5678H ;將立即資料5678H,存入DPTR



MOVX A,@DPTR ;將外部 RAM 位址 5678H 的內容,存入累加器 A。







##3暫存器定址法



8051/8052內部RAM的每個暫存器庫均含有8個暫存器,

稱為RO-R7,若運算元是使用RO-R7的定址法都稱為暫存器

定址法。例如:



MOV A,R7 ;把暫存器R7的內容存入累加器A。



ADD A,R3 ;把暫存器R3的內容加到累加器A。



因為8051/8052內部有四組暫存器庫(BANK),因此有四組

RO-R7,到底目前所使用的暫存器是屬那一個暫存器庫,是

由程式狀態字暫存器(PSW) 內的RSl,RSO兩個位元所決定。



##4 立即定址法



立即定址法是把運算元直接放在運算碼的後面。若運算元是

常數資料,則必須以"#"號當作立即值的前置符號。例如:



MOV A,#30H ;把一個常數30H存入累加器A。



MOV R5,#05H ;把一個常數05H存入R5暫存器。



##5 索引定址法



8051/8052的索引定址法僅適用於 ROM (程式記憶體),而且

只能讀出,不能寫入。所謂索引定址法就是以一個基底暫存器

的內容,再加上一個索引暫存器的內容,所得的值即是運算元

所在的位址。採用索引定址法時,當基底暫存器的是 DPTR

(資料指標暫存器)或 PC (程式計數器),當索引暫存器的則是

累加器 A。例如:



MOV A,#30H



MOV DPTR,#300H



MOVC A,@A+DPTR ;將程式記憶體位址330H(30H+300H)的內容存入

累加器A。



##6 位元定址法



位元定址法是指對內部資料記憶體(RAM)及特殊功能暫存器

(SFR)的某個位元直接設定或清除。就因為8051/8052具有

位元定址法,所以我們可以輕易的控制功能強大的特殊功能

暫存器(SFR),讓8051/8052發揮最大效用,這是8051/8052

很重要的特色。但是位元定址法,只能使用於可位元址的

暫存器。例如:



SETB C ;設定進位旗標 C 為 1。



SETB P1.0 ;設定埠l(Pl)的第 0 位元為 1。



MOV C,ACC.2 ;把累積器ACC的第2位元的值存入進位旗標。



所謂定址法,其實很簡單,也別被這個專有名詞嚇到了。你只要把『定址法』理解為『傳送或取得資料的方式』即可。



1. 暫存器定址法:這是最簡單的,也就是在暫存器與暫存器之間做資料傳送。

範例:MOV AX,BX



2. 立即定址法:指令的來源運算元是『立即數值』,而非『位址』

範例:MOV AX,1000H



3. 直接定址法:可以是代表某一記憶體位址的『標記 (也可以理解為變數)』,或是一直接的差距位址。

範例:MOV AX,VAR



4. 暫存器間接定址法:可將某暫存器的內含值當成一個『位址』,然後再將此位址的內含值傳入運算元。

範例:MOV AX,[BX]



5. 基底相對定址法:這個和暫存器間接定址法類似,只是在來源運算元的部份需要考慮位移量。

範例:MOV AX,[BX]+4 或者也可以寫成 MOV AX,[BX+4]



6. 直接索引定址法:意即實際存取資料的『位址』,是將索引暫存器 (SI,DI) 的內含值,加上位移量而得。此種定址方式,常用來存取表格資料。

範例:MOV AX,TABLE[SI]



7. 基底索引定址法:這是最複雜的定址方式。實際記憶體位址的求取方式 ---> 基底暫存器內含值 + 索引暫存器內含值 + 位移量。

範例:MOV AX,TABLE[BX][SI]

組合語言

參考來源==> http://masm1215.myweb.hinet.net/menu.htm

組合語言指令介紹
MOV 目的,來源
動作:將來源資料複製到目的

XCHG 參數1,參數2
動作:將參數1與參數2的內含值對調

PUSH 來源
動作:將來源資料放入堆疊記憶體,即將來源放入SS:[SP-2]然後SP減2

POP 目的
動作:從堆疊取出資料放入目的,即SP加2後取出SS:[SP-2]的資料放到目的


LEA 暫存器,記憶體
動作:讓暫存器指向指定的記憶體位址,此時暫存器的內容為該記憶體的位址,而非記憶體的內含值

MOVSB,MOVSW,MOVSD
動作:複製DS:[SI]至ES:[DI]單位為1/2/4 bytes,複製後SI及DI的值加1/2/4


STOSB,STOSW,STOSD
動作:複製DS:[SI]至AL/AX/EAX,複製後SI加1/2/4


ADD 目的,來源
動作:目的=目的+來源
ACD 目的,來源
動作:目的=目的+來源+C旗標

INC 運算元
動作:運算元=運算元+1

SUB 目的,來源
動作:目的=目的-來源

SBB
動作:目的=目的-來源-C旗標

DEC
動作:運算元=運算元-1

CMP 目的,來源
動作:兩者比較,相當於目的減來源,但只回應至旗標

MUL 目的
動作:AL/AX/EAX乘以目的,結果放至AX/DX:AX/EDX:EAX

IMUL 目的
動作:有號的AL/AX/EAX乘以有號的目的,結果放至AX/DX:AX/EDX:EAX

IMUL 目的,來源
動作:有號的來源乘以有號的目的,結果放至X/DX:AX/EDX:EAX
IMUL 目的,來源,立即值
動作:有號的來源乘以立即值,結果放至目的

DIV 來源
動作:AX/DX:AX/EDX:EAX除以來源,商放入AL/AX/EAX,餘數放入AH/DX/EDX

IDIV
動作:有號的AX/DX:AX/EDX:EAX除以來源,商放入AL/AX/EAX,餘數放入AH/DX/EDX

AND 目的,來源
動作:目的=目的 and 來源

OR 目的,來源
動作:目的=目的 or 來源

XOR 目的,來源
動作:目的=目的 xor 來源

TEST 目的,來源
動作:會做與 and 相同的動作,但只回應至旗標

NOT 運算元
動作:運算元=not 運算元

SHR 目的,CL
動作:將目的所有bit右移CL格,bit7補0,bit0放入C旗標

SHL 目的,CL
動作:將目的所有bit左移CL格,bit0補0,bit7放入C旗標

SAR 目的,CL
動作:將目的所有bit除了bit7不變,其餘右移CL格,bit0放入C旗標

SAL 目的,CL
動作:將目的所有bit左移CL格,bit0補0,bit7放入C旗標

ROR 目的,CL
動作:將目的所有bit右旋CL格,即bit7會因右移到bit0及C旗標

ROL 目的,CL
動作:將目的所有bit左旋CL格,即bit0會因左移到bit7及C旗標

RCR 目的,CL
動作:將目的所有bit包含C旗標,全部右旋CL格

RCL 目的,CL
動作:將目的所有bit包含C旗標,全部左旋CL格

JMP 位址
動作:跳躍至指定位址

AAD
動作:將除法完後的AL換算成十進制,十位數從AH減,個位數放入AL

CALL 位址
動作:呼叫指定位址的副程式

RET 返回
動作:副程式結束,返回,即 pop ip

INT 中斷號碼
動作:呼叫中斷副程式

IRET
動作:中斷副程式結束,返回

LOOP,LOOPZ,LOOPNZ 位址
動作:假如 CX>1,Z=1,Z=0 時,跳躍至指定位址,且CX值減1

IN 目的(AL/AX),來源(DX)
動作:從來源port,輸入資料至 AL/AX

OUT 目的(DX),來源(AL/AX)
動作:將一資料,輸出至目的port