![]() |
#2
wolaixiazai2007-12-08 13:54
问题已经解决,代码已经按我自己的意思改了不少,楼主自己看吧
DATA SEGMENT MA DB 2,-5,34,28,10,-9,-56,20,-25,-23,-46,-8,-14,-10,81,82,-97,30,-47,3 ;定义20个元素的数组 MB DB 20 DUP(?) ;定义正数的存储单元 MC DB 20 DUP(?) ;定义负数的存储单元 PLUS DB ? ;记录正数个数 NEGATV DB ? ;记录负数个数 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR START: MOV AX,DATA MOV DS,AX ;设置数据段寄存器 LEA SI,MA LEA DI,MB LEA BX,MC MOV CX,20 ;设置循环次数 LOP1: MOV AX,0 MOV AL,[SI] TEST AL,80H JZ LOP2 ;元素为正数则跳出 MOV [BX],AL ;否则为负数则存入负数数组 INC NEGATV ;负数计数 INC BX ;修改数组地址 JMP AGAIN0 LOP2: MOV [DI],AL ;将正数存入正数数组 INC PLUS ;正数计数 INC DI ;修改数组地址 AGAIN0: INC SI ;修改原数组地址 LOOP LOP1 MOV CL,PLUS CMP CL,0 JE LP1 MOV BX,OFFSET MB ;输出正数组 AGAIN1: MOV DL,10 MOV AL,[BX] MOV AH,0 DIV DL CMP AL,0 JE TO1 ;商为0则跳到TO1 MOV DH,AH ADD AL,30H MOV DL,AL MOV AH,2 INT 21H ADD DH,30H MOV DL,DH MOV AH,2 INT 21H MOV DL,',' MOV AH,2 INT 21H JMP TO2 TO1: ADD AH,30H MOV DL,AH MOV AH,2 INT 21H MOV DL,',' MOV AH,2 INT 21H TO2: INC BX DEC CL JNE AGAIN1 CALL ENTER ;回车换行 LP1: MOV CL,NEGATV ;输出负数组 CMP CL,0 JE LP2 MOV BX,OFFSET MC AGAIN2: MOV DL,'-' MOV AH,2 INT 21H MOV DL,10 MOV AL,[BX] MOV AH,0FFH NOT AX ;负数转换为绝对值(的原码)就是"按位取反然后加一" ADD AX,1 DIV DL CMP AL,0 JE TO3 ;商为0则跳到TO3 MOV DH,AH ADD AL,30H MOV DL,AL MOV AH,2 INT 21H ADD DH,30H MOV DL,DH MOV AH,2 INT 21H MOV DL,',' MOV AH,2 INT 21H JMP TO4 TO3: ADD AH,30H MOV DL,AH MOV AH,2 INT 21H MOV DL,',' MOV AH,2 INT 21H TO4: INC BX DEC CL JNE AGAIN2 LP2: MOV AH,4CH INT 21H ENTER PROC NEAR MOV DL,13 MOV AH,2 INT 21H MOV DL,10 MOV AH,2 INT 21H RET ENTER ENDP MAIN ENDP CODE ENDS END START |
(用汇编)编写一个程序,将一个包含有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