假设数据段从BUF单元开始,存有20个字节的ASCII码。请编写一个程序实现:统计ASCII码值小于等于39H的字符个数,并存放在数据段COUNT单元;找出ASCII码值最小的字符,并将其ASCII码值以十六进制的形式显示在屏幕上显示格式为:MIN=XXH
时间: 2023-06-26 15:03:24 浏览: 260
汇编试验 (1)将 BUF开始的 10 个单元中的二进制数转换成两位十六进制数的 ASCII 码,在屏幕上显示出来。要求码型转换通过子程序 HEXAC实现,在转换过程中,通过子程序 DISP实现显示. (2)编程实现从键盘接受一个字符串,再从键盘接受一查找的字符(例如’g’) ,找到时提示’Yes,found !’,找不到时提示’No found !’ 。
4星 · 用户满意度95%
以下是汇编语言的程序实现,假设BUF单元的地址为0x1000,COUNT单元的地址为0x1100:
```assembly
ORG 0x1000
BUF DB 'This is a test string.', 0
COUNT DB 0
MOV SI, 0x1000 ; 将SI寄存器初始化为BUF单元的地址
MOV CL, 20 ; 循环20次,每次读取一个字节
MOV CH, 0 ; 清空CH寄存器
MOV DL, [SI] ; 读取一个字节到DL寄存器
CMP DL, 39H ; 将DL寄存器的值与39H进行比较
JBE COUNT_INC ; 如果小于等于39H,就跳转到COUNT_INC标签
NEXT_BYTE:
INC SI ; 指向下一个字节
LOOP NEXT_BYTE ; 循环20次
COUNT_INC:
INC CH ; 统计字符个数
JMP NEXT_BYTE ; 跳转到下一个字节
ORG 0x2000
START:
MOV SI, 0x1000 ; 将SI寄存器初始化为BUF单元的地址
MOV CL, 20 ; 循环20次,每次读取一个字节
MOV AL, 0FFH ; 将AL寄存器初始化为最大值
MOV DL, [SI] ; 读取一个字节到DL寄存器
CMP DL, AL ; 将DL寄存器的值与AL进行比较
JBE UPDATE_MIN ; 如果DL小于等于AL,就跳转到UPDATE_MIN标签
NEXT_BYTE_2:
INC SI ; 指向下一个字节
LOOP NEXT_BYTE_2 ; 循环20次
UPDATE_MIN:
MOV AL, DL ; 更新AL为最小值
JMP NEXT_BYTE_2 ; 跳转到下一个字节
ORG 0x3000
MOV AH, 0EH ; 设置光标移动功能号
MOV BH, 0 ; 设置显示页号为0
MOV BL, 7 ; 设置显示属性为白底灰字
MOV DL, 'M' ; 在屏幕上显示"M="
INT 10H ; 调用BIOS中断显示"M"
MOV DL, 'I' ; 在屏幕上显示"I"
INT 10H ; 调用BIOS中断显示"I"
MOV DL, 'N' ; 在屏幕上显示"N"
INT 10H ; 调用BIOS中断显示"N"
MOV DL, '=' ; 在屏幕上显示"="
INT 10H ; 调用BIOS中断显示"="
MOV DL, AL ; 将最小值AL的ASCII码值传递给DL寄存器
ADD DL, 30H ; 将DL寄存器的值转换为十六进制字符
CMP DL, 3AH ; 如果DL寄存器的值大于等于3AH,就加上7H
ADC DL, 0 ; 如果需要进位,就将进位加到DL寄存器的值中
MOV AH, 02H ; 设置字符输出功能号
INT 21H ; 调用DOS中断显示最小值的ASCII码值
RET ; 程序结束
```
上面的程序首先遍历BUF单元中的20个字节,统计ASCII码值小于等于39H的字符个数,并将结果存放在COUNT单元中。然后,程序再次遍历BUF单元中的20个字节,找出ASCII码值最小的字符,并将其ASCII码值以十六进制的形式显示在屏幕上。
阅读全文