首先第一题,只知道你想实现相加,在不溢出的情况下,来个例子(近)吧:
ABSOLT PROC
ADD AX,BX
RET
ABSOLT ENDP
第二题也不难吧:
OUTPUT MACRO NUM ;这里建的宏用来输入0-99的十进制数,已经说过了,这里不解释啦
LOCAL NEXT1
MOV AX,NUM
AAM
MOV DX,AX
MOV AH,2
OR DX,3030H
XCHG DH,DL
CMP DL,30H
JZ NEXT1
INT 21H
NEXT1: XCHG DH,DL
INT 21H
ENDM
DSEG SEGMENT
ARRAY DW 1,2,-1,3,4,-2,-3,4,5,-6 ;楼主给的数据
P_ARY DW 10 DUP(?) ;因为正数个数不知道情况下,就以最大为界,开辟10个字
N_ARY DW 10 DUP(?) ;同上
NOTE0 DB 0AH,0DH,'P_ARY : $'
NOTE1 DB 0AH,0DH,'N_ARY : $'
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
MAIN: MOV AX,DSEG
MOV DS,AX
MOV BX,0 ;用于获取数据的地址
MOV SI,0 ;用于正数存放地址的偏移量,也起着计数的作用
MOV DI,0 ;用于负数存放地址的偏移量,也起着计数的作用
LOP: MOV AX,[BX]
TEST AX,8000H ;测试正负
JZ STO_P
MOV N_ARY[DI],AX ;存放并计数
INC DI
JMP NEXT0
STO_P: MOV P_ARY[SI],AX
INC SI
NEXT0: INC BX
INC BX
CMP BX,20 ;以字为单位的话,这里就与20比较
JNZ LOP
MOV AH,9
LEA DX,NOTE0
INT 21H
OUTPUT SI ;调用宏,输出正数个数
MOV AH,9
LEA DX,NOTE1
INT 21H
OUTPUT DI ;输出负数个数
MOV AX,4C00H
INT 21H
CSEG ENDS
END MAIN