• 汇编程序,没事多看看


    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
  • 相关阅读:
    投产包错误的思考
    Oracle----用户操作
    3.27 学习记录
    3.26 学习记录
    3.25 学习记录
    3.24 学习记录
    3. 23构建之法读后感
    3.22 学习记录
    3. 21学习记录
    3.20 学习记录
  • 原文地址:https://www.cnblogs.com/gxldan/p/4066680.html
Copyright © 2020-2023  润新知