关于汇编语言的问题,键盘输入十个数,统计正负数并分别输出正负数,算出

关于汇编语言的问题,键盘输入十个数,统计正负数并分别输出正负数,算出正数之和,并统计负数的个数.求完整程序

        CODE  SEGMENT
              ASSUME    CS:CODE
              ORG       100H
      START:
              PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES
              CALL      INPUTNUM
              CALL      PRINTLFCR
              CALL      PRINTLFCR
              
              MOV       CX,@NUM
              LEA       SI ,@ARRAY
     @MAIN1:
              MOV       AX,[SI]
              CMP       AX,0
              JLE       @MAIN2
              ADD       WORD PTR ZSSUM,AX
              INC       BYTE PTR ZSNUM
              CALL      DISPAXS
     @MAIN2:
              INC       SI
              INC       SI
              LOOP      @MAIN1
              
              CALL      PRINTLFCR

              MOV       CX,@NUM
              LEA       SI ,@ARRAY
     @MAIN3:
              MOV       AX,[SI]
              CMP       AX,0
              JGE       @MAIN4
              INC       BYTE PTR FSNUM
              CALL      DISPAXS
     @MAIN4:
              INC       SI
              INC       SI
              LOOP      @MAIN3

              CALL      PRINTLFCR

              MOV       AX,ZSSUM
              CALL      DISPAXS
              CALL      PRINTLFCR
              MOV       AL,FSNUM
              XOR       AH,AH
              CALL      DISPAXS
              
              MOV       AH,4CH
              INT       21H
              
       ZSNUM  DB        0
       ZSSUM  DW        0
       FSNUM  DB        0
; ==================================
   PRINTLFCR  PROC      NEAR
              PUSH      AX
              PUSH      DX
              MOV       AH,9
              LEA       DX,@LFCR
              INT       21H
              POP       DX
              POP       AX
              RET
       @LFCR  DB        13,10,'$'
   PRINTLFCR  ENDP

;===============================================
;  键盘输入数值数组子程序(数组名为array,元素个数存放在num中)
;  可以是负数 
    INPUTNUM  PROC      NEAR
              PUSH      AX
              PUSH      CX
              PUSH      SI
              PUSH      DI
              PUSHF
      ; 输入的数据以一个空格分隔,以回车符结束输入
              LEA       DI,@ARRAY   ;将数组第一个元素的有效地址置入DI
              MOV       WORD PTR @NUM,0
      @STIN:
              MOV       AX,0
              PUSH      AX
              MOV       BYTE PTR @SIGNN,0
    @AGAIN1:
              MOV       AH,1
              INT       21H
              MOV       BYTE PTR @CHAR,AL
              CMP       AL,13
              JE        @LINE0
              CMP       AL,' '
              JE        @LINE0
              CMP       AL,'-'
              JNE       @INPUT1
              MOV       BYTE PTR @SIGNN,1
              JMP       @AGAIN1
    @INPUT1:
              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
              CMP       BYTE PTR @SIGNN,1
              JNE       @INPUT2
              NEG       AX
    @INPUT2:
              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       DI
              POP       SI
              POP       CX
              POP       AX
              RET
      @ARRAY  DW        100 DUP(0)
        @NUM  DW        0
       @CHAR  DB        ?
      @SIGNN  DB        0
    INPUTNUM  ENDP
              
;=========================================
 ; 将要显示的有符号数置于 ax 中
     DISPAXS  PROC      NEAR
              PUSH      AX
              PUSH      BX
              PUSH      CX
              PUSH      DX
              PUSH      SI
              PUSH      DI
              PUSH      BP
              PUSH      DS
              PUSH      ES
              PUSHF
              PUSH      CS
              POP       DS
              PUSH      CS
              POP       ES
              MOV       CX,6
              LEA       DI,DISPAXSS
   @DISPAXS:
              MOV       BYTE PTR [DI],32
              INC       DI
              LOOP      @DISPAXS
              PUSH      AX
              MOV       DL,32
              MOV       AH,2
              INT       21H
              POP       AX
              MOV       BYTE PTR NZS,0
              MOV       BYTE PTR SIGNS,0
              CMP       AX,0
              JGE       @DISPAXS0
              MOV       BYTE PTR SIGNS,1
              NEG       AX
  @DISPAXS0:
              PUSH      AX
              LEA       SI,DIVARRS
              LEA       DI,DISPAXSS
              INC       DI
              MOV       CX,5
  @DISPAXS1:
              POP       AX
              MOV       DX,0
              MOV       BX,[SI]
              DIV       BX
              PUSH      DX
              CMP       AL,0
              JNE       @DISPAXS2
              CMP       BYTE PTR NZS,1
              JE        @DISPAXS2
              CMP       CX,1
              JE        @DISPAXS2
              MOV       DL,20H
              JMP       @DISPAXS3
  @DISPAXS2:
              ADD       AL,30H
              MOV       DL,AL
              MOV       BYTE PTR NZS,1
  @DISPAXS3:
              MOV       BYTE PTR[DI],DL
              INC       SI
              INC       SI
              INC       DI
              LOOP      @DISPAXS1
              POP       DX

              CMP       BYTE PTR SIGNS,1
              JNE       @DISPAXS6
              LEA       SI,DISPAXSS
              ADD       SI,5
  @DISPAXS4:
              CMP       BYTE PTR [SI],32
              JE        @DISPAXS5
              DEC       SI
              JMP       @DISPAXS4
  @DISPAXS5:
              MOV       BYTE PTR [SI],'-'
  @DISPAXS6:
              LEA       DX,DISPAXSS
              MOV       AH,9
              INT       21H
              POPF
              POP       ES
              POP       DS
              POP       BP
              POP       DI
              POP       SI
              POP       DX
              POP       CX
              POP       BX
              POP       AX
              RET
     DIVARRS  DW        10000,1000,100,10,1
         NZS  DB        0
       SIGNS  DB        0
    DISPAXSS  DB        32,32,32,32,32,32,'$'
     DISPAXS  ENDP
;==================================  
        CODE  ENDS
              END       START

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-03-12
#include <stdio.h>
#include <ctype.h>

int main()
{
int digitnum = 0;
int alphanum = 0;
int spacenum = 0;
double totalnum = 0;
while(gc = getchar() != EOF)
{
if(isdigit(gc)) digitnum++;
else if(gc == ' ') spacenum++;
else if(isalpha(gc)) alphanum++;
totalnum++;
}
totalnum *= 0.01;
printf("Space: %lf%%, Digit: %lf%%, Alphabet: %lf%%", spacenum/totalnum, digitnum/totalnum, alphanum/totalnum);
return 0;
}
相似回答