DATA
STR
SEGMENT
DB ‘It’’s a fine day, isn’’t it?’,0DH,‘$’
$-STR-2 0
;串长中不包括结束符和“$”符号 ;置统计结果初值为0
;依题意以0DH为结束符。加上“$”便于显示整个字符串 COUNT EQU NUM STR1 DATA STACK
STACK CODE
DB ENDS
SEGMENT PARA STACK‘STACK’ DB ENDS SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATA
AX,DATA DS,AX ES,AX DI,STR AL,20H CX,COUNT SKIP NUM NEXT DX,STR AH,09H 21H DL,0AH AH,2 21H DX,STR1 AH,9 21H AL,NUM AH,0 BL,10 BL AX
;AX / BL ;入栈保护
;将十位数转换为ASCII码 ;送CRT显示
;AX中为待转换16进制数
;显示另一个字符串
;显示换行符,以便显示另一字串
;显示原字符串
;是空格,跳过下一句 ;非空格字符,NUM加1
;关键字符(空格)
;有SCAS指令,需用ES
MOV MOV LEA CLD MOV MOV JE
100 DUP(?)
DB ‘The number of non-space charactors is’,‘$’
START: MOV
NEXT: SCASB
INC LOOP LEA MOV INT MOV MOV INT LEA MOV INT MOV MOV MOV DIV PUSH OR MOV MOV INT POP
SKIP:
;将16进制的统计结果转换为十进制数,再转换为两个ASCII码输出
;商(十位)在AL中,余数(个位)在AH中,均为未组合BCD码
AL,30H DL,AL AH,2 21H AX
;恢复除法运算的结果
ADD MOV MOV INT MOV INT ENDS
AH,30H DL,AH AH,2 21H AH,4CH 21H
;将个位数转换为ASCII码 ;显示
;完成,返回DOS
CODE
END START
简析:
本例的关键在于统计结果的显示。统计完成后,结果单元中是一个16进制数。为符合一般习惯,应在CRT上显示十进制数,因此首先用除法将十位、个位分离开,再将其分别转换为ASCII码输出。由于除数是10,故相除之后得到的商(十位数)和余数(个位数)必在0~9范围内,即未组合BCD码,所以很容易转换为ASCII码。
编程时注意:DIV指令执行后结果在AX中,而DOS功能调用必须用AH为调用号,故应保护AX的内容。另外,原题已告知字串的结束符是0DH,故亦可通过检索结束符(0DH)的方式控制循环。
另外请注意:数据段中定义的STR串中出现的单引号前必须用另一个单引号转义,如“ ’s ”应为“ ’’s ”。 16. 数据段中有1个由小写英文字母组成的字符串,编程将各小写字母转换成对应的大写字母,并存放起来。
答:一种可能的程序如下实现:
DSEG
STR1 CHAR STR2 DSEG SSEG
SSEG CSEG
TRAN
SEGMENT
DB ‘djdwpneasmv’,‘$’
$-STR1-1 0AH,0DH
COUNT DUP(?),‘$’
DB DB ENDS
SEGMENT PARA STACK‘SSEG’ DW ENDS SEGMENT
ASSUME CS:CSEG,SS:SSEG,DS:DSEG,ES:DSEG PROC PUSH SUB PUSH MOV MOV MOV LEA MOV INT CLD
FAR DS AX,AX AX AX,DSEG DS,AX ES,AX DX,STR1 AH,9 21H
;自动增量
;有STOS指令,需用ES ;显示小写字母串
100 DUP(?)
COUNT EQU
LEA LEA MOV SUB ADD STOSB LOOP MOV MOV INT RET ENDP ENDS
SI,STR1 DI,STR2
;SI指向小写字母串 ;DI指向结果存放处 ;转换次数
;取1个小写字母至AL中 ;转换为大写字母 ;存放
;换行显示大写字母串
CX,COUNT AL,‘a’ AL,‘A’
NEXT
NEXT: LODSB
DX,OFFSET CHAR AH,9 21H
TRAN CSEG
END TRAN