急求注释!急!急!急!
此程序要达到的目的:(用汇编)编写一个程序,将一个包含有20个有符号数据的数组arrayM分成两个数组:正数数组arrayB和负数数组arrayC并分别把这两个数组中的数据显示出来.(是显示数据,不是个数)
希望大哥大姐,给添加注释, wolaixiazai仁兄曾给过注释,但因小弟太过愚笨,至今还有好多解
望大哥大姐给予注释,越详细越好!
DATA SEGMENT ;定义数据段
ARRAYM DB 2,-5,34,28,10,-9,-56,20,-25,-23,-46,-8,-14,-10,81,82,-97,30,-47,3
;定义20个元素的数组
ARRAYP DB 20 DUP(?) ;定义正数的存储单元
ARRAYN DB 20 DUP(?) ;定义负数的存储单元
PLUS DB ? ;记录正数个数
NEGATV DB ? ;记录负数个数
DATA ENDS ;数据段结尾
CODE SEGMENT ;定义代码段
ASSUME CS:CODE,DS:DATA ;规定CS,DS的内容
MAIN PROC FAR ;主程序
START: MOV AX,DATA ;程序从START开始,将DATA的值放到AX积存器中
MOV DS,AX ;将AX的值赋值给数据段中,即定位数据段
LEA SI,ARRAYM ;取ARRAYM 这个内存单元的值的地址放到SI中
LEA DI,ARRAYP
LEA BX,ARRAYN
MOV CX,20 ;设置循环次数
LOP1: MOV AX,0 ;把0传送到AX
MOV AL,[SI] ;把[SI]中的内容传送到AL
TEST AL,80H ;判断数的正负
JZ LOP2 ;元素为正数则跳出
MOV [BX],AL ;否则为负数则存入负数数组
INC NEGATV ;负数计数
INC BX ;修改原数组地址
JMP AGAIN0 ;无条件转入AGAIN0
LOP2: MOV [DI],AL ;将正数存入正数数组
INC PLUS ;正数计数
INC DI ;修改数组地址
AGAIN0: INC SI ;修改原数组地址
LOOP LOP1 ; 循环LOP1段,执行一次,CX减1,直到CX为0,循环停止
MOV CL,PLUS
CMP CL,0 ;与0比较
JE LP1 ;数组个数为0则跳转
MOV BX,OFFSET ARRAYP ;输出正数组
AGAIN1: MOV DL,10
MOV AL,[BX] ;把[BX]中的内容传送到AL
MOV AH,0 ;把0传送到AH,;将AH清零
DIV DL ;将ARRAYP中的数据除以10
CMP AL,0 ;与0比较
JE TO1 ;商为0则跳到TO1
MOV DH,AH ;商不为0则说明有两位数,先输出十位,再输出个位
ADD AL,30H ;把AL内数据加30H,并存入al;不为零则将数字转换成字符 ;转换成16进制表示
MOV DL,AL
MOV AH,2
INT 21H ;输出商
ADD DH,30H ;把DH内数据加30H,并存入DH
MOV DL,DH
MOV AH,2
INT 21H
MOV DL,','
MOV AH,2
INT 21H
JMP TO2
TO1: ADD AH,30H ;跳到这里说明要输出的是一位数,故从除得的余数AH中输出
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 ARRAYN
AGAIN2: MOV DL,'-'
MOV AH,2
INT 21H
MOV DL,10
MOV AL,[BX] ;在数据段中定义数组是用的是DB,故在此赋值给8位的AL,但是作除法时要用AX除,所以在下一句中给高8位0FFH,即把所有位置1,因为负数是求补码存储的
MOV AH,0FFH ;最高位为1转移到此执行:设置AH=FFH
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 ;这两句是调用21H中断的4C功能。返回DOS操作系统!!
ENTER PROC NEAR ;显示回车换行子程序
MOV DL,13
MOV AH,2
INT 21H
MOV DL,10
MOV AH,2
INT 21H
RET ;返回 DOS
ENTER ENDP ;子程序结尾
MAIN ENDP ;主程序结束
CODE ENDS ;代码段结尾
END START ;结束汇编