【微機原理】實驗三 分支程序實驗

一. 實驗要求

利用Proteus平臺,建立8086的分支程序的例子。

二. 實驗目的

  1. 熟悉實驗系統的編程和使用。
  2. 掌握使用轉移類指令編程及調試方法。
  3. 掌握各種標誌位的影響。

三. 實驗說明

由於本實驗是通過改變兩個變量CON_A和CON_B的大小,實現用CMP指令對不同標示位的影響的一個轉移,分別設有大於、等於、小於。

四. 實驗程序流程圖

Created with Raphaël 2.2.0將CON_A移入AX,CON_B移入BX使用CMP比較AX,BXCF爲0CON_A > CON_B,進行跳轉結束ZF爲1CON_A = CON_B,進行跳轉CF爲1CON_A < CON_B,進行跳轉yesnoyesnoyes

五. 實驗步驟

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時是被作爲下標使用的。

確。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章