版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
. 已知在数据段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