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

目录

一、顺序程序设计

二、分支程序设计

三、循环程序设计


一、顺序程序设计

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

例题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均为字节变量,请编制一个完整的程序计算下面的函数值。

DATA    SEGMENT
    X    DB    6
    Y    DB    ?
DATA    ENDS

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

ZERO:MOV    BL,0;如果x等于0就会跳转到这里来,然后给BL赋值为0(x=0)
     JMP    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    DB,6,11,-3,19,2,8,-5,7,16
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    BX    ;BX+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

 

  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄爱吃辣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值