一. 實驗要求
利用Proteus平臺,建立8086的分支程序的例子。
二. 實驗目的
- 熟悉實驗系統的編程和使用。
- 掌握使用轉移類指令編程及調試方法。
- 掌握各種標誌位的影響。
三. 實驗說明
由於本實驗是通過改變兩個變量CON_A和CON_B的大小,實現用CMP指令對不同標示位的影響的一個轉移,分別設有大於、等於、小於。
四. 實驗程序流程圖
五. 實驗步驟
a.仿真代碼
;改變CON_A和CON_B 的大小,實驗程序的不同分支
CODE SEGMENT
ASSUME CS:CODE
CON_A EQU 25
CON_B EQU 12
START:
MOV AX,CON_A
MOV BX,CON_B
CMP AX,BX;比較AX,BX
JNC MO_T ;AX > BX 跳轉
JE EQUA ;AX = BX 跳轉
JC LESS ;AX < BX 跳轉
MO_T: JMP $
EQUA: JMP $
LESS: JMP $
CODE ENDS
END START
b.調試、驗證
最初將25賦給AX,12賦給BX,分別爲19H、0CH。寄存器窗口最下一行FL表示標誌寄存器,此圖表示運行CMP指令後,僅AF爲1,其餘位爲0
發現跳轉到了AX>BX的情況.正確。
然後我們修改代碼,令AX爲2進行測試,發現CF、PF、AF、SF均爲1
程序跳轉到了AX<BX的情況
我們再令AX等於12,進行測試,發現PF、ZF均爲1
程序依然跳轉到AX>BX的情況下,這是因爲CF=0.故該程序出現邏輯錯誤。應當將JE語句放置於JNC語句之前。
六. 實驗結果和體會
實驗結果見上方。我們發現當輸入相等時,該程序會出現判斷失誤。這是由於AX大於或等於BX時,CF均爲0.應當先判斷AX是否等於BX。
所以彙編語言在分支程序下極容易出現這種邏輯錯誤,需要我們仔細檢查,並使用不同數據進行測試
七. 擴展題目程序和實驗結果
;使用五個輸入測試SGN函數,實驗程序的不同分支
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX;設置段寄存器
MOV CX,5 ;5個輸入對應5個循環
MOV SI,OFFSET NUM;SI作爲下標
LOP:
MOV AL,0;AL置0被用於比較。注意由於輸入數據是BYTE,因此以下寄存器用低位即可
MOV DL,[SI];取出當前輸入進DL
CMP DL,AL;將DL與0比較
JG MO_T ;DX > 0 跳轉。JG、JL可判斷有符號數據
JE EQUA ;DX = 0 跳轉
JL LESS ;DX < 0 跳轉
MO_T: MOV BYTE PTR[SI+5],1;將結果存入空白內存
JMP IF_END;跳轉到IF語句的結束
EQUA: MOV BYTE PTR [SI+5],0
JMP IF_END
LESS: MOV BYTE PTR [SI+5],-1
JMP IF_END
IF_END:
INC SI;下標自增
LOOP LOP;循環
CODE ENDS
DATA SEGMENT
NUM DB 24H,13H,00H,0FFH,0ABH ;
SGNX DB 5 DUP(?);用於存儲輸出結果
DATA ENDS
END START
輸出結果爲1、1、0、-1、-1.結果正確。
整個程序運行到最後,可以看到DX的低字節保存着最後一個輸入ABH。CX=0表示結束循環。SI在結束循環前又自增一次故爲5H,但只有它等於0到4時是被作爲下標使用的。
確。