假设数据段从BUF单元开始,存有20个字节的有符号数。请编写一个完整源程序实现: (1)将其中的非负数送数据段PLUS开始的若干单元。 (2)统计非负数的个数,并以十六进制的形式显示在屏幕上,显示格式为: NUM=XXH。
时间: 2023-06-19 14:05:02 浏览: 259
下面是一个完整的源程序,实现了题目要求的功能:
```assembly
ORG 0x100
BUF DB -3, 15, 7, -11, 0, 9, -5, 13, -2, -1, 4, -8, -6, 12, -10, -12, 1, -4, 2, -7
PLUS DB 20 DUP(0)
COUNT DB 0
START:
MOV SI, 0 ; SI指向BUF
MOV BX, OFFSET PLUS ; BX指向PLUS
MOV CL, 0 ; 计数器清零
LOOP:
MOV AL, [SI] ; 取一个字节
CMP AL, 0 ; 判断是否非负数
JGE POSITIVE ; 如果是非负数,跳转到POSITIVE
JMP NEXT ; 如果是负数,跳转到NEXT
POSITIVE:
MOV [BX], AL ; 将字节存入PLUS
INC BX ; BX指向下一个位置
INC CL ; 计数器加1
NEXT:
INC SI ; SI指向下一个字节
DEC CX ; 循环计数器减1
JNZ LOOP ; 如果循环计数器不为0,继续循环
MOV COUNT, CL ; 将计数器的值存入COUNT
CALL DISPLAY_COUNT ; 调用子程序显示计数器的值
MOV AH, 4CH ; 程序结束
INT 21H
DISPLAY_COUNT:
MOV AH, 2 ; 选择显示功能
MOV DL, 'N' ; 显示字符'N'
INT 21H
MOV DL, 'U' ; 显示字符'U'
INT 21H
MOV DL, 'M' ; 显示字符'M'
INT 21H
MOV DL, '=' ; 显示字符'='
INT 21H
MOV DL, '0' ; 显示字符'0'
ADD COUNT, DL ; 将计数器的值转换为ASCII码
MOV AH, 2 ; 选择显示功能
MOV DL, COUNT ; 显示计数器的值
INT 21H
MOV DL, 'H' ; 显示字符'H'
INT 21H
MOV DL, 0DH ; 显示换行符
INT 21H
MOV DL, 0AH
INT 21H
RET
```
阅读全文