为什么直接运行程序和用DEBUG单步执行的结果不一样(附代码)

时间:2021-08-06 23:04:28
;接受从键盘输入的字符串放到自定义缓冲区中,并统计小写字母个数,用2位十进制显示出来,
;用DEBUG单步执行时结果是正确的`直接运行程序无论输入什么字符串显示的是某一个固定的值
DATA SEGMENT
BUF   DB 50
              DB ?
              DB 50 DUP(?)
DATA  ENDS
CODE SEGMENT
           ASSUME  CS: CODE, DS: DATA
START:  MOV AX, DATA
           MOV DS, AX
                MOV CX,50
                 MOV AH,10
              INT 21H
           MOV DX,0
              MOV BX,2
S:  MOV Al,[BX]
CMP Al,0
JZ NODONE  
CMP Al,'a'
   JB DONE 
   CMP Al,'z'
    JA DONE
     INC DL
  DONE: INC BX
         LOOP S
NODONE:
PUSH DX
MOV AH,2
MOV DL,0DH
INT 21H
MOV AH,2
MOV DL,0AH
INT 21H
POP DX
MOV AX,DX
MOV AH,0
MOV BL,10
DIV BL
MOV CX,2
MM:MOV DL,AL
CMP DL,9
JNA KFC
ADD DL,7
KFC:ADD DL,30H
PUSH AX
MOV AH,2
INT 21H
POP AX
MOV AL,AH
LOOP MM
MOV AX,4C00H
    INT 21H
CODE ENDS
END START

11 个解决方案

#1


没分就每人肯帮忙吗`我是新手刚注册的`

#2


起码也该把怎么个不一样帖出来罢


可以试下如此这般,输出字符前重新给ds赋值

#3


如果直接运行的话``假如你输入的是AAAAaaaa1234正常应该是输出04但是输出的是00(无论输入什么字符串都是这个结果),用DEBUG单步执行的话输出结果是对的。而且输出的那个00,可能源程序里某个寄存器换一下(在逻辑上不影响程序功能的情况下,比如AX换成DX,)那个输出的值就变成另外一个固定值,而不是00了。

#4


不知道,帮顶!!

#5


终于找到了,AH=0Ah,DS:DX=缓冲区首地址,你的DX没有赋值
DATA SEGMENT 
BUF  DB 50 
     DB ? 
     DB 50 DUP(0) 
DATA ENDS 
SSEG SEGMENT STACK
     DW 10H DUP(0)
SSEG ENDS
CODE SEGMENT 'CODE'
       ASSUME  CS:CODE,DS:DATA,SS:SSEG
START: MOV AX, DATA 
       MOV DS, AX 
       MOV CX,50 
       MOV AH,0Ah
       LEA DX,BUF ;;;
       INT 21H 
       MOV DX,0 
;       MOV BX,2 
       LEA BX,BUF
       ADD BX,2
S:     MOV Al,DS:[BX] ;
       CMP Al,0 
       JZ NODONE  
       CMP Al,'a' 
       JB DONE 
       CMP Al,'z' 
       JA DONE 
       INC DL 
DONE:  INC BX 
       LOOP S 
NODONE: 
       PUSH DX 
       MOV AH,2 
       MOV DL,0DH 
       INT 21H 
       MOV AH,2 
       MOV DL,0AH 
       INT 21H 
       POP DX 
       MOV AX,DX 
       MOV AH,0 
       MOV BL,10 
       DIV BL 
       MOV CX,2 
MM:    MOV DL,AL 
       CMP DL,9 
       JNA KFC 
       ADD DL,7 
KFC:   ADD DL,30H 
       PUSH AX 
       MOV AH,2 
       INT 21H 
       POP AX 
       MOV AL,AH 
       LOOP MM 
       MOV AX,4C00H 
       INT 21H 
CODE ENDS 
END START

#6


 谢谢   xtdumpling 沉木,看来分要给你了,明天晚上再结贴,怪我看指令的时候没看清楚
但是原来的代码单步执行的时候结果却是对的,难道用DEBUG单步执行时会自动给DX赋值?

#7


debug加载程序时,dx::cx表示程序长度,这段程序显然小于64KB,所以dx是0,恰好是BUF的偏移量。

#8


ding

#9


ding

#10


帮顶

#11


帮顶

#1


没分就每人肯帮忙吗`我是新手刚注册的`

#2


起码也该把怎么个不一样帖出来罢


可以试下如此这般,输出字符前重新给ds赋值

#3


如果直接运行的话``假如你输入的是AAAAaaaa1234正常应该是输出04但是输出的是00(无论输入什么字符串都是这个结果),用DEBUG单步执行的话输出结果是对的。而且输出的那个00,可能源程序里某个寄存器换一下(在逻辑上不影响程序功能的情况下,比如AX换成DX,)那个输出的值就变成另外一个固定值,而不是00了。

#4


不知道,帮顶!!

#5


终于找到了,AH=0Ah,DS:DX=缓冲区首地址,你的DX没有赋值
DATA SEGMENT 
BUF  DB 50 
     DB ? 
     DB 50 DUP(0) 
DATA ENDS 
SSEG SEGMENT STACK
     DW 10H DUP(0)
SSEG ENDS
CODE SEGMENT 'CODE'
       ASSUME  CS:CODE,DS:DATA,SS:SSEG
START: MOV AX, DATA 
       MOV DS, AX 
       MOV CX,50 
       MOV AH,0Ah
       LEA DX,BUF ;;;
       INT 21H 
       MOV DX,0 
;       MOV BX,2 
       LEA BX,BUF
       ADD BX,2
S:     MOV Al,DS:[BX] ;
       CMP Al,0 
       JZ NODONE  
       CMP Al,'a' 
       JB DONE 
       CMP Al,'z' 
       JA DONE 
       INC DL 
DONE:  INC BX 
       LOOP S 
NODONE: 
       PUSH DX 
       MOV AH,2 
       MOV DL,0DH 
       INT 21H 
       MOV AH,2 
       MOV DL,0AH 
       INT 21H 
       POP DX 
       MOV AX,DX 
       MOV AH,0 
       MOV BL,10 
       DIV BL 
       MOV CX,2 
MM:    MOV DL,AL 
       CMP DL,9 
       JNA KFC 
       ADD DL,7 
KFC:   ADD DL,30H 
       PUSH AX 
       MOV AH,2 
       INT 21H 
       POP AX 
       MOV AL,AH 
       LOOP MM 
       MOV AX,4C00H 
       INT 21H 
CODE ENDS 
END START

#6


 谢谢   xtdumpling 沉木,看来分要给你了,明天晚上再结贴,怪我看指令的时候没看清楚
但是原来的代码单步执行的时候结果却是对的,难道用DEBUG单步执行时会自动给DX赋值?

#7


debug加载程序时,dx::cx表示程序长度,这段程序显然小于64KB,所以dx是0,恰好是BUF的偏移量。

#8


ding

#9


ding

#10


帮顶

#11


帮顶