请你提供汇编语言代码实现:在存储器中有一个首地址为ARRAY的N字数组,要求测试其中正数、0及负数的个数。正数的个数放在DI中,0的个数放在SI中,把正数,负数,0的个数输出
时间: 2024-03-03 17:49:50 浏览: 134
好的,以下是汇编语言代码实现:
```
DATA SEGMENT
ARRAY DB 5,-3,0,2,0,-1,-4,6,0,8,-2,0
N DB 12
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
MOV CX, N
MOV DI, 0 ; 计数器:正数的个数
MOV SI, 0 ; 计数器:0的个数
LOOP1:
MOV AL, [ARRAY+CX-1] ; 取出数组中的一个元素
CMP AL, 0 ; 判断是否为0
JE IS_ZERO
JG IS_POSITIVE
JMP IS_NEGATIVE
IS_POSITIVE:
INC DI ; 正数计数器加一
JMP CONTINUE
IS_ZERO:
INC SI ; 0计数器加一
JMP CONTINUE
IS_NEGATIVE:
JMP CONTINUE
CONTINUE:
LOOP LOOP1
; 输出结果
MOV AH, 09H ; 选择DOS功能号9,输出字符串
MOV DX, OFFSET MSG_POS ; 输出正数个数的信息
INT 21H ; 调用DOS中断
MOV AH, 02H ; 选择DOS功能号2,输出数字
MOV DL, DI ; 把正数个数放入DL
ADD DL, 30H ; 转换为字符
INT 21H ; 调用DOS中断
MOV AH, 09H ; 选择DOS功能号9,输出字符串
MOV DX, OFFSET MSG_NEG ; 输出负数个数的信息
INT 21H ; 调用DOS中断
MOV AH, 02H ; 选择DOS功能号2,输出数字
MOV DL, N ; 数组元素个数
SUB DL, DI ; 减去正数个数,得到负数个数
ADD DL, 30H ; 转换为字符
INT 21H ; 调用DOS中断
MOV AH, 09H ; 选择DOS功能号9,输出字符串
MOV DX, OFFSET MSG_ZERO ; 输出0的个数的信息
INT 21H ; 调用DOS中断
MOV AH, 02H ; 选择DOS功能号2,输出数字
MOV DL, SI ; 把0的个数放入DL
ADD DL, 30H ; 转换为字符
INT 21H ; 调用DOS中断
MOV AH, 4CH ; 选择DOS功能号4CH,程序结束
INT 21H ; 调用DOS中断
MSG_POS DB '正数个数为:$'
MSG_NEG DB 0DH, 0AH, '负数个数为:$'
MSG_ZERO DB 0DH, 0AH, '0的个数为:$'
CODE ENDS
END START
```
该程序通过循环遍历数组中的每一个元素,判断其是否为正数、0或负数,然后分别累加计数器。最后输出计数器的值即可。注意,为了方便输出,我们将数字转换为字符后输出。
阅读全文