天天看點

5 控制轉移指令【微機原理】

控制轉移指令

  • ​​控制轉移指令​​
  • ​​例​​
  • ​​例4.17​​
  • ​​例4.18​​

控制轉移指令

5 控制轉移指令【微機原理】
5 控制轉移指令【微機原理】

例4.17

在記憶體的資料段中存放了若幹個8位帶符号數,資料塊的長度為COUNT(不超過255),首位址為TABLE,試統計其中正數、負數及零的個數,并分别将統計結果在

PLUS. MINUS和ZERO單元。

為了統計正數、負數和零的個數,可先将PLUS、MINUS和ZERO三個單元清零,然後将數報表中的帶符号數逐個取入AL寄存器并使其影響狀态标志位,再利用前而介紹的 JS、JZ 等條件轉稱指令測試該數是一個負數、零還是正數,然後分别在相應的單元中進行計數。程式如下:

li417.asm

data segment
  TABLE db 1,2,3,4,5,6,7,8,9    ;9
     db -1,-2,-3,-4,-5,-6,-7,-8,-9  ;9
     db 0,0,0,0,0,0,0,0,0,0,0   ;11
  COUNT equ $-TABLE

  org 0040H
  PLUS    db ?
  MINUS db ?
  ZERO   db ?
data ends
code segment
  assume cs:code,ds:data
start:
  mov ax,data
  mov ds,ax
  XOR AL,AL     ;(AL)<-0
  MOV PLUS,AL     ;清PLUS單元
  MOV MINUS,AL    ;清MINUS單元
  MOV ZERO,AL     ;清ZERO單元
  LEA SI,TABLE      ;(SI)-資料表首址
  MOV CX,COUNT    ;(CX)-資料表長度
  CLD       ;清控制标志位DF
  CHECK:LODSB   ;取一個資料到AL
    OR  AL,AL   ;使資料影響狀态标志位
    JS  X1    ;如為負,轉X1
    JZ  X2    ;如果為負,轉X2
    INC PLUS    ;否則為正,PLUS單元加1
    JMP NEXT
  X1:
    INC MINUS ;MINUS單元加1
    JMP NEXT
  X2:
    INC ZERO    ;ZERO單元加1
  NEXT:LOOP CHECK ;CX減1,如不為零,則轉CHECK

  mov ah,4ch
  int 21h

code ends
  end start      

運作結果

5 控制轉移指令【微機原理】

以上程式中的LOOP CHECK指令是一條循環控制指令,它的操作是将CX寄存器的内 容減1,如結果不等于零,則轉移到短标号CHECK。随後将讨論這條指令。

例4.18

在以DATA1為首址的記憶體資料段中,存放了200個16位帶符号數,試将其中最大和最小的帶符号數找出來,分别存放到以MAX和MIN為首的記憶體單元中。

為了尋找最大和最小的元素,可先取出資料塊中的一個資料作為标準,暫且将它同時存放到MAX和MIN單元中,然後将資料塊中的其他資料逐個分别與MAX和MIN中的數 相比較,凡大于MAX者,取代原來MAX中的内容,凡小于MIN者,取代原來MIN中的 内容,最後即可得到資料塊中最大和最小的帶符号數。

程式設計如下: 必須注意,比較帶符号數的大小時,應該采用JG和JL等條件轉移指令,根據要求可程式設計如下:

li418.asm

data segment
  DATA1 dw 1,2,3,4,5,6,7,8,9,32767    ;MAX=7FFF
      dw -1,-2,-3,-4,-5,-6,-7,-8,-9,-32768  ;MIN=8000

  COUNT equ ($-DATA1)/2

  org 0040H
  MAX dw ?
  MIN  dw ?
  
data ends
code segment
  assume cs:code,ds:data
start:
  mov ax,data
  mov ds,ax

  LEA  SI, DATA1  ;(SI)<-資料塊首址
  MOV CX,200  ;(CX)<-資料塊長度
  CLD   ;清方向标志DP
  LODSW ;取一個16位帶符号數到AX
  MOV MAX,AX  ;送MAX單元
  MOV MIN,AX  ;送MIN單元
  DEC CX    ;(CX)<-(CX)-1
  NEXT:
    LODSW ;取下一個16位帶符号數
    CMP AX,MAX  ;與MAX單元内容比較
    JG  GREATER ;大于MAX,則轉GREATER
    CMP AX,MIN  ;否則,與MIN單元内容比較
    JL  LESS    ;小于MIN,則轉LESS
    JMP GOON  ;否則,轉GOON
  GREATER: MOV  MAX,AX  ;(MAX)<-(AX)
    JMP GOON  ;轉 GOON
  LESS: MOV MIN,AX    ;(MIN)<-(AX)
  GOON: LOOP NEXT ;CX減1,若不等于零,轉NEXT


  mov ah,4ch
  int 21h

code ends
  end start