问题情况:
在编译连接后运行时,dos控制台会出现“卡死”状态
却发现使用
MOV [DI],AL
INC DI
代替STOSB是可以的,并且LODS指令也是可正常运行的
问题所在:
STOSB
该指令为单字符输出指令,调用该指令后,可以将累加器AL中的值传递到当前ES段的DI地址处,并且根据DF的值来影响DI的值,如果DF为0,则调用该指令后,DI自增1。
解决:
在
START:
MOV AX,DATAS
MOV DS,AX
后加上一句 MOV ES, AX
附码:
统计字符串长度,大写字母个数,复制此字串到buffer内存
DATAS SEGMENT
STRING DB '123abCD$',0DH
ENDL DB 0AH,'$';换行符
BUFFER DB 256 DUP(0)
SUM DB 00H,0AH,'$';字符总数
CAPITAL DB 00H,0AH,'$';大写字母数
DATAS ENDS
STACKS SEGMENT STACK
DB 200 DUP(0)
STACKs ENDS
CODES SEGMENT
ASSUME DS:DATAS,SS:STACKS,CS:CODES
PRINTS MACRO STR;打印字符串
LEA DX,STR
mov AH,09H
INT 21H
ENDM
START:
MOV AX,DATAS
MOV DS,AX
MOV ES, AX
;------------
LEA SI,STRING
LEA DI,BUFFER
LOP: LODSB
CMP AL,0DH
JZ FINISH
CMP AL,41H ;大字母
JB NEXT ;AL<'A'
CMP AL,5AH
JA NEXT ;AL>'Z'
INC CAPITAL ;CAP++
NEXT: INC SUM ;SUM++
; MOV [DI],AL
; INC DI
STOSB;此语句无法正常运行,使用上两句代替
JMP LOP
;------------
FINISH:
ADD SUM,30H ;转ascii显示(sum<10)
ADD CAPITAL,30H ;转ascii显示(cap<10)
PRINTS SUM
PRINTS CAPITAL
PRINTS STRING
PRINTS ENDL
PRINTS BUFFER
CALL STOP;结束
STOP PROC
MOV AH,4CH
INT 21H
STOP ENDP
CODES ENDS
END START