汇编程序,没事多看看

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
原文地址:https://www.cnblogs.com/gxldan/p/4066680.html