ASSUME CS:CODE
START: JMP BBB
MSG1 DB 'please input: $'
STR0 DB 255
STR1 DB ?
STR2 DB 255 DUP('$')
ALPHA0 DB 13,10
ALPHA DB 255 DUP('$')
NUMBER0 DB 13,10
NUMBER DB 255 DUP('$')
BBB: PUSH CS
POP DS
PUSH CS
POP ES
MOV AH,9
LEA DX,MSG1
INT 21H
MOV AH,10
LEA DX,STR0
INT 21H
MOV CL,STR1
MOV CH,0
LEA SI,STR2
LEA BX,ALPHA
LEA DI,NUMBER
CLD
@0:
LODSB
CMP AL,'0'
JB @10
CMP AL,'9'
JA @1
STOSB
JMP @10
@1:
CMP AL,'A'
JB @10
CMP AL,'Z'
JA @2
MOV [BX],AL
INC BX
JMP @10
@2:
CMP AL,'a'
JB @10
CMP AL,'z'
JA @10
MOV [BX],AL
INC BX
@10:
LOOP @0
MOV AH,9
LEA DX,ALPHA0
INT 21H
LEA DX,NUMBER0
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
你的程序有两个错误1。调用mov
ah,0ah
int21h
后dx指向的是缓冲区的开始,不是结尾,因此你加$的位置应该是:缓冲区开始地址+2+输入字节数
2。显示时,dx应该指向字符串的开始,而不是缓冲区的开始,两者差两个字节。
调试好的程序如下:
DATAS
SEGMENT
buffer
db
80
db
0
db
80
dup
(0)此处输入数据段代码
DATAS
ENDS
STACKS
SEGMENT
此处输入堆栈段代码
STACKS
ENDS
CODES
SEGMENT
ASSUME
CS:CODES,DS:DATAS,SS:STACKS
START:
mov
ah,0ah
mov
dx,seg
buffer
mov
ds,dx
lea
dx,buffer
int
21h
inc
dx
mov
si,dx
mov
cl,byte
ptr
[si]
输入的字节数
mov
ch,0
add
si,2
add
si,cx
字符串结尾
mov
byte
ptr
[si],'$'
push
ds
pop
es
mov
di,offset
buffer
mov
ax,0a0dh
回车换行
stosw
把缓冲区的开始两个字节填充成回车换行,是为了让结果和输入分别在两行上显示
mov
ah,09h
lea
dx,buffer
int
21h
MOV
AH,4CH
INT
21H
CODES
ENDS
END
START
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)