已知在数据段DATA中,以BUF为首址的字存储区中存放着NUM(要求不少于20)个带符号数,试编写程序,将正数送到ARRAY为首址的存储区中,将负数送到TABLE为首址的存储区中,并分别统计正数和负数的个数,存放在COUNT(正)和NUMBER(负)单元中。并把正负数统计结果在屏幕上以十进制方式输出。
DATA SEGMENT ;数据段定义
STRING1 DB 'COUNT=','$'
STRING2 DB 0DH, 0AH, 'NUMBER=','$'
BUF DW 1,3,4,-1,-5,99,98,72,36,45,190,-900,-982,123,12,45,52,78,-10,-1
COUNT1 EQU ($-BUF)/2 ;注意是字,所以除以2
ARRAY DW 20 DUP('$')
TABLE DW 20 DUP('$')
COUNT DW 0
NUMBER DW 0
DATA ENDS
STACK SEGMENT STACK
DW 20 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV DX,DATA
MOV DS,DX
LEA SI,BUF
LEA DI,TABLE
LEA BX,ARRAY
MOV CX,COUNT1
LOP:
MOV AX,[SI]
SHL AX,1
JNC ARRAY1
MOV DX,[SI] ;小于0操作
MOV [DI],DX
ADD NUMBER,1
INC DI
INC DI
JMP NEXT
ARRAY1: ;大于0操作
MOV DX,[SI]
MOV [BX],DX
ADD COUNT,1
INC BX
INC BX
NEXT:
INC SI
INC SI
LOOP LOP
JMP STOP
STOP:
LEA DX, STRING1 ;输出"COUNT= "字符
MOV AH, 09H
INT 21H
MOV AX, COUNT
CALL CONVERT ;调用
LEA DX, STRING2 ;输出"NUMBER= "字符
MOV AH, 09H
INT 21H
MOV AX, NUMBER
CALL CONVERT
MOV AH,4CH
INT 21H
;十进制输出程序
CONVERT PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX, 10
MOV CX, 0
LOP1:
MOV DX, 0 ; 压栈
DIV BX
PUSH DX
INC CX
CMP AX, 0
JZ LOP2
JMP LOP1
LOP2:
POP DX ;出栈
ADD DL, 30H
MOV AH, 02H
INT 21H
LOOP LOP2
POP AX
POP BX
POP CX
POP DX
RET
CONVERT ENDP
CODE ENDS
END START
用的软件是emu8086