一. 實驗要求
利用Proteus平臺,建立8086的循環程序的例子。
二. 實驗目的
- 熟悉實驗系統的編程和使用。
- 掌握使用LOOP判斷轉移指令試驗循環的方法。
- 掌握使用LOOP與CX的組合。
三. 實驗說明
由於本實驗是通過給CX一個數值,再通過LOOP作一個判斷CX-1是否爲0的轉移,實現程序的循環,循環的內容是執行AX+1,所以結果應該爲AX最後大小爲開始時給定CX的大小。
四. 實驗程序流程圖
五. 實驗步驟
a.仿真代碼
;改變 CX 循環次數 ,驗證AX 是否加1,加了循環的次數
CODE SEGMENT
ASSUME CS:CODE
CON_A EQU 25;這兩行沒用,實驗三才用到
CON_B EQU 12
START:
MOV AX,0 ;對AX清零,用於記錄當前是第幾次循環
MOV CX,5 ;設置循環次數,不可以用別的寄存器,是LOOP語句指定的
INC_AX: NOP ;啥也不做,LOOP將會跳轉到該標籤
INC AX ;循環一次 AX+1
LOOP INC_AX ;CX-1 ?=0 不等於循環至INC_AX處
JMP $ ;原地無限循環
CODE ENDS
END START
b.調試、驗證
最初AX初始化爲0,CX賦值爲5
經過AX自增語句及LOOP語句後,跳轉回了NOP語句,發現AX加一,CX減一。此後以此類推。
若是在AX執行後,LOOP執行前暫停,就會發現AX加一,但CX未加。這證明了正是LOOP語句對CX進行了減一的操作。
六. 實驗結果和體會
經過五次循環後,最終結果如圖,AX等於5,表示循環了5次,而跳出循環後,CX一定爲0。
LOOP語句之所以先減後判斷CX是否爲0,就是爲了CX中的數值能剛好對應循環次數,便於程序員使用。程序中INC AX語句的位置可以替換成任何需要被多次調用的程序。使用INC語句的原因有以下幾點:1.運行速度比ADD快(僅指8086這種古老平臺,在現代計算機中可能不成立)2.代碼所佔內存小(這也不是主要原因)3.INC不改變符號位,而ADD會(這纔是主要的,如果循環體中需要用到CF,可能就會因爲這點出問題)
七. 擴展題目程序和實驗結果
;計算2^12結果
CODE SEGMENT
ASSUME CS:CODE
CON_A EQU 25
CON_B EQU 12
START:
MOV AX,1 ;初始化爲1,用來進行乘法與存放結果
MOV CX,12 ;設置循環次數
INC_AX: NOP
MOV DX,2 ;每次相乘後DX會被清0,因此要再次設置2作爲乘數
MUL DX ;AX與DX相乘,結果存於AX
LOOP INC_AX ;CX-1 ?=0 不等於循環
JMP $ ;原地無限循環
CODE ENDS
END START
最後的結果是1000H,正確。