微機(jī)實驗:指令功能實驗
實驗?zāi)康?/b>
1、熟悉仿真器操作;
2、掌握51系列指令功能及其機(jī)器碼的編譯。
(一)數(shù)據(jù)傳送和運算
實驗內(nèi)容:
兩個16位無符號二進(jìn)制數(shù)分別存放在片外RAM首址為2000H和2002H單元內(nèi),將它們相加后存放在片內(nèi)RAM 30~31H單元。(高地址單元存高8位數(shù),低地址單元存低8位數(shù))。
參考程序:
ORG? 1000H |
MOV ?DPTR, #2000H |
;被加數(shù)送R2R3 |
? |
MOVX ?A, @DPTR |
;A=____ |
? |
MOV ?R2, A |
;R2=____ |
? |
INC ?DPTR |
;DPTR=____ |
? |
MOVX ?A, @DPTR |
? |
? |
MOV ?R3, A |
;R3=____ |
? |
INC ?DPTR |
;求和,送R2R3 |
? |
MOVX ?A, @DPTR |
;A=____ |
? |
ADD ?A ,R2 |
;R2=____ |
? |
INC ?DPTR |
? |
? |
MOVX ?A, @DPTR |
;A=____ |
? |
ADDC ?A, R3 |
;R3=____ |
? |
MOV ?30H, R2 |
;和存30H、31H |
? |
MOV ?31H, R3 |
;(30H)=__,(31H)=__ |
? |
NOP |
;實驗斷點 |
? |
END |
? |
實驗步驟:
1、復(fù)位。仿真器復(fù)位后,讀初始值A(chǔ)、PSW、DPTR。
2、輸入程序。 將源程序輸入首址為1000H的存儲單元。
3、設(shè)置初值。假設(shè)被加數(shù)為1234H,加數(shù)為5678H,分別送入片外RAM的2000H和2002H單元。
4、單步執(zhí)行。每執(zhí)行一步,觀察A、R2、R3的數(shù)值變化。
5、連續(xù)執(zhí)行。首先,重設(shè)初值,在結(jié)束處設(shè)置斷點,然后全速運行。
6、上述程序模塊最后一句NOP指令改為SJMP$(機(jī)器碼80FE),再次執(zhí)行單步和連續(xù)操作。
思考題:
1、8031對片內(nèi)RAM和片外RAM各有哪些尋址方式?有哪些指令可以在片內(nèi)RAM之間、片內(nèi)外RAM之間實現(xiàn)數(shù)據(jù)傳送?
2、調(diào)試程序模塊時,為什么要在模塊結(jié)束處設(shè)置斷點或加SJMP$指令?
(二)從程序存儲器取數(shù)
實驗內(nèi)容:將R0中的16進(jìn)制數(shù)0~F改寫為ASCⅡ碼。
參考程序:
ORG ?1020H |
? | ||
? |
? |
MOV ?A, R0 |
;取16進(jìn)制數(shù) |
? |
? |
ADD? A, #03H |
;修正A |
? |
? |
MOVC ?A ,@A+PC |
;查存儲器中ASCⅡ表 |
? |
? |
MOV ?R0, A |
;ASCⅡ碼存R0 |
? |
? |
SJMP ?$ |
;停 |
????? DB |
? |
30H,31H,32H,33H, |
;ASCⅡ碼表 |
? |
? |
34H,35H,36H,37H, |
? |
? |
? |
38H,39H,41H,42H, |
? |
? |
? |
43H,44H,45H,46H |
? |
實驗步驟:
1、輸入程序。
2、R0單元輸入任一數(shù)(0~F)。
3、用單步和連續(xù)運行程序,并檢查結(jié)果。
4、計算相對轉(zhuǎn)移指令的地址偏移量。
思考題:
1、有哪些指令可以讀取程序存儲器(EPROM)中的內(nèi)容?
2、句中的修正量如何計算?
3、實驗內(nèi)容不變,但要求用MOVE A,@A+DPTR查表,試編寫程序。
(三)子程序調(diào)用
實驗內(nèi)容:
已知整數(shù)n存于R0,求 ,k≤10,并存于R2R3。
參考程序:
ORG? 2000H |
? | ||
? |
? |
CLR ?A |
;R2、R3清零 |
? |
? |
MOV ?R2,? A |
? |
? |
? |
MOV ?R3,? A |
? |
? |
ML: |
MOV ?A,? R0 |
? |
? |
? |
LCALL? SQ |
;執(zhí)行前,SP=___;PC=_? ? 執(zhí)行后,SP=___;PC=__ |
? |
? |
ADD? A,R3 |
;累加和,存R2R3 |
? |
? |
MOV? R3,A |
? |
? |
? |
CLR? A |
? |
? |
? |
ADDC? A? R2 |
? |
? |
? |
MOV? R2,A |
? |
? |
? |
DJNZ? R0,ML |
? |
? |
? |
SJMP? $ |
? |
? |
? |
? |
? |
? |
? |
ORG |
? |
? |
?SQ: |
ADD? A,#01H |
;求(A)2 |
? |
? |
MOVC? A,@A+PC |
? |
? |
? |
RET |
;執(zhí)行后,SP=___;PC=__ |
? |
?DB: |
01H,04H,09H,10H,19H |
;1~10平方表 |
? |
? |
24H,31H,40H,51H,64H |
? |
實驗步驟:
1、人工匯編上述程序,寫出每條指令的首地址和機(jī)器碼。
2、輸入程序。
3、在R0輸入某數(shù)(≤10)以后,單步執(zhí)行,觀察子程序調(diào)用和返回時堆棧的內(nèi)容變化。然后連續(xù)執(zhí)行至程序結(jié)束,觀察R2、R3中結(jié)果。
思考題:
執(zhí)行CALL和RET指令的過程中,堆棧內(nèi)容如何變化?
(四)堆棧操作和跳轉(zhuǎn)指令
實驗內(nèi)容:
將程序中存貯器中的字符串“ABC”和“12345”(字符串結(jié)束符00H)分別傳送到片內(nèi)RAM,首址為50H、60H的單元內(nèi)。
參考程序:
ORG ?1040H |
? | ||
? |
? |
MOV ?SP,#20H |
;設(shè)置堆棧 |
? |
? |
MOV? R1,#50H |
;R1指向片內(nèi)RAM首址 |
? |
? |
LCALL? SOT |
? |
? |
? DB: |
“ABC”, 00H |
;字符串 |
? |
? |
MOV? R1,#60H |
;R1指向片內(nèi)RAM首址 |
? |
? |
LCALL? SOT |
? |
? |
? DB: |
“12345”,00H |
;字符串 |
? |
? |
SJMP? $ |
? |
? |
? |
? |
? |
? |
? |
ORG? 1060H |
? |
? |
?SOT: |
POP? DPH |
;字符串首地址DPTR |
? |
? |
POP? DPL |
? |
? |
SOT1: |
CLR? A |
? |
? |
? |
MOVC? A,@A+DPTR |
;讀字符串 |
? |
? |
MOV ?@R1,A |
;寫入片內(nèi)RAM |
? |
? |
INC? DPTR |
;修正地址 |
? |
?? |
INC? R1 |
? |
? |
? |
JZ? SEND |
;字符串結(jié)束? |
? |
? |
SJMP? SOT1 |
;否,轉(zhuǎn)SOT1 |
? |
SEND: |
JMP? @A+DPTR |
;返回 |
實驗步驟:
1、輸入程序。
2、單步執(zhí)行,觀察堆棧指針SP、堆棧內(nèi)容、DPTR、PC的變化情況。
思考題:
子程序SOT的結(jié)束處,為什么不用RET,而用JMP @A+DPTR?
評論
查看更多