假设数据段从BUF单元开始,存有20个字节的有符号数。请编写一个完整源程序实现: (1)将其中的非负数送数据段PLUS开始的若干单元。 (2)统计非负数的个数,并以十六进制的形式显示在屏幕上,显示格式为: NUM=非负数个数H。
时间: 2023-06-19 17:05:13 浏览: 142
汇编在 BUF 和 BUF+1、BUF+2 单元分别放有一个有符号字节型数,编程序 将其中最小数存入 MIN 单元中。
下面是一个完整的源程序,可实现将数据中的非负数送到PLUS单元,并统计非负数的个数并以十六进制形式显示在屏幕上:
```
.MODEL SMALL
.STACK 100H
.DATA
BUF DB 7FH, 0F0H, 0FFH, 80H, 0ABH, 0CDH, 0EFH, 12H, 34H, 56H, 78H, 9AH, 0BDH, 0DEH, 0EFH, 0F1H, 23H, 45H, 67H, 89H
PLUS DB 20 DUP (?)
COUNT DB 0
.CODE
MOV AX, @DATA
MOV DS, AX ; 初始化数据段寄存器
MOV CX, 20 ; 数据段中共有20个字节的数据
MOV SI, 0 ; 从BUF单元开始
MOV BX, OFFSET PLUS ; PLUS单元起始地址
LOOP1:
CMP BYTE PTR BUF[SI], 0 ; 判断是否为非负数
JNL MOVE ; 如果是非负数,跳转到MOVE
INC SI ; 如果是负数,继续循环
LOOP LOOP1 ; 继续处理下一个字节
JMP FINISH ; 处理结束,跳转到FINISH
MOVE:
MOV AL, BUF[SI] ; 将非负数存入PLUS单元
MOV BYTE PTR [BX], AL
INC BX ; PLUS单元地址+1
INC COUNT ; 统计非负数个数
INC SI ; 数据段地址+1
LOOP LOOP1 ; 继续处理下一个字节
FINISH:
; 将非负数个数以十六进制形式显示在屏幕上
MOV AH, 09H ; 选择显示字符串的功能
MOV DX, OFFSET MSG ; 显示提示信息
INT 21H
MOV AH, 02H ; 选择显示一个字符的功能
MOV DL, ' '
INT 21H
MOV AH, 04H ; 选择显示一个数字的功能
MOV AL, COUNT ; 非负数个数
CALL HEX ; 将数字转换为十六进制
INT 21H
MOV AH, 4CH ; 退出程序
INT 21H
; 将数字转换为十六进制
HEX PROC
PUSH AX ; 保存寄存器状态
MOV AH, 00H ; AH=0
MOV BL, 0AH ; BL=10
DIV BL ; AL/BL,商在AH中,余数在AL中
CMP AH, 0 ; 判断商是否为0
JZ ENDHEX ; 如果为0,跳转到ENDHEX
CALL HEX ; 递归调用HEX
ENDHEX:
POP AX ; 恢复寄存器状态
CMP AL, 0AH ; 判断余数是否大于9
JL LESS ; 如果小于等于9,跳转到LESS
ADD AL, 07H ; 如果大于9,将余数加上7
LESS:
ADD AL, 30H ; 加上30H,得到ASCII码
MOV DL, AL ; DL=AL
MOV AH, 02H ; 选择显示一个字符的功能
INT 21H
RET ; 返回调用程序
HEX ENDP
MSG DB 'NUM=', 0
END
```
阅读全文