天天看点

汇编语言:按数值正负分类统计数组元素题目要求编程平台代码实现

汇编语言:按数值正负分类统计数组元素

  • 题目要求
      • 运行截图
  • 编程平台
  • 代码实现

题目要求

自定义一个包含有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
           

如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!

继续阅读