楼主的程序有两个明显错误:
(1)第3行指令 MOV BH,00 使首行指令MOV BX,0100 作废,
使 BX = 0000,导致后面的指令MOV AL,[BX]读入AL的不是成绩数据。
(2)在DEGUG 环境输入程序,数值不加后缀H,默认为16进数,
例如楼主程序中的 CMP AL,60,其中60默认为16进制数,即96D,
导致统计结果错误。
我修改的程序及运行结果如以下截图所示,供参考:
:对于给定字符串的每一个字符,检查它是否是数字或大写字母,是则作相应处理,不是则继续读下一个.由此可以看出字符串什么时候结束得有限定条件,可以将字符串长度保存在寄存器或存储器中,也可设字符串以特定字符结束,通常以0结束.为了不和别人重复,设长度保存在前面的单元中.DATAS SEGMENT
STRLEN DB 6
STR DB "38A4CE"
DATAS ENDS
编程时进行
1 设指针指向第一个字符,CX为循环次数
2 读当前指向字符
3 是数字么,是则替换为#
4 是大写字母么,是则改为小写
4 指针加1
5 LOOP 第2步
是数字或是大写字母可用函数表示
以下附代码:
DATAS SEGMENT
STRLEN DW 6
STR DB "38A4CE",13,10,'$'
DATAS ENDS
STACKS SEGMENT
DB 100 DUP (0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,OFFSET STR
MOV AH,9
INT 21H显示修改前的字符串
MOV CX,[STRLEN]字符串长度值送CX控制循环次数
MOV SI,OFFSET STRSI指向第一个字符
ABC:MOV AL,BYTE PTR [SI]读当前指向字符
CALL IS0_9是数字么?
JC NEXT1
MOV BYTE PTR [SI],'#'CF=0表示是0-9
JMP AG
NEXT1:CALL ISA_Z是大写字母么?
JC AG
ADD BYTE PTR [SI],20HCF=0表示是A-Z
AG: INC SI
LOOP ABC
MOV AH,9
MOV DX,OFFSET STR
INT 21H显示修改后的字符串
MOV AH,4CH
INT 21H
入口参数:AL为待比较字符
出口参数:如是0-9则CF=0,否则为1
IS0_9:
CMP AL,'0'
JB NOO
CMP AL,'9'
JA NOO
CLC
RET
NOO:STC
RET
入口参数:AL为待比较字符
出口参数:如是A-F则CF=0,否则为1
ISA_Z:
CMP AL,'A'
JB NOO1
CMP AL,'Z'
JA NOO1
CLC
RET
NOO1:STC
RET
CODES ENDS
END START
微机原理与接口技术LOOP NEXT意思是需要循环执行NEXT,直到中断程序的远返回。
采用查询方式,参考电路图编制程序,编写IRQ3和IRQ10的中断嵌套程序,每按一次单脉冲进行一次中断,屏幕上显示相应的中断请求号“IRQ3”或“IRQ10”。
进行IRQ10或者IRQ3中断 *** 作,在屏幕显示中断信息时,按下另一个脉冲按钮,进行中断,屏幕上中断信息会被打断,进而显示另一个中断类型的中断信息。
三态缓冲器是变化的值,不具有保持功能,适合加载到不断变化的总线上。而数据锁存器可以提供稳定的输出。
LOOP NEXT的原理:
I/O接口可以反映接口的状态,传输数据以及控制读写。CPU对外设的访问实际上是对I/O接口电路的端口访问,不同的端口可以是同一I/O地址(一个输入输出共用一个I/O地址)。
全地址译码,就是通过LS138把每个都选出来,不会出现遗漏,但是部分地址译码可能会出现地址重叠的情况,但是占用空间小。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)