汇编语言编程问题 求解,谢谢啦!

2025-05-23 06:00:38
推荐回答(1个)
回答(1):

        CODE  SEGMENT
              ASSUME    CS:CODE
              ORG       100H
      START:  PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES

              CALL      INPUTNUM
              CALL      CALC
              CALL      WRITELN
              MOV       CX,4
              LEA       SI,RESULT
     @MAIN0:  MOV       AL,[SI]
              MOV       AH,0
              CALL      DISPAX
              CALL      WRITELN
              INC       SI
              LOOP      @MAIN0
              
              MOV       AH,4CH
              INT       21H

           A  DB        90
           B  DB        75
           C  DB        60
           D  DB        0
           N  DB        0
      RESULT  DB        0,0,0,0

 ;===========================================
     WRITELN  PROC      NRAR
              PUSH      AX
              PUSH      DX
              PUSHF
              LEA       DX,LFCR
              MOV       AH,9
              INT       21H
              POPF
              POP       DX
              POP       AX
              RET
        LFCR  DB        10,13,'$'
     WRITELN  ENDP
 ;===============================================
;  键盘输入数值数组子程序(数组名为array,元素个数存放在num中)
    INPUTNUM  PROC      NEAR
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSH      SI
              PUSH      DI
              PUSH      BP
              PUSHF
    ; 输入的数据以一个空格分隔,以回车符结束输入
              LEA       DI,ARRAY    ;将数组第一个元素的有效地址置入DI
              MOV       WORD PTR[NUM],0
       STIN:
              MOV       AX,0
              PUSH      AX
     AGAIN1:
              MOV       AH,1
              INT       21H
              MOV       BYTE PTR[CHAR],AL
              CMP       AL,13
              JE        LINE0
              CMP       AL,' '
              JE        LINE0
              SUB       AL,30H
              MOV       AH,0
              MOV       SI,AX
              POP       AX
              MOV       CL,10
              MOV       CH,0
              MUL       CX
              ADD       AX,SI
              PUSH      AX
              JMP       AGAIN1
      LINE0:
              POP       AX
              MOV       WORD PTR[DI],AX
              INC       WORD PTR[NUM]
              CMP       BYTE PTR[CHAR],13
              JE        STINEND
              INC       DI
              INC       DI
              JMP       STIN
    STINEND:
              POPF
              POP       BP
              POP       DI
              POP       SI
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
       ARRAY  DW        200 DUP(0)
         NUM  DW        0
        CHAR  DB        ?
    INPUTNUM  ENDP
              
;===============================================
        CALC  PROC      NEAR
              PUSH      AX
              PUSH      CX
              PUSH      SI
              PUSHF
              MOV       BYTE PTR RESULT,0
              MOV       BYTE PTR RESULT+1,0
              MOV       BYTE PTR RESULT+2,0
              MOV       BYTE PTR RESULT+3,0
              MOV       CX,NUM
              LEA       SI,ARRAY
     @CALC0:
              MOV       AX,[SI]
              CMP       AL,A
              JL        @CALC1
              INC       BYTE PTR RESULT
              JMP       @CALC4
     @CALC1:  CMP       AL,B
              JL        @CALC2
              INC       BYTE PTR RESULT+1
              JMP       @CALC4
     @CALC2:  CMP       AL,C
              JL        @CALC3
              INC       BYTE PTR RESULT+2
              JMP       @CALC4
     @CALC3:  INC       BYTE PTR RESULT+3
     @CALC4:  INC       SI
              INC       SI
              LOOP      @CALC0
              POPF
              POP       SI
              POP       CX
              POP       AX
              RET
        CALC  ENDP
; ================================================
 ; 将要显示的无符号数置于 ax 中 
      DISPAX  PROC      NEAR
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSH      SI
              PUSH      DI
              PUSH      BP
              PUSHF
              PUSH      DS
              PUSH      CS
              POP       DS
              MOV       BYTE PTR NZ,0
              PUSH      AX
              LEA       SI,DIVARR
              MOV       CX,5
         @1:
              POP       AX
              MOV       DX,0
              MOV       BX,[SI]
              DIV       BX
              PUSH      DX
              CMP       AL,0
              JNE       @2
              CMP       BYTE PTR NZ,1
              JE        @2
              CMP       CX,1
              JE        @2
              MOV       DL,20H
              JMP       @3
         @2:
              ADD       AL,30H
              MOV       DL,AL
              MOV       BYTE PTR NZ,1
         @3:
              MOV       AH,2
              INT       21H
              INC       SI
              INC       SI
              LOOP      @1
              POP       DX
              POP       DS
              POPF
              POP       BP
              POP       DI
              POP       SI
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
      DIVARR  DW        10000,1000,100,10,1
          NZ  DB        0
      DISPAX  ENDP
;==============================================             
        CODE  ENDS
              END       START