汇编stos所遇问题

问题情况:
在编译连接后运行时,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

猜你喜欢

转载自blog.csdn.net/qq_37299249/article/details/78336181
今日推荐