zoukankan      html  css  js  c++  java
  • (5)循环结构编程

    1、【例】  从字节变量X单元开始,连续存放有100个无符号数,从中找出最大者送入MAX字节单元中。 分析:可把第一个数先送到AL中,将AL中的数与后面的99个数逐个进行比较,如果AL中的数大于或等于与之相比较的数,则转下一个数进行比较;若AL中的数小于相比较的数,则把相比较的数送入AL中,保证AL中的数始终处于较大的数。比较99次之后最大数必定在AL中,最后把AL中的数送入MAX单元。本例的特点:循环次数已知,因此可以用计数器来控制循环的执行。程序编写如下: DATA       SEGMENT X               DB  106,135,101,210,┉; 共100个 MAX        DB  ? DATA      ENDS STAK      SEGMENT  STACK DW  20H DUP(?) STAK       ENDS CODE      SEGMENT ASSUME  CS:CODE,DS:DATA START: MOV  AX,DATA MOV  DS,AX LEA   BX,X MOV  AL,[BX] MOV  CX,99 LOP:       INC  BX CMP  AL,[BX] JAE  L1 MOV  AL,[BX] L1 :          LOOP   LOP MOV  MAX,AL MOV  AH,4CH INT  21H CODE   ENDS END  START 2、【例】  从自然数1开始累加,直到累加和大于等于1000为止,统计被累加的自然数个数存入字单元N中,累加和送入字单元SUM中。 分析:被累加的自然数个数事先是末知的,也就是说,循环的次数是末知的,因此不能用计数方法来控制循环。选择BX寄存器统计自然数的个数,而BX也是用来存放每次取得的自然数,用AX寄存器存放累加和,和≧1000是供判断的结束标志。源程序编写如下: DATA       SEGMENT N                 DW  ? SUM           DW  ? DATA        ENDS CODE        SEGMENT ASSUME CS:CODE,DS:DATA START:  MOV  AX,DATA MOV  DS,AX MOV  BX,0 MOV  AX,0        ;累加寄存器 LOP:       INC  BX ADD  AX,BX CMP  AX,1000     ;比较AX是否小于1000 JB    LOP         ;是则重复累加 MOV  N,BX        ;个数送N MOV  SUM,AX      ;累加结果送SUM MOV  AH,4CH INT  21H CODE  ENDS END  START 3、【例】  试编制一程序,求两个数组对应的数据之和,并把和数存入新数组SUM中。计算一直进行到两数之和为零或数组结束。将新数组的长度存于LEN单元中。编程如下: DATA   SEGMENT DA1         DB    2,6,0 ,3,-5,0,10,-1 DA2         DB    4,7,-2,0,10,3,-10,32 COUNT   EQU   $-DA2 LEN         DW    ? SUM        DB    20  DUP(?) DATA      ENDS STAK      SEGMENT  STACK DW  50H  DUP (?) STAK       ENDS CODE      SEGMENT ASSUME  CS: CODE,DS:DATA START: MOV  AX,DATA MOV  DS,AX MOV  BX,-1             ;初始化地址指针 MOV  CX,COUNT      ;取数组的数据个数 LOP:   INC   BX MOV  AL,DA1[BX] ADD  AL,DA2[BX]      ;对应数据求和 MOV  SUM[BX],AL    ;存和数 LOOPNZ  LOP             ;和不为0继续循环 INC  BX                        ;修改新数组长度 L1:         MOV  LEN,BX           ;存新数组长度 MOV  AH,4CH INT  21H CODE       ENDS END  START 4、【例】 已知字数组ARRAY,有50个元素,试编写程序,从中找出最大值,把结果放在MAX中。 程序一(找最大值): .  MODEL   SAMLL .  DATA ARRAY    DW    50   DUP(?) MAX         DW    ? .  CODE START:    MOV   AX,@DATA MOV   DS,AX LEA    SI, ARRAY MOV   CX,49 MOV   AX,[SI] ADD   SI,2 AGAIN:    CMP  AX,[SI] JG     NEXT MOV   AX,[SI] NEXT:     ADD   SI,2 LOOP  AGAIN MOV   MAX,AX MOV   AX,4C00H INT     21H END   START 5、【例】 已知字数组ARRAY,有N个元素,试编写程序,把数组中的正数累加,结果放在SUM中(不考虑溢出),并统计正数个数,保存到COUNT。 程序二(求和,统计): .  MODEL   SAMLL .  DATA ARRAY    DW    N   DUP(?) SUM         DW     0 COUNT    DW     0 .  CODE START:    MOV   AX,@DATA MOV   DS,AX LEA    SI, ARRAY MOV   CX,N AGAIN:    MOV   AX,[SI] CMP   AX,0 JLE    NEXT ADD   SUM,AX INC     COUNT NEXT:     ADD   SI,2 LOOP  AGAIN MOV   AX,4C00H INT     21H END   START 6、【例】 试编写程序,求级数12+22+32+? 的前n项和刚大于1000的项数n。并在屏幕上显示结果(用十六进制)。 (注:n是一个满足十六进制的各位数) code   segment assume  cs:code start:   mov  bl,1               ; mov  cx,0              ;cx清零,用于统计级数的和 again: mov  al,bl              ; mul   bl                     ;求平方,指令也可使用imul add   cx,ax             ;平方和 cmp   cx,1000        ;比较cx是否大于1000 jg     display              ;是,则转入显示处理 inc    bl                      ;不是,bl加1 jmp    short  again    ;重复执行 display:mov  dl,bl        ; cmp   dl,9        ; 比较是否大于9 jg     add37         ;是则转add37执行 add   dl,30h      ;不是,则加30h,把数符变成ASCII码 jmp    next add37:add   dl,37h next:   mov  ah,2              ;显示一个字符 int   21h mov   ah,4ch        ;返回dos int   21h code     ends end   start
  • 相关阅读:
    SpringBoot之集成slf4j日志框架
    Maven项目优势
    Idea操作技巧
    Nginx服务器之负载均衡策略(6种)
    Git操作规范
    Mybatis之Tk
    MyEclipse取消验证Js的两种方法
    文件异步上传,多文件上传插件uploadify
    EasyMock的使用
    jquery 中post 、get的同步问题,从外部获取返回数据
  • 原文地址:https://www.cnblogs.com/gxldan/p/4066671.html
Copyright © 2011-2022 走看看