微机原理——三种程序设计结构及例题

205 阅读3分钟

一、顺序程序设计

没有分支、循环等转移指令的程序,会按照指令书写的前后顺序进行执行。

例题1:执行下面的代码,求DX和ZF

DX=5678H。
MOV    CL,8;给CL传送8个字节
ROR    DX,CL;循环右移8位(CL=8),DX=7856H
AND    DX,0FFH;AND相与,取值都为1时,其值才是1,否则值都为0,7856H^00FFH=0056H,cf=of=0,zf=0
CMP    DX,56H;0056H-0056H=0,CMP不回送但影响标志位,ZF=1,cf=of=0

例题2:在屏幕上显示“hello.how are you!”

HDATA    SEGMENT    ;定义数据段开始(DS)
CHAR    DB    'hello.how are you!','$'    ;定义字符串,$为结束   
HDATA    ENDS    ;定义数据段结束(DS)

CODE    SEGMENT    ;定义代码段开始(CS)
    ASSUME    CS:CODE,DS:HDATA    ;定义每个段定义是为数据段还是代码段。
BEGIN:MOV    AX,HDATA    ;代码编写开头为数据段的传送
      MOV    DS,AX        ;代码编写开头为数据段的传送
      LEA    DX,CHAR     ;取CHAR有效地址给DX也就是:‘hello.how are you!’,'$'
      MOV    AH,09H    ;DOS功能调09号功能,该功能是在屏幕输出字符串
                         使用条件是:(1)入口参数需要DS和DX(2)必须用‘$’为结束(3)要用AH进行                                        
                         传送(4)要用INT 21H进行功能调用
      INT    21H    ;
      MOV    AH,4CH    ;结束
      INT    21H    ;
CODE    ENDS    ;定义代码段结束(CS)
        END    BEGIN    ;结束代码段的执行


二、分支程序设计

根据条件是真或假决定执行不执行,判断条件的指令如CMP、TEST。JCC类指令和JMP指令可以实现分支控制

例题1:首地址DAT的数据区中有3个互不相等的8位无符号整数,编写一个完整的程序,将这3个数的最大值存放到MAX单元。

HDATA    SEGMENT    ;定义数据段的开始
    NUMBER    DB    23H,32H,13H    ;在数据段定义三个互不相等的数
    MAX    DB    ?    ;定义MAX一开始为空
HDATA    ENDS    ;定义数据段的结束

CODE    SEGMENT    ;定义代码段的开始
    ASSUME    CS:CODE,DS:HDATA
BEGIN:MOV   AX,HDATA
      MOV   DS,AX
      MOV   AL,NUMBER    ;AL=23H
      MOV   BL,NUMBER+1  ;BL=32H
      MOV   CL,NUMBER+2  ;CL=13H
LOP1:CMP    AL,BL
     JA     LOP2    ;AL中的数据大于BL中的数据跳转到LOP2
     MOV    AL,BL   ;如果不大于就将BL的值给了AL。
LOP2:CMP    AL,CL
     JA     LOP3
     MOV    AL,CL
LOP3:MOV    MAX,AL
     MOV    AH,4CH
     INT    21H
CODE    ENDS    ;定义代码段的结束
        END    BEGIN

例题2:设输入数据为X、输出数据为Y、X和Y均为字节变量,请编制一个完整的程序计算下面的函数值。

1.png

DATA    SEGMENT
    X    DB    6
    Y    DBDATA    ENDS

CODE    SEGMENT
    ASSUME    CS:CODE    DS:DATA
BEGIN:MOV    AX,DATA
      MOV    DS,AX
      MOV    AL,X
      CMP    AL,0
      JZ     ZEROJZ判断结果为0时跳转到ZERO否则不跳转
      JS     NEGJS利用符号标志位SF,判断结果是正还是负,是负跳转到NEG
      MOV    BL1;如果X不是负且还不等于0就将1给了BL(x>0JMP    SAV;然后跳转到SAV

ZERO:MOV    BL0;如果x等于0就会跳转到这里来,然后给BL赋值为0(x=0JMP    SAV;然后跳转到SAV

NEG:MOV    BL,-1;如果x是负数就会跳转到这里来,然后给BL赋值为-1(x<0)
    JMP    SAV;然后跳转到SAV

SAV:MOV    Y,BL;将判断后BL的值给Y
    MOV    AH,4CH
    INT    21H
CODE    ENDS
        END BEGIN


三、循环程序设计

满足一定条件的情况下,重复执行某段程序;首先循环程序设计有3个组成部分(1)循环初始部分——为循环的开始准备必要的条件,如循环次数、循环体需要的数值等(2)循环体部分——也就是重复执行的代码,其中要包括对循环条件等的修改程序段(3)循环控制部分——判断循环条件是否成立,才决定是否循环;其次循环控制部分有两种结构分别是:先判断后循环以及先循环后判断两种结构;最后循环控制方法有计数控制循环和条件控制循环。

例题1:内存buf单元开始存放9个有符号字节数据,求最小值并存进min单元。

DATA    SEGMENT
    BUF    DB611-31928-5716
DATA    ENDS

CODE    SEGMENT
    ASSUME CS:CODE,DS:DATA
BEGIN:MOV AX,DATA
      MOV DS,AX
      LEA BUF
      MOV AL[BX]
      MOV CX,9    ;9个数9次循环
LOP:INC    BXBX+1也就是取后面的数
    CMP    AL,[BX]
    JLE    A    ;有符号数JLE,如果AL小于等于BX就跳转到A
    MOV    AL,[BX]
A:LOOP LOP    ;循环LOP
  MOV  MIN,AL
  MOV  AH,4CH
  INT  21H
CODE    ENDS
        END BEGIN