;用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赋值
可以试下如此这般,输出字符前重新给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赋值?
但是原来的代码单步执行的时候结果却是对的,难道用DEBUG单步执行时会自动给DX赋值?
#7
debug加载程序时,dx::cx表示程序长度,这段程序显然小于64KB,所以dx是0,恰好是BUF的偏移量。
#8
ding
#9
ding
#10
帮顶
#11
帮顶
#1
没分就每人肯帮忙吗`我是新手刚注册的`
#2
起码也该把怎么个不一样帖出来罢
可以试下如此这般,输出字符前重新给ds赋值
可以试下如此这般,输出字符前重新给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赋值?
但是原来的代码单步执行的时候结果却是对的,难道用DEBUG单步执行时会自动给DX赋值?
#7
debug加载程序时,dx::cx表示程序长度,这段程序显然小于64KB,所以dx是0,恰好是BUF的偏移量。
#8
ding
#9
ding
#10
帮顶
#11
帮顶