急救!急救!急救!!!
(用汇编)编写一个程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:正数数组arrayB和负数数组arrayC并分别把这两个数组中的数据显示出来.(是显示数据,不是个数)下面的代码好象有点乱,请各位大哥大姐费心了
谢谢!
DATA SEGMENT
MA DW 2,-5,34,28,10,-9,-56,20,-25,-23,-46,-8,-14,-10,81,82,-97,30,-47,3 ;定义源数组各个元素
MB DW 20 DUP(?) ;定义正数的存储单元
MC DW 20 DUP(?) ;定义负数的存储单元
PLUS DW ? ;记录正数个数
NEGATV DW ? ;记录负数个数
COUNT = ($-MB)/2
WTEMP DW ?
DATA ENDS
STAK SEGMENT PARA STACK 'STACK'
SPP DB 100 DUP(?) ;定义堆栈空间
TOP DB ?
STAK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STAK
START: MOV AX,DATA
MOV DS,AX ;设置数据段寄存器
MOV AX,STAK ;设置堆栈段寄存器
MOV SS,AX
LEA SP,TOP ;设置堆栈指针
LEA SI,MA
LEA DI,MB
LEA BX,MC
MOV CX,20 ;设置循环次数
LOP1: MOV AX,0
MOV AL,[SI]
CMP AL,0
JNL LOP2 ;元素为正数则跳出
MOV [BX],AL ;否则为负数则存入负数数组
INC NEGATV ;负数计数
INC BX ;修改数组地址
JMP AGAIN0
LOP2: MOV [DI],AL ;将正数存入正数数组
INC PLUS ;正数计数
INC DI ;修改数组地址
AGAIN0: INC SI ;修改原数组地址
LOOP LOP1
;MOV AH,4CH ;返回DOS系统
;INT 21H
MOV CX,COUNT
MOV BX,OFFSET MB
AGAIN1: MOV AX,[BX]
MOV WTEMP,AX
CALL WRITE
INC BX
INC BX
CALL DPCRLF
LOOP AGAIN1
.EXIT 0
;
WRITE PROC
PUSH AX
PUSH BX
PUSH DX
MOV AX,WTEMP
TEST AX,AX
JNZ WRITE1
MOV DL,'0'
MOV AH,2
INT 21H
JMP WRITE5
WRITE1: JNS WRITE2
MOV BX,AX
MOV DL,'-'
MOV AH,2
INT 21H
MOV AX,BX
NEG AX
WRITE2: MOV BX,10
PUSH BX
WRITE3: CMP AX,0
JZ WRITE4
SUB DX,DX
DIV BX
ADD DL,30H
PUSH DX
JMP WRITE3
WRITE4: POP DX
CMP DL,10
JE WRITE5
MOV AH,2
INT 21H
JMP WRITE4
WRITE5: POP DX
POP BX
POP AX
RET
WRITE ENDP
DPCRLF PROC
PUSH AX
PUSH DX
MOV AH,2
MOV DL,0DH
INT 21H
MOV AH,2
MOV DL,0AH
INT 21H
POP DX
POP AX
RET
DPCRLF ENDP
CODE ENDS
END START