汇编语言:按数值正负分类统计数组元素
- 题目要求
-
-
- 运行截图
-
- 编程平台
- 代码实现
题目要求
自定义一个包含有20个数据的字数组M,输出M的内容,并将其分成两个数组:正数数组P和负数数组N,最后分别把这两个数组中的元素个数显示出来。
运行截图
编程平台
Masm for Windows 集成实验环境 2012.5
代码实现
DATAS SEGMENT
M DW -1,9,12,-18,20,-27,-31,49,54,67,-73,82,-91,102,111,-129,130,-146,158,-160
count DW $-M;记录数组长度
P DW 20,0,20 DUP(?)
N DW 20,0,20 DUP(?)
data DB 'Twenty data: $'
printP DB 13,10,'Numbers of P: $'
printN DB 13,10,'Numbers of N: $'
scale DW 10
DATAS ENDS
STACKS SEGMENT STACK
DB 200H DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
;主程序
MAIN PROC
MOV AX,DATAS
MOV DS,AX
LEA DX,data;数据展示提示
MOV AH,9H
INT 21H
;遍历数组元素,一边分组一边输出
LEA DI,M
MOV CX,count
SHR CX,1;数组是字类型,需要让CX除以2来获得实际的数据个数
l:
MOV AX,[DI]
CALL SUBP1;对AX中的数据进行正负数组分组
CALL SUBP2;输出AX中的数据
MOV DX,20H;输出空格
MOV AH,2H
INT 21H
ADD DI,2
LOOP l
LEA DX,printP;输出P数组数据个数提示
MOV AH,9H
INT 21H
LEA BX,P
ADD BX,2;BX指向存放数组长度的偏移地址
MOV AX,[BX]
CALL SUBP2;输出AX中的数据
LEA DX,printN;输出N数组数据个数提示
MOV AH,9H
INT 21H
LEA BX,N
ADD BX,2;BX指向存放数组长度的偏移地址
MOV AX,[BX]
CALL SUBP2;输出AX中的数据
MOV AH,4CH
INT 21H
MAIN ENDP
;子程序
;功能:对数据进行正负分组。
;入口参数:AX存放要分组的数据。
SUBP1 PROC
TEST AX,8000H;判断正负
JZ ipos;说明是正数
LEA BX,N;定位到负数数组N
JMP i
ipos:
LEA BX,P;定位到负数数组P
i:
ADD BX,2;BX指向存放数组长度的偏移地址
MOV DX,[BX];DX存放数组长度
INC DX
MOV [BX],DX;数组长度增加1
SHL DX,1;因为数组是字类型,故要让DX乘以2
ADD BX,DX;BX指向要写入的位置的偏移地址
MOV [BX],AX
RET
SUBP1 ENDP
;子程序
;功能:用scale进制形式输出正负数值。
;入口参数:AX存放要输出的数值,scale存放要转换的进制。
SUBP2 PROC
MOV BX,scale
TEST AX,8000H;判断正负
JZ pos;正数
PUSH AX;负数,先入栈保存数值
MOV DL,'-';输出'-'
MOV AH,2H
INT 21H
POP AX
NEG AX;求补指令,即得到负数的绝对值
pos:
MOV SI,0;记录要输出的位数
lop1:
MOV DX,0
DIV BX
PUSH DX;余数入栈
INC SI
CMP AX,0;也可以写成OR AX,AX
JNE lop1
lop2:
MOV AH,2
POP DX
ADD DL,30H;转换成对应的ASCII码
INT 21h
DEC SI
CMP SI,0
JNE lop2
RET
SUBP2 ENDP
CODES ENDS
END MAIN
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!