已知在数据段DATA中,以BUF为首址的字存储区中存放着NUM(要求不少于20)个带符号数,试编写程序,将正数送到ARRAY为首址的存储区中,将负数送到TABLE为首址的存储区中,并分别统计正数和负数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/csbn123456789/article/details/95364976

. 已知在数据段DATA中,以BUF为首址的字存储区中存放着NUM(要求不少于20)个带符号数,试编写程序,将正数送到ARRAY为首址的存储区中,将负数送到TABLE为首址的存储区中,并分别统计正数和负数的个数,存放在COUNT(正)和NUMBER(负)单元中。并把正负数统计结果在屏幕上以十进制方式输出。

DATA   SEGMENT  
    
MSG1   DB  'COUNT=','$'

MSG2    DB   0DH, 0AH, 'NUMBER=','$'

BUF    DW  -90,-20,-89,0,-1,8,0,4,8,45,11,-34,56,78,-90,23,89,-5,-7,8,9,0,7,7,6  

ARRAY  DW  30 DUP(0)

TABLE  DW  30 DUP(0)

COUNT  DW  0

NUMBER DW  0

NUM    EQU  25
            
DATA   ENDS 

STACK  SEGMENT   STACK
       
       DW  20  DUP(?)
   
STACK  ENDS
 
CODE   SEGMENT
       
       ASSUME  CS:CODE, DS:DATA
       
START: MOV  AX, DATA
       
       MOV  DS, AX
       
       LEA  BX, BUF
       
       LEA  SI, ARRAY
       
       LEA  DI, TABLE
       
       MOV  CX, NUM
       
       MOV  AX, [BX]
       
L1:    CMP  AX, 0
       
       JGE  L2        ;>=0,跳转到L2             
       
       MOV  [DI], AX   ;<0,将数存入TABLE
       
       ADD  NUMBER, 1  
                         
       ADD  DI, 2
       
       JMP  L3         

L2:    MOV  [SI], AX    ;正数,将数存入ARRAY
       
       ADD  COUNT, 1    ;计数
       
       ADD  SI, 2
       
       JMP  L3      
       
L3:    ADD  BX, 2          ; 加2,读取下一个数
      
       MOV  AX, [BX]
       
       LOOP L1             ;CX不为0,继续循环
       
       JMP NEXT            ;否则退出循环



NEXT: LEA  DX, MSG1        ;输出"count= "字符
      
      MOV  AH, 09H
      
      INT  21H 
      
      MOV  AX, COUNT       
      
      CALL CONVERT       ;调用子程序将数以十进制输出
      
      LEA  DX, MSG2       ;输出"NUMBER= "字符
      
      MOV  AH, 09H
      
      INT  21H
      
      MOV  AX, NUMBER    
      
      CALL CONVERT
      
      JMP  EXIT

EXIT: MOV  AX, 4CH
      
      INT  21H 
      
CONVERT PROC NEAR
    
    PUSH  AX      ;保护现场
    
    PUSH  BX 
    
    PUSH  CX
   
    PUSH  DX 
    
    MOV   BX, 10   
    
    MOV   CX, 0  ;清理计入栈个数

L9: MOV  DX, 0    ; 入栈
      
      DIV  BX      ; 除以10
    
      PUSH DX      ;将余数压栈
      
      INC  CX      
    
      CMP   AX, 0   
       
      JZ    L10      ;  当商不为0时,开始出栈
      
      JMP   L9      ;当商不为0时,进行循环
      
L10:  POP   DX     ;出栈

      ADD   DL, 30H    ;将余数加30H,将数以十进制输出
      
      MOV   AH, 02H    
      
      INT   21H
      
      LOOP  L10
      
      POP  AX          ;恢复现场
      
      POP  BX
      
      POP  CX
      
      POP  DX
     
      RET
    
CONVERT ENDP      

CODE  ENDS
     
      END    START
 


猜你喜欢

转载自blog.csdn.net/csbn123456789/article/details/95364976
今日推荐