这题不复杂啊
解题思路:对于给定字符串的每一个字符,检查它是否是数字或大写字母,是则作相应处理,不是则继续读下一个.由此可以看出字符串什么时候结束得有限定条件,可以将字符串长度保存在寄存器或存储器中,也可设字符串以特定字符结束,通常以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 STR;SI指向第一个字符
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],20H;CF=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
开始:
10:设一指针,指向第一个字符
15:指针指向结束标志吗?是:转60。
20:把指针指向的字符传送到AX
30:AX中是数字吗?
是:把‘#’送到指针指向的空间。指针指向下一个,转15
40:AX中是大字字符吗?
是:AX+34送到指针指向空间。
50:指针指向下一个,转15
60:结束
AX中是数字吗?
110:AX-‘0’至AX。
结果为负吗?是:ax中是数字==假,转150
120:AX-10
结果为负吗?否:AX中是数字==假,转150
130
AX中是数字==真
150
判断结束。
请在debug里测试
DATAS SEGMENT
str db "38A4CE",0
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
lea bx,str-1
@1: inc bx
cmp byte ptr[bx],0
jz @3
cmp byte ptr[bx],"0"
jl @1
cmp byte ptr[bx],"9"
jg @2
mov byte ptr[bx],"#"
jmp @1
@2: cmp byte ptr[bx],"Z"
jg @1
cmp byte ptr[bx],"A"
jl @1
add byte ptr[bx],32
jmp @1
@3: lea bx,str ;指向 str,可以通过 dds:[bx]看到它的改变
int 3h
;MOV AH,4CH
;INT 21H
CODES ENDS
END START
(1)~(7),
7条指令,是按顺序连续执行?
还是各不相干?
一头雾水........(虽然咱是什么屁屁都不懂....)